2012-07-26 10 views
5

w następujących przypadkach:muszą zrozumieć Python generator obiektu

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' 

Rozumiem, że to, co jest w środku każdy (...) jest to obiekt generatora. Czego nie rozumiem, to brak nawiasów - jeśli nawiasy należą do funkcji any(), czy nie powinien istnieć inny zestaw nawiasów wokół wyrażenia generatora?

Dzięki.

Odpowiedz

12

Nawias można pominąć, gdy jest używany w wywołaniach funkcji z tylko jednym argumentem, konkretnie pozwala na to generator expression syntax.

Nawiasy można pominąć przy połączeniach za pomocą tylko jednego argumentu. Szczegółowe informacje znajdują się w sekcji Calls.

+2

Nie sądzę, że wkleiłeś link, który chciałeś. – interjay

+0

@interjay: dobry połów, awaria c & p. Czy ktoś jeszcze może cieszyć się setlistami norweskich koncertów festiwalowych? :-P Poprawione. –

+0

Dziękuję i dziękuję wszystkim, którzy odpowiedzieli. – Sabuncu

2

Można pominąć nawiasy wyrażenia generatora, jeśli wyrażenie jest już jedyną rzeczą w nawiasach.

Z documentation:

Nawiasy mogą być pominięte na rozmowach z tylko jednym argumentem.

2

Nie, dodatkowe nawiasy nie są potrzebne, ani w rzeczywistości są nawiasy zawsze konieczne dla „Boolean wyrażenie” testowanej, zobacz te dwa proste przykłady:

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 

Co masz JEST Wywołanie funkcji z pojedynczym argumentem (wyrażenie generatora), więc nie są potrzebne parens. Aby uzyskać więcej informacji, patrz generator expressions docs.

+0

tak naprawdę nie odpowiada na pytanie. –

+1

@KarolyHorvath Better? – Levon

1

Dla wywołania funkcji za pomocą jednego argumentu (to wyrażenie generator), nie są one wymagane na tym docs

Nawiasy mogą być pominięte na rozmowy tylko z jednym argumentem. Szczegółowe informacje znajdują się w sekcji Połączenia.