2013-10-14 54 views
2

我一直在關注一些Python教程,需要一些幫助。 在htmlfile = urllib.urlopen(urls[i])的代碼下面,我不明白爲什麼[i]之後需要urls[i]在變量名後面做了什麼?

import urllib 

urls = ["http://google.com","http://nytimes.com","http://cnn.com"] 
i=0 

while i< len(urls): 
    htmlfile = urllib.urlopen(urls[i]) 
    htmltext = htmlfile.read() 
    print htmltext 
    i+=1 
+0

相關:http://stackoverflow.com/questions/19359093/using-while-loops-to-count-elements-in-a-list –

+0

這不是真的很習慣Python。 –

+0

@DanielRoseman大多數答案都說得很清楚:P使用'for'循環! :D –

回答

1

這是一個列表。 [i]是在該列表的一個項目中進行選擇。

例如,如果:

>>> urls = ["http://google.com","http://nytimes.com","http://cnn.com"] 

然後:

>>> urls[0] 
"http://google.com" 
>>> urls[1] 
"http://nytimes.com" 

等。

但是,在你的情況下,我會使用for循環,而不是一會兒,所以你不需要先聲明循環變量。像這樣:

import urllib 

urls = ["http://google.com","http://nytimes.com","http://cnn.com"] 


for i in range(len(urls)): 
    htmlfile = urllib.urlopen(urls[i]) 
    htmltext = htmlfile.read() 
    print htmltext 
2

urls是一個字符串列表。 [i]指的是該列表中的第i個元素,因此您一次只能訪問一個網站。

但是,非常值得注意的是,這是而不是一種很好的Pythonic方式來遍歷列表。你的循環會更好,更清晰的像這樣:

for url in urls: 
    htmlfile = urllib.urlopen(url) 
    htmltext = htmlfile.read() 
    print htmltext 

也值得考慮:一旦你更習慣代碼本身,你可以在循環一次全部這一切,而不指定所有這些額外的變量。

for url in urls: 
    print urllib.urlopen(url).read() 
0

網址是一個列表,因此url[i]需要索引列表中的項目。如果沒有索引,您嘗試打開一個url列表而不是單個url。

while循環開始於i=0並迭代至i < len(urls),這是urls中的每個項目的一次。

3

i正在索引列表urls,允許您逐一返回項目。請看下圖:

>>> urls = ["http://google.com","http://nytimes.com","http://cnn.com"] 
>>> i = 0 
>>> while i < len(urls): 
...  print i, urls[i] 
...  i += 1 
... 
0 http://google.com 
1 http://nytimes.com 
2 http://cnn.com 
>>> 

此外,我想提一提你的代碼可以被重構,以更高效:

import urllib 
urls = ["http://google.com","http://nytimes.com","http://cnn.com"] 
for url in urls: 
    print urllib.urlopen(url).read() 

這個新的代碼做舊做什麼。

1

這真的應該改寫。你有一個列表,而不是一個元組,所以集合中元素的位置沒有意義。

import urllib 

urls = ["http://google.com","http://nytimes.com","http://cnn.com"] 

for url in urls: 
    htmlfile = urllib.urlopen(url) 
    htmltext = htmlfile.read() 
    print htmltext 

如果你遍歷所有項目,在Python中使用計數器也不是很習慣。僅在需要自定義排序時使用它,然後再使用itertools包。

+1

「你有一個列表,而不是一個元組,所以集合中的元素的位置沒有意義」:嗯?你可以索引列表,就像元組一樣。 *套*沒有訂單。 – DSM

+0

@DSM的確,元組也可以被索引。 –

+0

沒有必要downvote球員,這是一個語義問題。任何在'[foo,bar,baz,quux]'中的位置都沒有意義,而在'(x,y,z)'或'(top,left,width,height)也_immutable_。比較而言,集合和列表也不關心排序,但集合添加了表示無序項目的_unique_集合的額外語義,這對於OP的需求的上下文來說可能是不希望的。 –

1

urls是一個列表,因此有一個索引。爲了訪問列表中的值,您必須通過其索引來完成。讓我證明:

>>> urls = ['hello', 'world'] 
>>> urls[0] 
'hello' 
>>> urls[1] 
'world' 
>>> len(urls) 
2 
>>> 

請注意該指數是基於0(這意味着第一個元素是通過0訪問,然後1是第二個元素)。這就是爲什麼while語句中的條件爲while i < len(url),因爲i正在訪問索引,並且由於索引從0開始,而不是1,所以您只能繼續操作直到1,這是列表中的第二個值。

讓我演示一下,如果你去出界放置2索引值會發生什麼:

>>> urls[2] 

Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    urls[2] 
IndexError: list index out of range 
>>> 

正如你所看到的,你會得到一個IndexError

但是,通過URL的list循環更好的方法,你的情況,使用for循環:

>>> for url in urls: 
    print url 


hello 
world 
>>> 

魔法門:

# This look will go through all the values inside your list, and the current value will be called url 
for url in urls: # Here url is the value inside the list 
    htmlfile = urllib.urlopen(url) 
    htmltext = htmlfile.read() 
    print htmltext 

使用for循環演示我還建議您使用python-requests,它非常適合通過常見HTTP協議(如GETPOST)發送請求。它會爲你節省很多hassle in the future