Python 列表为判断条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 列表为判断条件相关的知识,希望对你有一定的参考价值。

def lines(file):
for line in file:yield line
yield '\n'

def blocks(file):
block=[]
for line in lines(file):
if line.strip():
block.append(line)
elif block:
yield ''.join(block).strip()
block=[]

请问下大虾,上面的elif block中block列表为判断条件是什么意思,什么情况下才执行这个语句?
还有下面的yield 代码是啥意思呢?

if line.strip():
block.append(line)
elif block:
如果行非空执行上面的if,如果行(line)是空的执行 elif block,即如果block不是空列表执行下面的yield语句。
这个程序就是将空行分隔的多个非空行(段落)放在一起
yield是生成器语句 ,有yield语句的函数就是生成器,表示将其后表达式放入生成器,可供迭代取值用追问

是如果遇到行(非空),执行if
遇到行(为'\n',或文件最后一行),执行elif block 这样么?

追答

if line.strip():
line.strip()删除所有行前后的空格制表符换行符等空白符,所以这里空行的定义就是完全由空白符组成的行,如果是空行则判断block是否非空,如果block非空执行yield语句,然后再将block重置为空

参考技术A

首先,yield是用来生成迭代器,必须与函数使用,如何取yield生成器的值,一般使用for i in 一个由yield构造的函数,例如

def a():

    for i in range(10):
        yield i
b=a()
for i in b:
    print i

然后elif block的逻辑判断条件是elif block is not None:#简单的说就是block不为空,上面的是列表,意思是列表block不为空。

追问

感谢,还想问下若列表不为空执行,那么每次for循环(遇到文件一行),是进入if line.strip():还是进入if block():呢
感觉这个if和if else条件好像没有互斥,不是很明白(if line.strip()是只要line有行就执行么?)

Python列表推导式每一个for都可以有自己的条件判断

rows = range(1,4)
cols = range(1,3)
cells = [(row, col) for row in rows for col in cols]
print(cells)
cells = [(row, col) for row in rows if row !=2 for col in cols if col !=1]
print(cells)

输出:

[(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2)]
[(1, 2), (3, 2)]

参考资料:《Python语言及其应用》卢布诺维克 著

以上是关于Python 列表为判断条件的主要内容,如果未能解决你的问题,请参考以下文章

Python ❀ 条件判断语句

Python列表推导式每一个for都可以有自己的条件判断

python基础--条件判断循环语句与列表解析,生成器

python基础一 -------如何在列表字典集合中根据条件筛选数据

Python 列表解析

python判断元素是不是在列表组中?