2016-03-19 3 views
6

Ich möchte nur die for Schleife für die t Variable in meiner Funktion verwenden:Wie kann ich eine 'for' -Schleife für nur eine Variable in einer Funktion verwenden, die von zwei Variablen abhängt?

l = [] 

def func(s): 
    for i in range(1, 100): 
     t = i 
     p = t * 2 + s * 2 
    return p 

l.append(func(10)) 

print l 

I der Wert von t wollen von 1 bis 99 gehen und eine Liste aller Wert drucken, aber ich habe immer am Ende bekommen l = [218].

+2

@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? –

+0

@MartijnPieters Es tut mir leid, dass ich im richtigen Moment geschnitten habe! Ich habe nicht vorgetäuscht, deins zu überschreiben! –

+0

Betrachten Sie das? 'func = Lambda s: [(t * 2) + s * 2 für t im Bereich (1, 100)]' – Signal

Antwort

41

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. 
+0

Bei Verwendung des Generators 'yield' werden die Ergebnisse als 1 Element in einer Liste ausgegeben. Wie kann ich "def func (s)" drucken, damit ich es gegen eine andere Liste plotten kann? –

+0

@ p.kumar Wie benutzt man den Generator? Zumindest scheint das mit 'list (func (s))' auf meinem Computer gut zu funktionieren, das Ergebnis ist eine Liste mit 99 Elementen. Über das "Plotten", vielleicht werfen Sie einen Blick auf ['matplotlib.pyplot.plot'] (http://matplotlib.org/api/pyplot_api.html). – MSeifert

4

Sie berechnen einen Wert mehrere Male (, während Sie es nicht an eine Liste anhängen), dann den endgültigen Wert an eine Liste anfügen.

Stattdessen möchten wir an die Liste anfügen, wie wir gehen.

def func(s): 
    l = [] 
    for i in range(1, 100): 
     l.append(i*2+s*2) 
    return l 

Sie können dies auch eine list comprehension mit in einer Zeile tun, wenn Sie für Kürze fahren.

func = lambda s: [(t*2)+s*2 for t in range(1, 100)] 

Output:

[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] 

Notiere die 218 am Ende. Wie ich schon sagte, Sie haben nur den letzten Wert zurückgegeben, also Ihr Programm ausgegeben 218.

+4

Auch wenn Sie auf unnötig One-Lining bestehen, Am besten ist es mit 'def', nicht' lambda'; 'lambda' bedeutet, dass die Funktion ihren eigenen Namen nicht kennt, der einfache Dinge wie Beizen (implizit in Sachen wie' multiprocessing' oder 'concurrent.futures' oder sogar' copy.deepcopy' in einigen Fällen) bricht. 'def func (s): return [(t * 2) + s * 2 für t im Bereich (1, 100)]' ist genauso einseitig, ähnlich knapp und funktional (im englischen Sinne nicht das Sprachdesign Sinn). – ShadowRanger

0

Da es ar Das ist eine Menge Lösung. Mit verschiedenen Bibliotheken oder Generatoren. Sie hatten nur ein Einrückungsproblem in Ihrem Code und es war bereit zu fliegen. Hier ist die kleine Änderung in Ihrem Code.

#In Python3 
def func(s): 
    for i in range(1,100): 
     p = i * 2 + s * 2 
     l.append(p) 
    return l 
l =[] 
print(func(10)) 
Verwandte Themen