req = urllib2.Request(
"".join(
url[i].replace(' ', '%20') if i > url.find('?') else url[i]
for i in xrange(len(url))
),
data,
_headers
)
我是Python新手。請爲我簡化這個代碼。任何人都可以請我解釋一下用Python編寫的這個陳述的含義嗎?
req = urllib2.Request(
"".join(
url[i].replace(' ', '%20') if i > url.find('?') else url[i]
for i in xrange(len(url))
),
data,
_headers
)
我是Python新手。請爲我簡化這個代碼。任何人都可以請我解釋一下用Python編寫的這個陳述的含義嗎?
[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
。
作爲什麼是做,如果url
是foo bar?baz quux
,該?
被替換%20
後,我們最終會與foo bar?baz%20quux
-the空間簡單的例子。
保留了相同的功能,這也可以通過使用str.partition
和str.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)
這裏是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)
你截斷了一些東西關閉生成ator表達。 – roippi
我已經添加了整個陳述。 – Malav
我已經添加了一些換行符,這樣該行至少*隱約*可讀。 –