2012-07-26 11 views
5

Im folgenden verstehen:Need Python Generator Objekt

name = 'TODD' 
chars = set('AEIOU') 
for ii in range(-1, int(math.copysign(len(name) + 1, -1)), -1): 
    if any((cc in chars) for cc in name[ii]): 
     print 'Found' 
    else: 
     print 'Not Found' 

Ich verstehe, dass, was drin ist jeder (...) ist ein Generator-Objekt. Was ich nicht verstehe, ist der Mangel an Klammern - wenn die Klammern zur any() Funktion gehören, sollte es nicht einen anderen Satz von Klammern um den Generatorausdruck geben?

Danke.

Antwort

12

Die Klammer kann weggelassen werden, wenn sie in Funktionsaufrufen mit nur einem Argument verwendet wird, das generator expression syntax ausdrücklich dafür erlaubt.

Die Klammern können bei Aufrufen mit nur einem Argument weggelassen werden. Siehe Abschnitt Calls für das Detail.

+2

Ich glaube nicht, dass Sie den Link eingefügt haben, den Sie gemeint haben. – interjay

+0

@interjay: guter Fang, c & p-Fehler. Hat sonst noch jemand Set-Listen norwegischer Festivalkonzerte? :-P Korrigiert. –

+0

Danke, und danke an alle anderen, die geantwortet haben. – Sabuncu

2

Sie können die Klammern eines Generatorausdrucks weglassen, wenn der Ausdruck in Klammern bereits der einzige Ausdruck ist.

Vom documentation:

Die Klammern können mit nur einem Argument auf Anrufe verzichtet werden.

2

Nein, die zusätzlichen Pars nicht benötigt werden, noch in der Tat sind Pars immer notwendig für die „Booleschen Ausdruck“ Sie testen, finden Sie diese beiden einfachen Beispiele:

In [37]: any(i > 10 for i in range(19)) 
Out[37]: True 

In [38]: all(i > 10 for i in range(19)) 
Out[38]: False 

Was Sie haben, ist ein Funktionsaufruf mit einem einzigen Argument (Ihrem Generatorausdruck), so dass keine Parens erforderlich sind. Weitere Informationen finden Sie unter generator expressions docs.

+0

beantwortet nicht wirklich die Frage. –

+1

@KarolyHorvath Besser? – Levon

1

Für Funktion mit nur einem Argument aufruft (dh Generator Ausdruck), werden sie gemäß dem nicht erforderlich docs

Die Klammern können auf Anrufe mit nur einem Argument weggelassen werden. Siehe Abschnitt Aufrufe für das Detail.