我有一个类似的代码:
if 'x' in longstr:
longstr = longstr.replace('x', '')
elif 'y' in longstr:
longstr = longstr.replace('y', '')
elif 'z' in longstr:
longstr = longstr.replace('z', '')
else:
longstr = longstr.replace('foo', '')
如果我想改用for
循环:
for char in ['x','y','z']:
if char in longstr:
longstr = longstr.replace(str, '')
break
如何替换上面else:
示例(if..elif..else
)中的else: longstr = longstr.replace('xyz', '')
最终/一般情况?
最重要的是,两种形式中哪一种表现更好?
答案 0 :(得分:2)
只需将else:
套件添加到for
循环中即可:
for char in ['x','y','z']:
if char in longstr:
longstr = longstr.replace(char, '')
break
else:
longstr = longstr.replace('xyz', '')
else
循环中的for
套件仅在for
循环结束而没有以break
结束的情况下执行。参见for
statement documentation:
当项目用完 [...] 时,将执行
else
子句中的套件(如果存在),并且循环终止。在第一个套件中执行的
break
语句将终止循环,而不会执行else
子句的套件。
要查看哪种效果更好,您必须使用timeit
来计时。但是,除非您要在紧凑的循环中执行关键代码段,否则请坚持使用if...elif...else
,因为for...else
组合并不为人所知,并且会使许多程序员不了解语义scratch头。此外,对于您的玩具示例,无论如何,您将通过if
测试或for
循环使用正则表达式。
列举两个简单的例子:
>>> from timeit import Timer
>>> def example1(longstr):
... if 'x' in longstr:
... longstr = longstr.replace('x', '')
... elif 'y' in longstr:
... longstr = longstr.replace('y', '')
... elif 'z' in longstr:
... longstr = longstr.replace('z', '')
... else:
... longstr = longstr.replace('foo', '')
...
>>> def example2(longstr):
... for char in ['x','y','z']:
... if char in longstr:
... longstr = longstr.replace(char, '')
... break
... else:
... longstr = longstr.replace('xyz', '')
...
>>> from string import ascii_lowercase
>>> from random import choice
>>> teststring = ''.join([choice(ascii_lowercase) for _ in range(10000)])
>>> for ex in (example1, example2):
... count, total = Timer('ex(s)', 'from __main__ import teststring as s, ex').autorange()
... print(f'{ex.__name__}: {total/count * 1000000}µs')
...
example1: 15.999997949984389µs
example2: 16.788980951241683µs
显示它们之间只有1.8 微秒。如果我重新运行样本几次,则一个或另一个示例以相似的极小幅度获胜。但这并不能使彼此最快,因此您可以在这种情况下将它们视为相等。
但是,如果您确实需要对此类部分进行微优化,则需要自己进行计时。