req = urllib2.Request(
"".join(
url[i].replace(' ', '%20') if i > url.find('?') else url[i]
for i in xrange(len(url))
),
data,
_headers
)
我是Python新手。请为我简化此代码。
答案 0 :(得分: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
大于{{ 1}},然后使用url.find('?')
,否则使用char.replace(' ', '%20')
。
作为正在做什么的一个简单示例,如果char
为url
,我们最终会得到foo bar?baz quux
- 之后的空格foo bar?baz%20quux
替换为?
。
保留相同的功能,也可以使用%20
和str.partition
更简洁有效地编写:
str.replace
剩下的内容很简单,不需要解释,因为文档会解释它:
>>> url = 'foo bar?baz quux'
>>> lhs, pivot, rhs = url.partition('?')
>>> lhs + pivot + rhs.replace(' ', '%20')
'foo bar?baz%20quux'
答案 1 :(得分:0)
以下是尝试使用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)