可以使for循环与if一起工作,使其与elif和else分支的if一起工作吗?

时间:2018-09-08 13:17:37

标签: python python-3.x performance for-loop if-statement

我有一个类似的代码:

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', '')最终/一般情况?

最重要的是,两种形式中哪一种表现更好?

1 个答案:

答案 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 微秒。如果我重新运行样本几次,则一个或另一个示例以相似的极小幅度获胜。但这并不能使彼此最快,因此您可以在这种情况下将它们视为相等

但是,如果您确实需要对此类部分进行微优化,则需要自己进行计时。