什么' pythonic方式这样做?

时间:2015-04-30 02:08:03

标签: python

我想在while(像c)中写一些简写表达式,但它在python中不起作用。

while token=TokenBuffer.peek() and token != sentinel
    doSomeThing()

1 个答案:

答案 0 :(得分:7)

你不能用Python做到这一点。赋值是Python中的语句,而不是表达式。

那么,你能做些什么呢?最pythonic可能使用iter函数:

for token in iter(TokenBuffer.peek, sentinel):

对于新手而言,这方面的文档有点令人困惑:

  

...如果给出第二个参数 sentinel ,则object必须是可调用对象。在这种情况下创建的迭代器将为每个对__next__()方法的调用调用没有参数的对象;如果返回的值等于 sentinel ,则会引发StopIteration,否则将返回该值。

如果您已经了解迭代器和for循环如何在幕后工作,那就太棒了,但如果您不熟悉,下面的示例可能会更有帮助:

  

第二种形式iter()的一个有用的应用是读取文件的行直到达到某一行。以下示例读取文件,直到readline()方法返回空字符串:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

这使得它更加清晰:for line in iter(fp.readline, ''):一遍又一遍地调用fp.readline(),直到它获得''。就像你想要一遍又一遍地调用TokenBuffer.peek()一样,直到它获得sentinel