gpt4 book ai didi

Python - () 和 [] 的机制

转载 作者:行者123 更新时间:2023-12-03 19:40:36 25 4
gpt4 key购买 nike

它看起来 e for e in [1, 2, 3, 4, 5]是一个生成器表达式和 (e for e in [1, 2, 3, 4, 5])被评估为生成器对象。因此,我认为 (...)是 Python 中的评估。
我想list(e for e in [1, 2, 3, 4, 5])告诉 Python 运行时 计算可迭代表达式,生成它的对象,然后调用 list功能 调用 yield直到元素用完。

print(list(e for e in [1, 2, 3, 4, 5]))
---
[1, 2, 3, 4, 5]
问题
实际上是什么 [...]在下面的代码中,它的机制是什么? [ e for e in [1, 2, 3, 4, 5] ]生成一个列表对象,因此我认为它是对 e for e in [1, 2, 3, 4, 5] 的评估的组合创建生成器对象并调用生成器对象。它是对 list(...) 的函数调用的别名吗? ?
print([ e for e in [1, 2, 3, 4, 5] ])
---
[1, 2, 3, 4, 5]
对于使用切片对象的列表访问,我想 [1:3]告诉 Python 评估 1:3表达式生成切片对象。
print([1,2,3][1:3])
print([1,2,3][slice(1,3,1)])
---
[2, 3]
[2, 3]
[(1:3)]失败,因为它试图评估已评估的 1:3 ?
print([1,2,3][(1:3)])
---
File "<ipython-input-167-c20e211025dc>", line 1
print([1,2,3][(1:3)])
^
SyntaxError: invalid syntax

最佳答案

[1, 2, 3, 4, 5]是一个列表文字。value for item in iterable是生成器理解。 list(value for item in iterable)将调用 list()带有生成器的构造函数,它当然只生成一个列表。为了减少歧义,生成器理解不能裸露使用。但它既可以在一组括号内使用,也可以在另一个表达式内使用,例如函数调用中的参数。类似的限制适用于 := (海象) 运算符在 Python 3.8 中添加。[value for item in iterable]是一个列表理解。请注意,Python 将其视为一个完全独立的句法结构。
实现可能大致相同,但据我所知,Python编译器在处理代码时分别检测生成器理解和列表理解,并且列表理解未定义为任何一个的子集/特殊情况生成器理解或列表文字。

我很确定切片语法也有类似的情况——它被定义为自己的语法,特别是在列表索引的上下文中,而不是在其他上下文中。 lst[1:3]编译成 lst.__getitem__(slice(1, 3))是编译过程的一部分,对于语法 1:3 来说不是一般的东西(因为这是模棱两可的)。
换句话说,如果我没记错的话,lst[x:y:z]是与 lst[x] 不同的句法结构,就 Python 编译器而言。

*本文中的信息基于我对CPython源代码中各种方法的理解和之前的交互。我在语法、编译器和可能无效的编译代码之间得出了一些结论。

关于Python - () 和 [] 的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65516923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com