当我试图从字典中删除一个键时,我写道:
if 'key' in myDict:
del myDict['key']
Run Code Online (Sandbox Code Playgroud)
有这样一种方式吗?
想想我正在调用它的副作用的函数,而不是返回值(比如打印到屏幕,更新GUI,打印到文件等).
def fun_with_side_effects(x):
...side effects...
return y
Run Code Online (Sandbox Code Playgroud)
现在,是Pythonic使用列表推导来调用这个函数:
[fun_with_side_effects(x) for x in y if (...conditions...)]
Run Code Online (Sandbox Code Playgroud)
请注意,我不会将列表保存在任何位置
或者我应该像这样调用这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
Run Code Online (Sandbox Code Playgroud)
哪个更好?为什么?
今天我正在解析一个目录索引,其中包含使用BeautifulSoup压缩文件的路径列表,并且遇到了一件有趣的事情.让我们假设我想获取href我得到的标签的所有属性并将它们直接放入队列中:
q = Queue.Queue()
[q.put(tag['href']) for tag in soup.findAll('a')]
Run Code Online (Sandbox Code Playgroud)
我从来没有碰到这样的情况,在此之前可以使用内联而不将其分配给任何东西,只是通过一些例程调用生成另一个迭代器.这被认为是不好的做法吗?它本身就是"pythonic"吗?是否有更好的单行将所有项目放入队列?
可能重复:
在python中是否有没有结果的地图?
当我想快速/有效地在迭代所包含的每个项目上调用就地方法时,我经常会遇到程序中的情况.(很快意味着for循环的开销是不可接受的).当我想调用draw()每个Sprite对象时,一个很好的例子是精灵列表.
我知道我可以这样做:
[sprite.draw() for sprite in sprite_list]
但我觉得列表理解被滥用,因为我没有使用返回的列表.这同样适用于该map功能.石头我过早优化,但我也不希望返回值的开销.
我想知道的是,如果在Python中有一个方法可以让我做我刚才解释的方法,也许就像我在下面建议的假设函数:
do_all(sprite_list, draw)
什么是告诉某人"我想要应用于func每个元素iterable的副作用" 的首选方式.
# Option 1... clear, but two lines.
for element in iterable:
func(element)
# Option 2... even more lines, but could be clearer.
def walk_for_side_effects(iterable):
for element in iterable:
pass
walk_for_side_effects(map(func, iterable)) # Assuming Python3's map.
# Option 3... builds up a list, but this how I see everyone doing it.
[func(element) for element in iterable]
Run Code Online (Sandbox Code Playgroud)
我喜欢选项2; 标准库中是否有一个已经等效的函数?