2010-11-20 27 views
0

Kullanıcıdan okunan bir liste kullanarak bir çeşit veritabanı oluşturuyorum. Kullanıcı finish girdiğinde while döngüsünün durmasını istiyorum. Ancak, bazı nedenlerden dolayı, döngüyü kırması için finish TWICE girmem gerekiyor.Döngü bozulmayacak

Ayrıca liste iade edildikten sonra boş.

def readNames(): 
nameList = [] 
count = 0 
while count != -1: #infinite loop 
    addList = raw_input("Please enter a name: ") 
    if addList == 'finish': 
     return nameList 
     break 
    nameList.append(addList) 
    print nameList 

bunu çağırma ve

Ayrıca
readNames() 
print readNames() 

ile çalıştı eğer kontrol ediyorum, burada çıkış

Please enter a name: Dave 
['Dave'] 
Please enter a name: Gavin 
['Dave', 'Gavin'] 
Please enter a name: Paul 
['Dave', 'Gavin', 'Paul'] 
Please enter a name: Test1 
['Dave', 'Gavin', 'Paul', 'Test1'] 
Please enter a name: finish 
Please enter a name: finish 
[] 
>>> 
+0

Benim için iyi çalışıyor (IDLE'de). Bunun dışında, sonsuz bir döngü yapmanın çok daha kolay yolları vardır ('Gerçek: 'yeterlidir; neden bir değişken değişken + durum yaratır? Aslında' count = -1' yi arıyordum ...). Ayrıca, 'break' gereksizdir ('return' işlevi ve dolayısıyla döngüden çıkar). – delnan

+0

Benim için iyi çalışıyor, bazı notalar olsa da: “Gerçekken:” True: 'sonsuz döngüsünüz için, 'break''e asla ulaşamadığınızdan sonra' break 'yapmanız gerekmiyor. 'names = readNames()' sadece benim için iyi çalışıyor. Not: Girintinizi düzelttim. –

cevap

4

iki kez fonksiyonunu çalıştırın. İkinci yarışta sadece "bitir" yazıyorsunuz ve bu yüzden listeniz boş kalıyor.

Ne yapmak istediğiniz şudur:

def readNames(): 
    nameList = [] 
    while True: #infinite loop 
     addList = raw_input("Please enter a name: ") 
     if addList == 'finish': 
      return nameList 
     nameList.append(addList) 

# store the result, then print it 
names = readNames() 
print names 
+0

Devasa yardım için teşekkürler. Çağlar boyunca buna takıldım. :) – Hypergiant

-1

sen ile

 
if addList == 'finish': 
     return nameList 
     break 

yerine Could olduğunu

 
if addList == 'finish': 
     return nameList 
     count = -1 

?

James

+1

-1 Sadece bu hala gereksiz (aynı zamanda bana ve Ivo tarafından yapılan yorumlara bakınız), aynı zamanda soruya cevap vermiyor. – delnan

+0

Aynı şey gerçekleşiyor. – Hypergiant

+0

Sadece iki sentümü ekliyorum. Üzgünüm insanlar. – Bojangles

2

Ben senin çağıran kod yanlışlıkla iki kez readnames() çağırma düşünüyorum. Eğer

readNames() 
print readNames() 

yaptığınızda

+0

Evet, öyle görünüyor. Print readNames() 'ı kaldırdıktan sonra, beklendiği gibi kırılıyor. – Hypergiant

1

Ah, kodunuzu yayınlanmıştır sonra ben konuyu görebilirsiniz: olarak stdin'den bu isimleri okumak,

readNames() 
print readNames() 

Sen readNames diyoruz planlanan düzgün okuma isimler return ve herhangi bir şey (names = readNames()) atamak yok çünkü o zaman uzak sonucu atmak. Sonra tekrarreadNames diyoruz ve bu döngü çıkmamışlardır sanki size görünür (geldi, ama yine döngü söyledim). Yine finish yazın ve herhangi isimler girilen olmadan geri [] olsun böylece readNames ikinci çağırma, (fonksiyon icra bittikten sonra o kaybolur böylece nameList, yerel bir değişkendir) sona erer.) Ve names = readNames() gibi (2) do şey;

Bunu düzeltmek için , (1) genel programlama bilgisine tazelemek; print names.

+0

Yardımlarınız için çok teşekkürler, maalesef THC4k size bunu yendi. :) – Hypergiant