bobo老师,问一点python3语法的问题。。。
来源:3-2 实现向量规范化
摇了摇头摇了摇头
2018-10-10
这句sum函数里的生成式为啥没有中括号或者圆括号呀。。。不会报错吗
1回答
-
Python语法问题:)
不会报错:)试一试就知道。
首先,对于中括号来说,有没有完全是两回事儿。[e**2 for e in arr] 是一个列表;e**2 for e in arr是一个生成器。可以在Python中进行如下简单的验证:
>>> arr = [1, 2, 3] >>> type(e**2 for e in arr) <class 'generator'> >>> type([e**2 for e in arr]) <class 'list'>
至于圆括号,稍微有点儿复杂了。首先,(e**2 for e in arr) 和 e**2 for e in arr 一样,是一个生成器。
>>> type((e**2 for e in arr)) <class 'generator'>
你当然可以简单地记成,对于生成器来说,加不加括号是一样的。
但是,在Python中,对于圆括号,有更一般的原则,即一个表达式,加不加括号,结果是一样的。(一点也不惊讶。。。)
比如,整型外面加不加括号,都是整型:
>>> type(1) <class 'int'> >>> type((1)) <class 'int'>
列表外面加不加括号,都是列表:
>>> type([1, 2, 3]) <class 'list'> >>> type(([1, 2, 3])) <class 'list'>
当然,我们通常不会闲的没事儿给整型或者列表外面加括号,但是这两个例子很能说明括号的这个语法规则。如果理解了这一点,就可以对Python世界里的一些写法有概念了。
比如,写一个条件语句,加不加括号都可以。因为,加不加括号,都是布尔值!以下两种写法都是对的:
if 666 % 2 == 0: pass if(666 % 2 == 0): pass
再比如:元组。可能很多教材会说,元组是一组数据,用小括号包起来,数据之间用逗号分隔。这个说法是错的!在Python中,元组的标志是逗号!而不是小括号!以下的x就是一个元组:
>>> x = 1, 2, 3 >>> type(x) <class 'tuple'>
加不加括号无所谓,当然,你要愿意,加上没关系!因为,他还是元组。这是括号的语法规则,而不是元组的!
>>> x = (1, 2, 3) >>> type(x) <class 'tuple'>
希望我已经讲清楚了括号是怎么一回事儿。最后,授人以鱼不如授人以渔,我是怎么了解的?Python官方文档!
关于括号的语法规则:https://docs.python.org/3/reference/expressions.html#parenthesized-forms
关于元组:https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences
官方文档说的很清楚。只不过没有像我这样举这么多例子而已!
Python的生态真心好。Python官方文档是我除了sklearn的官方文档以外(在机器学习课程中有介绍),第二个推荐的可以从头读到外用于学习(而非查询)的文档!Python语法入门以后,通读Python官方文档,各路Python进阶高级教材,都可以扔一边了!(事实上,大多数Python的进阶高级教材也都是抄袭Python官方文档而已:))
加油!:)
512018-10-11
相似问题