任何人都可以解释一下用Python编写的这个语句的含义吗?

时间:2014-03-26 06:06:05

标签: 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新手。请为我简化此代码。

2 个答案:

答案 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')

作为正在做什么的一个简单示例,如果charurl,我们最终会得到foo bar?baz quux - 之后的空格foo bar?baz%20quux替换为?

保留相同的功能,也可以使用%20str.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)