生成器 Generator
什么是生成器:
生成器是能够动态提供数据的可迭代对象
生成器在程序运行时生成数据,与容器类不同,它通常不会在
内存中保存大量的数据,而是现用现生成
好处:
不占用计算机的内存
生成器有两种:
生成器函数
生成器表达式
生成器函数的定义
含有yield语句的函数是生成器函数,此函数被调用将返回
一个生成器对象
yield 翻译为(产生或生成)
yield 语句
语法:
yield 表达式
说明:
yield 只能用于def 函数中,目地是将此函数作为生成器函数使用
yield 用来生成数据,供迭代器的next(it) 函数使用
说明:
1. 生成器函数的调用将返回一个生成器对象,生成器对象是
一个可迭代对象
2. 生成器函数用return会触发一个StopIteration异常
(即生成结束)
生成器表达式
语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式])
作用:
用推导式形式创建一个新的生成器
说明:
if 子句可以省略
生成器表达式也可以象列表推导式一样嵌套
示例:
gen = (x**2 for x in range(1, 5))
it = iter(gen) # 拿到迭代器
next(it) # 1
next(it) # 4
next(it) # 9
next(it) # 16
next(it) # StopIteration
迭代工具函数
迭代工具函数的作用是生成一个符合条件的可迭代对象
zip(iter1[,iter2[, ...]]) 返回一个zip生成器对象
此对象用于生成一个元组,此元组的数据分别来自于
参数中的每个可迭代对象,生成元组的个数由最小的
一个可迭代对象决定
enumerate(iterable, start=0) 返回一个enumerate
生成器对象,此对象生成类型为(索引,值对) 的元组
默认索引从零开始,也可以用start指定
zip示例:
numbers = [10086, 10000, 10010, 95588]
names = ['中国移动', '中国电信', '中国联通']
for t in zip(numbers, names):
print(t)
# 结果
# (10086, '中国移动')
# (10000, '中国电信')
# (10010, '中国联通')
for t in zip(numbers, names, range(1, 10000)):
print(t)
enumerate 示例:
names = ['中国移动', '中国电信', '中国联通']
# for t in zip(range(100000000), names):
# print(t)
for t in enumerate(names):
print(t)
# 打印 (0, '中国移动') (1, '中国电信') (2, '中国联通')
for t in enumerate(names, 101):
print(t)
# 打印 (101, '中国移动') (102, '中国电信') (103, '中国联通')
容器
列表,字符串,元组(序列), 字节串,字节数组
字典,集合,固定集合
字节串和字节数组
字节串(字节序列) bytes
存储以字节为单位的数据
字节串是不可变的字节序列
说明:
字节是0~255之间的整数,用来表示一个字节的取值
创建空字节串的字面值方式:
b''
b""
b''''''
b""""""
创建非空字节串的字面值
b'ABCD'
b"ABC"
b'''aaaa'''
b"""BBBB"""
字节串的构造函数 bytes
bytes() 生成一个空的字节串,等同于b''
bytes(整数可迭代对象) 用可迭代对象始化一个字节串
bytes(整数n) 生成n个值为0的字节串
bytes(字符串, encoding='utf-8') 用字节串转换编
码生成一个字节串
示例:
B = bytes()
B = bytes(range(0x41, 0x61))
B = bytes([65, 66, 67, 68])
B = bytes(10)
B = bytes("Hello", 'utf-8')
B = bytes("中文", 'utf-8')
字节串的运算:
+ += * *=
< <= > >= == !=
in / not in
索引和切片
函数:
len(x), max(x), min(x), sum(x), any(x), all(x)
bytes 与 str 的区别:
bytes 存储字节(0~255之间的整数)
str 存储UNICODE字符(0~0x10FFFF) 的字符
bytes 与 str 的转换
编码(encode)
str --------------> bytes
b = s.encode(encoding='utf-8')
解码(decode)
bytes ---------------> str
s = b.decode(encoding='utf-8')
示例:
s = "ABC中文"
b = s.encode('utf-8')
s2 = b.decode('utf-8')
print(s, b, s2)
字节数组 bytearray
可变的字节串
字节数组的构造函数 bytearray
bytearray()
bytearray(整型可迭代对象)
bytearray(整数n)
bytearray(字符串, encoding='utf-8')
运算:
同字节串
+ += * *=
比较: < <= > >= == !=
in / not in
索引/切片
(字节数组可以索引和切片赋值,规则同列表的索引和切
片赋值规则)