2010-05-31 14 views
11

Yani, Python (Ben birçok dilde uygulanabilir düşünüyorum rağmen) içinde, oldukça sık böyle bir şey ile kendimi bulmak:küçük bir kod fazlalık (temiz hissetmez)

the_input = raw_input("what to print?\n") 
while the_input != "quit": 
    print the_input 
    the_input = raw_input("what to print?\n") 

Belki de çok seçici davranıyorum, ama the_input = raw_input("what to print?\n") hattının tekrarlanmasını nasıl istemiyorum. Sürdürülebilirliği ve organizasyonu azaltır. Ancak, sorunu daha da kötüleştirmeden çift koddan kaçınmak için herhangi bir geçici çözüm göremiyorum.

while ((the_input=raw_input("what to print?\n")) != "quit") { 
    print the_input 
} 

Bu değil Pythonic kesinlikle, ve Python hatta AFAIK döngü koşulları dahilinde atama için izin vermez: Bazı dillerde, böyle bir şey yazabiliriz.

Bu geçerli kod

,

while 1: 
    the_input = raw_input("what to print?\n") 
    if the_input == "quit": 
     break 
    print the_input 

fazlalık düzeltir Ama çok haklı ya hissetmez. while 1, bu döngünün sonsuza kadar çalışacağını ima eder; Bir döngü kullanıyorum, ama ona sahte bir durum vermek ve içindeki gerçek olanı koymak.

Çok seçici miyim? Bunu yapmanın daha iyi bir yolu var mı? Belki de bilmediğim bir dil yapısı var mı? soyutlamaların çok düşük seviyelerde hariç Python

for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'): 
    print the_input 

Çoğu döngüler, iyi bazı ast yardımıyla for döngüler olarak uygulanır: örneğin, bu özel durumda -

+1

İlk formun kesinlikle kabul edilebilir olduğunu düşünüyorum. –

+5

Bu, [döngü ve yarım] olarak adlandırılan ortak bir modeldir (http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half). –

cevap

30

yineleyiciler düşünün "Döngüsel mantığı" yakalayan yineleyici - iter dahili (bazen) yardımcı olabilir, bazen genexps (jeneratör ifadeleri) bazen standart kütüphane modülü itertools kurtarmaya gelebilir. (Eğer gerçekten sofistike devlet yönetimine ihtiyaç olduğunda)

Çoğu zaman daha bazen (olanları yield kullanarak) özel jeneratör fonksiyonlarını kodlamak için seçin veya bir özel yineleyici sınıfı (return self olarak __iter__ özel yöntem tanımlayan bir, ve [Python] en son sürümlerinde [veya __next__] next yineleme gelen "sonraki değeri) geri dönmek için.

bunu sırayla tarafından üretilen çeşitli unsurlar yapmak bu her ne dışında döngü mantığı yakalama döngü itse Burada anahtar soyutlama yardımcısıysa!

+4

Bu biraz akıllıca hissettiriyor ... –

+0

+1: Yineleme için 'for'-döngüler tercih et. Onları sağlayan herhangi bir dilde. – Johnsyweb

+0

Bu harika bir çözüm. SO, başka bir 4 dakika için cevap kabul etmeme izin vermez ;-) – Ponkadoodle