Suppongo tu abbia installato NumPy (almeno la tua domanda originale lo ha suggerito), quindi ti presenterò un modo come puoi ottenere il risultato utilizzando numpy-arrays
in un modo molto efficiente (senza alcuna lista-comprensioni e le iterazioni espliciti):
> 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])
ho usato il fatto che le operazioni matematiche su array NumPy influiscono su tutti gli elementi. Perciò è tanto facile scrivere l'operazione: np.arange(1, 100) * 2
, perché moltiplica ogni elemento con 2
e numpy.arange
è la possibilità di creare una matrice contenente tutti i numeri tra un determinato start
e stop
con opzionale step
(proprio come il python range
).
Con NumPy non sarebbe una buona scelta per i valori singoli append
(perché questo ricrea l'intero array e non solo i valori appends). Nella maggior parte dei casi è meglio creare un array con le dimensioni e la forma finali e operare direttamente su di esso. Naturalmente puoi ordinare concatenate
o append
diversi array NumPy, ma come detto crea sempre un array completamente nuovo e quindi non è molto efficiente (se usato regolarmente).
Così ora un paio di osservazioni sul tentativo iniziale e perché non ha funzionato: La vostra funzione create un sacco di numeri, ma li sovrascrive in ogni ciclo e restituisce solo l'ultimo:
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
si potrebbe fare di questo un generatore (con yield
invece di return
), ma questo è probabilmente eccessivo qui, ti faccio vedere che comunque :-)
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: il problema con l'indentazione di fissaggio dovrebbe essere ora evidente. Il 'return' era davvero parte del ciclo' for' nella funzione? E perché non hai indentato il corpo della funzione? –
@MartijnPieters Mi dispiace che stavo modificando nel momento esatto! Non ho fatto finta di sovrascrivere il tuo! –
Considera questo? 'func = lambda s: [(t * 2) + s * 2 per t in range (1, 100)]' – Signal