生成器表达式和推导式

生成器表达式和列表推导式非常相似,区别就是将方括号换成了小括号。

生成器表达式返回的是一个生成器迭代器 generator。表达式会产生一系列值,可使用内置函数 next() 逐一获取,或使用 for 循环遍历。

生成器迭代器中的元素,仅供一次性使用,而且可以要多少取多少,它会记住你取了多少,取到了哪里。

(i*i for i in range(3))
<generator object <genexpr> at 0x00000271080FBC00>
g = (i*i for i in range(5))
type(g)
generator
next(g), next(g)
(0, 1)
for i in g:
    print(i)
4
9
16

这种表达式被设计用于生成器将立即被外层函数所使用的情况。生成器表达式相比完整的生成器更紧凑但较不灵活,相比等效的列表推导式则更为节省内存。

sum(i*i for i in range(5))
30
list(i*i for i in range(5))
[0, 1, 4, 9, 16]

除了列表推导式和生成器表达式,集合和字典也可使用类似的推导式。

{i*2 for i in 'abac'}
{'aa', 'bb', 'cc'}
{i:j for i,j in zip('abc',(1,2,3))}
{'a': 1, 'b': 2, 'c': 3}
jupyter附件

空值 None

空值 None,此对象会由没有显式地设置返回值的函数返回。None 是个内置名称,空对象求值,什么也不会发生。

None
help(None)
Help on NoneType object:

class NoneType(object)
 |  Methods defined here:
 |  
 |  __bool__(self, /)
 |      self != 0
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
# 没有返回值的列表方法
a = [].append(1)
a
# 将 a 打印出来,将打印内置名称 None
print(a)
None

其他内置类型

内置类型除了数字类型,布尔类型,序列类型,集合类型,映射类型,迭代器类型,解释器支持的还有一些其他种类的对象。这些对象大都仅支持一两种操作。

模块

模块唯一的特殊操作是属性访问: m.name,这里 m 为一个模块而 name 为定义在 m 的符号表中的一个属性的名称。模块属性可以被赋值。import 语句严格来说也是对模块对象的一种操作。关于模块有详细的知识点介绍。

type(math)
module
import math
math.pi
3.141592653589793

函数

函数对象是通过函数定义创建的。对函数对象的唯一操作是调用它: func(argument-list)。

实际上存在两种不同的函数对象:内置函数和用户自定义函数。两者支持同样的操作(调用函数),但实现方式不同,因此对象类型也不同。关于函数有详细的知识点介绍。

print('abc') # 调用函数
abc
type(print)
builtin_function_or_method
def f():pass # 自定义函数
type(f)
function

方法

方法是在类中定义,使用属性表示法来调用的函数。关于方法有详细的知识点介绍。

type(list.append)
method_descriptor
type([].append)
builtin_function_or_method

代码对象

代码对象可由内置的 compile() 函数返回,也可通过从函数对象的 __code__ 属性从中提取。

可将代码对象(而非源码字符串)传给 exec()eval() 内置函数来执行或求值。

def f():
    print('代码对象')
code = f.__code__
type(code)
code
exec(code)
代码对象

类型对象

类型对象表示各种对象类型。对象的类型可通过内置函数 type() 来获取。类型没有特殊的操作。标准库模块 types 定义了所有标准内置类型的名称。

type(int), type(list)
(type, type)
type(1), type([])
(int, list)