2016-01-24 110 views
1

我之前學習過Visual Basic,現在我正在學習Python。我意識到,在Python中,我們不必爲for loop中的標識符初始化一個值,但這是while loop中的另一種方式。我在Visual Basic中看起來並不熟悉,我們必須在兩個循環中聲明一個變量作爲標識符。Python - 爲什麼我們必須在while循環中初始化標識符,而不是在for循環中?

例如,在Python維基,

x = 1 
while True: 
    print "To infinity and beyond! We're getting close, on %d now!" % (x) 
    x += 1 

運行完美。但是,在我評論x = 1後,它會生成一個錯誤。爲什麼不能像for loop那樣運行,其中x從0開始?

此外,即使我們在for loop分配用於標識符的值,例如,

num = 10 
for num in range(5): 
    print num 
print num 

環路將覆蓋分配的值。爲什麼這樣?

我知道這裏有很多for loopwhile loop的問題,但大部分都是OP代碼的案例研究。我想要的是當執行for loopwhile loop時,對Python結構本身和語言的一些基本操作的更一般的解釋。另外,在這種情況下,我指的是Python 2.7.11。如果你能指出3.5.1結構的不同,我將非常感激。非常感謝。

+0

我真的不知道你期望什麼樣的答案。您似乎已經知道如何進行循環工作。理解變量賦值的問題在這裏? – timgeb

+0

在python中,如果不首先爲其分配值,則不能使用變量。所以當你不設置'x = 1'時,python不會知道'x'是什麼。 在'for'循環中,'num'被用作迭代器,所以這個命令在每個循環遍中爲列表中的每個值設置它的值,'range(5)'產生整數值從0到4 – nsilent22

+0

@timgeb請參閱我的回覆。 – Caesium95

回答

4
x = 1 
while True: 
    print "To infinity and beyond! We're getting close, on %d now!" % (x) 
    x += 1 

如果你對此有何評論x = 1,此行引發錯誤:

x += 1 

,因爲這意味着,x = x + 1,爲x沒有定義,它會引發錯誤(Python不知道出於什麼價值加1)

num = 10 
for num in range(5): 
    print num 
print num 
你使用相同的名稱爲兩個變量

,內循環和外這樣,這就是爲什麼你有另一個值循環內的。

良好做法是有另一個名稱爲一個循環變量中的變量,因爲你真的不需要對循環變量一樣的,你有一個循環外

是這樣,你可以寫類似這樣的:

num = 10 
for i in range(5): 
    # play with num and i variables 
    num += i * 2 
print num 
+1

通過使用名稱iter,您可以屏蔽內置函數iter,所以這可能不是您的示例中的一個很好的名稱。 – timgeb

+0

@timgeb,是的,你說得對。使用這個例子,我想展示如何在循環內部和循環外使用變量的想法。但是你的評論是有道理的。謝謝,我會重命名它 – pivanchy

+0

@pivanchy你部分回答了我的問題。如何在while循環中使用'''x'不會像0在for循環中那樣從0開始?例如,我們可以在for循環中寫'for range in(5)','x'將被自動綁定到0.然而,在'while循環'中,當我們寫'while while x <5'時, ,如果'x'事先沒有被賦值,會產生一個錯誤,因爲'x'沒有綁定到0.我的問題是爲什麼'x'在兩種情況下都以不同的方式處理?對不起,我的問題聽起來很荒謬,因爲我並不擅長表達自己的想法,但我希望有人能幫助我。 – Caesium95

1

因爲'範圍'說你什麼是價值的連續和定義數字作爲本地價值。你看到幾句話,但有一個更復雜的過程。

一個例子可能是Javascript語言。在for循環中,您會看到循環中迭代的值的初始值,您會看到最大值和增量。 for(var num = 0; var < 5; var + = 1)in python you see for num in range(5)。 while while循環更加明確。

num是用於全局變量和局部變量的名稱的事實可能會導致混淆。實際上,你在循環中看到的數字是另一個變量。

1

因爲Python的for循環更像的foreach C#或JS的for of
而VB的for更像是帕斯卡的for

我會用Pascal代替VB,因爲我知道它更好。

帕斯卡for

var i: byte; 
begin 
    for i := 0 to 5 do 
    begin 
     writeln(i); 
    end; 
end. 

每個帕斯卡for迴路可以在Python很容易被複制使用range

for i in range(5): 
    print(i) 

但是,Python的for更多的東西:

for c in "HelloWorld!": 
    print(c) 

如果不直接處理索引,則無法在Pascal中複製它。

帕斯卡和VB的for作品帶有索引–他們遍歷從一些指標到另一個,而Python的for環路與iterables(數組,字符串,文件,發電機等等)的作品。

相關問題