Ich nehme an, Sie haben NumPy installiert (zumindest Ihre ursprüngliche Frage vorgeschlagen), so werde ich einen Weg vorstellen, wie Sie können erhalten Ihr Ergebnis numpy-arrays
auf sehr effiziente Art und Weise unter Verwendung von (ohne Listen Comprehensions und explizite Iterationen):
> import numpy as np
> s = 10
> l = np.arange(1, 100) * 2 + s * 2 # Arrange produces an array. Syntax is like "range".
> print(l)
array([ 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72,
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,
100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124,
126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150,
152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176,
178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202,
204, 206, 208, 210, 212, 214, 216, 218])
ich verwendet, um die Tatsache, dass mathematische Operationen auf NumPy Arrays alle Elemente beeinflussen. Deshalb ist es so einfach, den Betrieb zu schreiben: np.arange(1, 100) * 2
, weil es jedes Element mit 2
und numpy.arange
multipliziert wird eine Möglichkeit, um ein Array zu erstellen, alle Zahlen zwischen gegebenen start
und stop
mit einem optionalen step
(ebenso wie die python range
) enthält.
Mit NumPy wäre es keine gute Wahl zu append
Einzelwerte (weil dies das gesamte Array neu erstellt und nicht nur Werte anfügt). In den meisten Fällen ist es am besten, ein Array mit der endgültigen Größe und Form zu erstellen und direkt darauf zu arbeiten. Natürlich können Sie concatenate
oder append
verschiedene NumPy-Arrays, aber wie erwähnt es immer ein völlig neues Array erstellt und ist daher nicht sehr effizient (wenn regelmäßig verwendet).
So, jetzt ein paar Beobachtungen auf Ihrem ersten Versuch, und warum es nicht funktioniert hat: Ihre Funktion erstellt eine Menge Zahlen, aber er überschreibt sie in jeder Schleife und liefert nur die letzten:
def func(s):
for i in range(1, 100):
t = i
p = t * 2 + s * 2
# Next iteration of the loop just overwrites p
# Returns only the last p
return p
Man könnte dies einen Generator (mit yield
statt return
) machen, aber das ist wahrscheinlich übertrieben hier, ich werde es zeigen doch :-)
l = []
def func(s):
for i in range(1, 100):
p = i * 2 + s * 2
yield p
l.append(list(func(10))) # Need to convert the generator to a list here.
# In this case a simple "l = list(func(10))" would be easier if you don't need to append.
@AlbertoBonsanto: Das Problem mit der Fixierung Eindruck sollte nun offensichtlich sein. War das 'return' wirklich ein Teil der 'for'-Schleife in der Funktion? Und warum haben Sie den Funktionskörper nicht eingerückt? –
@MartijnPieters Es tut mir leid, dass ich im richtigen Moment geschnitten habe! Ich habe nicht vorgetäuscht, deins zu überschreiben! –
Betrachten Sie das? 'func = Lambda s: [(t * 2) + s * 2 für t im Bereich (1, 100)]' – Signal