【文件属性】:
文件名称:解析语法概括-编译系统透视++图解编译原理_
文件大小:9.16MB
文件格式:PDF
更新时间:2024-06-29 19:45:46
Python 学习手册 中文 高清文字版
Python 3.0解析语法概括
我们已经在本章中关注过列表解析和生成器,但是,别忘了,还有两种在Python 3.0中
可用的解析表达式形式:集合解析和字典解析。我们在第5章和第8章曾遇到过这两种形式,
但是,有了解析和生成器的知识,现在我们应该能够全面地理解这些Python 3.0扩展了。
对于集合,新的常量形式{1,3,2}等同于set([1,3,2]),并且新的集合解析语法{f(x)for x in S if P(x)}就像是生成器表达式
set(f(x)for x in S if P(x)),其中f(x)是一个任意的表达式。
对于字典,新的字典解析语法{key:val for(key,val)in zip(keys,vals)}像dict(zip(keys,vals))形式一样工作,并且{x:f(x)for x
in items}像生成器表达式dict((x,f(x))for x in items)一样工作。
这里是Python 3.0中的所有解析替代方式的总结。最后两种是新的,并且在Python 2.6中
不可用。
>>> [x * x for x in range(10)] # List comprehension: builds list
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # like list(generator expr)
>>> (x * x for x in range(10)) # Generator expression: produces items
# Parens are often optional
>>> {x * x for x in range(10)} # Set comprehension, new in 3.0
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36} # {x, y} is a set in 3.0 too
>>> {x: x * x for x in range(10)} # Dictionary comprehension, new in 3.0
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
解析集合和字典解析
从某种意义上讲,集合解析和字典解析只是把生成器表达式传递给类型名的语法糖。
因此,二者都接受任何的可迭代对象,一个生成器在这里工作得很好。
>>> {x * x for x in range(10)} # Comprehension
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x * x for x in range(10)) # Generator and type name
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> {x: x * x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> dict((x, x * x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
然而,对于列表解析来说,我们总是可以用手动代码来构建结果对象。这里是最后两个
解析的基于语句的等价形式。
>>> res = set()
>>> for x in range(10): # Set comprehension equivalent
... res.add(x * x)
...
>>> res
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> res = {}
>>> for x in range(10): # Dict comprehension equivalent
... res[x] = x * x
...
>>> res
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
注意,尽管这两种形式都接受迭代器,它们没有根据需要产生结果的概念——两种形