2014-03-26 66 views

回答

1

[f(url[i]) for i in xrange(len(url))]是Python中的反模式。 (xrange(len(x))是你幾乎從不寫的東西。)它基本上是對URL的每個字符做一些事情(假設url是一個字符串)。您應該改用更像[f(char) for char in url]的東西,或者如果索引是必要的,請使用enumerate

"".join(…)表示對於可迭代的字符,它們將與它們之間沒有任何內容("")連接。

因此,

url = ''.join(
     char.replace(' ', '%20') if i > url.find('?') else char 
     for i, char in enumerate(url) 
    ) 

那部分是取代的空間()與%20在查詢字符串只(後?符號)的一個狡猾的方式。

其分解,我們有一個發生器表達,(a for b in c),和作爲發電機的表達,char.replace(' ', '%20') if i > url.find('?') else char,這意味着「如果i大於url.find('?')更大,然後使用char.replace(' ', '%20'),否則使用char

作爲什麼是,如果urlfoo bar?baz quux,該?被替換%20後,我們最終會與foo bar?baz%20quux -the空間簡單的例子。

保留了相同的功能,這也可以通過使用str.partitionstr.replace更簡潔,高效地寫着:

>>> url = 'foo bar?baz quux' 
>>> lhs, pivot, rhs = url.partition('?') 
>>> lhs + pivot + rhs.replace(' ', '%20') 
'foo bar?baz%20quux' 

剩下的就是那麼簡單,無需解釋的文檔解釋:

req = urllib2.Request(url, data, _headers) 
+0

非常感謝! – Malav

+0

+1。值得一提的是,非轉義字符串的HTML轉義方式是使用'urllib.quote'。 – roippi

0

這裏是m試圖重寫使用for循環,讓你更好地理解:

ls = list() 
    url = 'https://www.facebook.com/?ref=here is me' 
    for i in range(len(url)): 
     # all the element after '?' 
     if i > url.find('?'): 
      ls.append(url[i].replace(' ', '%20')) 
     else: 
      ls.append(url[i]) 

    nurl = ''.join(ls) 
    # nurl = https://www.facebook.com/?ref=here%20is%20me 
    req = urllib2.Request(nurl, data, _headers) 
相關問題