Dea*_*ado 12 python list-comprehension
今天我正在解析一个目录索引,其中包含使用BeautifulSoup压缩文件的路径列表,并且遇到了一件有趣的事情.让我们假设我想获取href我得到的标签的所有属性并将它们直接放入队列中:
q = Queue.Queue()
[q.put(tag['href']) for tag in soup.findAll('a')]
Run Code Online (Sandbox Code Playgroud)
我从来没有碰到这样的情况,在此之前可以使用内联而不将其分配给任何东西,只是通过一些例程调用生成另一个迭代器.这被认为是不好的做法吗?它本身就是"pythonic"吗?是否有更好的单行将所有项目放入队列?
如果你认为它是一个循环覆盖在汤.findAll返回的列表上,它将如下所示:
for tag in soup.findAll('a'):
q.put(tag['href'])
Run Code Online (Sandbox Code Playgroud)
这可能是更"'pythonic'形式,因为'显性比暗示更好'
关于这个线程有很多意见,我只能从我组织的编码约定中发言。
有很多方法可以影响循环,但列表推导式的一个关键属性是它们创建列表,在迭代序列中每个列表都有一个项目。
>>> import Queue
>>> q = Queue.Queue()
>>> [q.put(item) for item in range(5)]
[None, None, None, None, None]
>>>
Run Code Online (Sandbox Code Playgroud)
这个未使用的列表显然是浪费的。因此,这个结构是一个带有未使用返回值的列表推导式;禁止出现在我们的代码库中。像上面这样的显式循环,或者生成的与消耗它的东西相结合,例如:
>>> any(q.put(item) for item in xrange(5))
False
>>>
Run Code Online (Sandbox Code Playgroud)
要不就:
>>> for item in xrange(5):
... q.put(item)
...
>>>
Run Code Online (Sandbox Code Playgroud)
需要通过审核。
| 归档时间: |
|
| 查看次数: |
6556 次 |
| 最近记录: |