2014-07-18 10 views
5

Czy istnieje lepsze rozwiązanie, aby napisać pętli while, który działa zawsze, jeśli argument jest 0 lub po prostu działa n razy, jeśli argument jest dowolna n większa 0 niż to:podczas pętli, wiecznie uciekać lub odliczać

x = options.num # this is the argument (read by Optparse) 
if x == 0: 
    check = lambda x: True 
else: 
    check = lambda x: True if x > 0 else False 
while check(x): 
    print("Hello World") 
    x -= 1 

prawdopodobnie można połączyć lambda do:

check = lambda x: True if x > 0 or options.num == 0 else False 

ale wtedy trzeba jeszcze odliczać X, chyba że można umieścić jeśli wcześniej.

+1

'lambda x: Prawda, jeśli x> 0 indziej FALSE aka' lambda x: x> 0' –

Odpowiedz

6

Jak o:

n = options.num 

while (options.num == 0) or (n > 0): 
    print("Hello World") 
    n -= 1 

Zasadniczo mamy nieskończoną pętlę jeśli x == 0 lub my tylko uruchomić n razy.

+2

który wygrał nie działa. Jeśli n jest> 0, to musi się zatrzymać, gdy osiągnie 0. –

+0

Pomyślałem, że użył zmiennej n dwa razy w tym stanie. Masz rację, to działa. –

2

Spróbuj

def while_function(n): 
    if n > 0: n += 1 
    while n-1: 
     print "something" 
     n -= 1 

Oto demo:

>>> while_function(1) 
something 
>>> while_function(2) 
something 
something 
>>> while_function(0) 
something 
something 
. 
. 
. 
4

myślę, że to jest dość wyrazisty:

if x==0: 
    x = float("inf") # user says 0 but means infinity 

while x>0: 
    print "something" 
    x -= 1 
+2

+1 Tak, właśnie to właśnie zapisałem. ;-) Ale jak zmienić to na 'x = options.num lub float ('inf')'? Zobacz także [tutaj] (http://stackoverflow.com/questions/1628026/python-infinity-any-caveats) –

+0

@tobias_k Myślę, że wolę jak teraz. Używanie prawidłowej wartości n = 0 jako symbolu zastępczego jest, moim zdaniem, złym wyborem, który muszę wyraźnie zaznaczyć w kodzie. –

0

Rozważmy koncentrując się na czytelności zamiast minimalnej długości kodu. Jeśli ciało pętli jest trywialne chciałbym napisać

if x: 
    for i in xrange(x): 
    print('Hello, World!') 
else: 
    while True: 
    print('Hello, World!') 

A jeśli ciało jest na tyle duże, by wyodrębnić funkcję

def body(): 
    print('Hello, World!') 

if x: 
    for i in xrange(x): 
    body() 
else: 
    while True: 
    body() 
2

Korzystając itertools.count

Sztuczka jest prosta:

from itertools import count 
x = options.num # this is the argument (read by Optparse) 
if x: 
    loops = xrange(x) 
else: 
    loops = count() 

for i in loops: 
    print("Hello World") 

Kod wykonuje pętlę nad iteratorem. W przypadku liczby innej niż 0 używa iteratora xrange, , co daje numery x.

W przypadku, gdy x wynosi 0, pobieramy count iterator z itertools, który jest w stanie odzyskać nieskończoną liczbę .

Może być nawet skrócić (ale mogę zostawić oryginalną wersję up dla czytelności):

from itertools import count 
x = options.num # this is the argument (read by Optparse) 

for i in xrange(x) if x else count(): 
    print("Hello World") 
+0

+1 Nicea. Może krótszy z 'loops = xrange (options.num), jeśli options.num else count()' –

+0

@tobias_k Tak, miałem podobny konstrukt w moim edytorze, ale zdecydowałem się przejść w bardziej czytelny sposób.Krótki wariant dodany zgodnie z propozycją (z pozostawieniem 'x = options.num' w oddzielnym wierszu) –

Powiązane problemy