bobo老师,问一点python3语法的问题。。。

来源:3-2 实现向量规范化

摇了摇头摇了摇头

2018-10-10

图片描述
这句sum函数里的生成式为啥没有中括号或者圆括号呀。。。不会报错吗

写回答

1回答

liuyubobobo

2018-10-11

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官方文档而已:))


加油!:)

5
1
摇了摇头摇了摇头
感谢!!!
2018-10-11
共1条回复

结合编程学数学 专为程序员设计的线性代数

创新设计,通俗易懂。编程结合数学,bobo带你彻底征服线性代数

3417 学习 · 376 问题

查看课程