2013-02-01 7 views

Odpowiedz

7

Myślę, że pusty iterator jest lepszy, ponieważ iteracja przez nic jest szybsza niż pierwsze sprawdzenie, czy zwrócona wartość nie jest Brak, a następnie iteracja ponad lub nie.

for x in function(): 
    do_something() 

value = function() 
if value is not None: 
    for x in value: 
     do_something() 

Spójrz na to.

Zwykle nie inicjalizujesz atrybutów iter za pomocą None, ale z pustym obiektem iteracji.

self.list_of_users = [] 

nie

self.list_of_users = None 
+0

_ "iteracja nad niczym jest szybsza" _ '[potrzebne źródło]'. Tak, to _terser, _ ale bez niektórych wyników 'timeit', nie jestem przekonany, że jest _faster._ –

+0

Możesz napisać to jako:' dla elementu w some_func() lub []: pass' lub '[do_something (element) dla elementu w some_func() lub []] '. – espeed

+0

Weź również pod uwagę przypadek, gdy musisz zrobić coś innego, gdy funkcja nie zwraca wyników, musisz najpierw sprawdzić rozmiar iteratora. – espeed

5

powszechnej praktyki, że nauczono do naśladowania jest powrót tego samego typu danych dla wszystkich prawidłowych wartości w domenie wejściowego, jeśli możesz. Ułatwia innym korzystanie z Twojego kodu, a twoja dokumentacja będzie czystsza. W przypadku wartości spoza poprawnej domeny wejściowej należy podnieść wyjątki.

Pusty iterator, a nie Brak, wydaje się być w tym przypadku lepszą praktyką. Wiem, że inne języki programowania lubią zwracać wartość null w tych instancjach, ale nie widzę korzyści, aby to zrobić w scenariuszu, który opisałeś.

+0

Jednym z powodów, dla których byłem w obozie "nie zwracaj pustego iteratora", jest to, że jeśli chcesz zrobić coś dla pustej skrzynki, musisz sprawdzić rozmiar iteratora przez 'if len (wyniki): 'i może to być kosztowne, jeśli iterator jest duży,' 'jeśli wyniki to Brak:' jest tanie, a przez to bardziej elastyczne. – espeed

+1

jeśli x jest iteratorem, "jeśli x" zwróci False, jeśli x jest pusty –

Powiązane problemy