今天,我遇到了以下结构:
import re
l = list('1234')
print(re.sub('.', lambda _: l.pop(0), 'abcd'))
基本上,它使用sub
和具有副作用的repl
函数。
除了可讨论的样式问题之外,这个定义是否还明确?
例如,我在文档中找不到能够保证以任何特定顺序在比赛中调用repl
的地方{em> (实际上也没有准确地一次 ,尽管官方措词有些公开)。该代码还有其他任何问题,无论是实际的还是潜在的?
答案 0 :(得分:1)
根据re.sub
的{{3}}:
返回通过替换 最左边 不重叠而获得的字符串
pattern
在string
中被替换为repl
的次数。
和:
如果
repl
是一个函数,则每个不重叠的函数都会被调用 模式的发生。
因此很明显re.sub
从左到右搜索,并用pattern
函数的返回值替换给定repl
的每次出现。是的,代码的行为已得到很好的定义。但是,这样做效率不高,因为您要迭代地弹出列表的第一项,因此每次迭代的时间复杂度为 O(n)。您可以改为使用迭代器在 O(1)时间内实现相同的副作用:
import re
i = iter('1234')
print(re.sub('.', lambda _: next(i), 'abcd'))
这还将输出:
1234