2024-04-28 13:27:25 发布
网友
我们都知道Python的
[f(x) for x in y if g(x)]
语法。
然而 AST列表理解的表示可以容纳多个“if”表达式:
comprehension = (expr target, expr iter, expr* ifs)
有人能给我一个python代码的例子吗?这个例子可以生成一个AST,它有多个if表达式?
语法允许使用多个if语句,因为可以在for循环之间混合它们:
[j for i in range(100) if i > 10 for j in range(i) if j < 20]
理解组件应被视为嵌套语句,上面的转换为:
lst = [] for i in range(100): if i > 10: for j in range(i): if j < 20: lst.append(j)
这也意味着您可以使用多个if语句,而不需要在以下两个语句之间使用for循环:
if
for
[i for i in range(100) if i > 10 if i < 20]
尽管没有意义(只是将那些使用and或链式运算符的语句组合在一起),但它仍然转换为合法的嵌套语句集:
and
lst = [] for i in range(100): if i > 10: if i < 20: lst.append(i)
语法和语法分析器并没有特别禁止这种用法,就像Python不允许嵌套if语句一样。
注意PEP 202 – List Comprehensions(将此功能添加到语言中的原始提案文档)实际上在示例部分中包含一个double if理解:
>>> print [(i, f) for i in nums for f in fruit if f[0] == "P" if i%2 == 1] [(1, 'Peaches'), (1, 'Pears'), (3, 'Peaches'), (3, 'Pears')]
使用内置的all()可以将多个布尔表达式或函数放在一个iterable中并坚持理解。我认为这是一个相当少的使用内置,它保持可读性高。
all()
>>> [x for x in range(20) if all([1 < x < 10, not x & 1])] [2, 4, 6, 8]
或者
>>> [x for x in range(20) if all([foo(x), bar(x)])]
如果只需要满足一个条件,内置的any()也可以在这里正常工作:
any()
>>> [x for x in range(20) if any([1 < x < 10, not x & 1])] [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18]
把它们一个接一个地叠起来:
[i for i in range(100) if i > 10 if i < 50]
生成11到49之间的整数(包括11和49)。
语法允许使用多个if语句,因为可以在for循环之间混合它们:
理解组件应被视为嵌套语句,上面的转换为:
这也意味着您可以使用多个
if
语句,而不需要在以下两个语句之间使用for
循环:尽管没有意义(只是将那些使用
and
或链式运算符的语句组合在一起),但它仍然转换为合法的嵌套语句集:语法和语法分析器并没有特别禁止这种用法,就像Python不允许嵌套
if
语句一样。注意PEP 202 – List Comprehensions(将此功能添加到语言中的原始提案文档)实际上在示例部分中包含一个double if理解:
使用内置的
all()
可以将多个布尔表达式或函数放在一个iterable中并坚持理解。我认为这是一个相当少的使用内置,它保持可读性高。或者
如果只需要满足一个条件,内置的
any()
也可以在这里正常工作:把它们一个接一个地叠起来:
生成11到49之间的整数(包括11和49)。
相关问题 更多 >
编程相关推荐