2014-07-18 10 views
5

उलटी गिनती वहाँ थोड़ी देर के पाश कि हमेशा के लिए चलाता है, तो तर्क 0 है या सिर्फ अगर तर्क एक मनमाना n बड़ा 0 इस से है n बार चलाता है लिखने के लिए एक बेहतर समाधान है:जबकि पाश, हमेशा के लिए चलाने के लिए या

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 

आप शायद में लैम्ब्डा गठजोड़ कर सकते हैं:

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

लेकिन फिर आप अभी भी एक्स उलटी गिनती, जब तक आप उससे पहले अगर एक डाल होगा।

+1

'लैम्ब्डा एक्स: यह सच है, तो x> 0 बाकी FALSE' उर्फ' लैम्ब्डा एक्स: एक्स> 0' –

उत्तर

6

कैसे के बारे में:

n = options.num 

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

अनिवार्य रूप से हम एक अनंत लूप अगर x == 0 है या हम केवल n बार चलाते हैं।

+2

कि जीता काम नहीं करता यदि n है> 0 इसे 0 पर पहुंचने पर रोकना आवश्यक है। –

+0

मैंने सोचा कि उसने स्थिति में दो बार परिवर्तनीय एन का उपयोग किया था। आप सही हैं, यह काम करता है। –

2

यहाँ इस

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

प्रयास करें डेमो है:

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

मुझे लगता है कि यह काफी अर्थपूर्ण है:

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

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

+1 हां, यह वही है जो मैं बस लिख रहा था। ;-) लेकिन इसे 'x = options.num या float (' inf ') में बदलने के बारे में कैसे? यह भी देखें [यहां] (http://stackoverflow.com/questions/1628026/python-infinity-any-caveats) –

+0

@tobias_k मुझे लगता है कि मुझे यह पसंद है। एक प्लेसहोल्डर के रूप में वैध मान n = 0 का उपयोग करना, मेरी राय में, एक गलत विकल्प है जो मुझे कोड में स्पष्ट रूप से बताया जाना चाहिए। –

0

कोड की न्यूनतम लंबाई के बजाय पठनीयता पर ध्यान केंद्रित पर विचार करें। तो पाश की एक संस्था मामूली बात है मैं

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

लिखते थे और अगर शरीर काफी बड़ा है मैं एक समारोह

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

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

निकालने हैं उपयोग itertools.count

चाल आसान है:

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") 

कोड इटेटरेटर पर लूपिंग चलाता है। 0 से अधिक संख्या के मामले में, यह इटरेटर xrange, का उपयोग करता है जो x संख्याएं उत्पन्न करता है।

x होने के मामले में, हम countitertools से इटरेटर को संख्याओं की संख्या को पुनः प्राप्त करने में सक्षम हैं।

यह भी छोटा किया जा सकता है (लेकिन मैं readibility के लिए मूल संस्करण को खुला छोड़ देते):

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 अच्छा। शायद विकल्पों के साथ 'loops = xrange (options.num) के साथ छोटा हो सकता है। कोई और गिनती नहीं है() ' –

+0

@tobias_k हां, मेरे संपादक में भी इसी तरह का निर्माण था, लेकिन अधिक पढ़ने योग्य तरीके से जाने का फैसला किया।जैसा कि आपने प्रस्तावित किया है, लघु संस्करण जोड़ा गया है (अलग-अलग लाइन पर 'x = options.num' छोड़कर) –

संबंधित मुद्दे