1. 迭代器 Iterator
- 迭代器是访问可迭代对象的工具
- 迭代器是指iter(obj)函数返回的对象(实例)
- 迭代器可以用next(it) 函数获取可迭代对象的数据
1.2 迭代器函数iter和next
- iter(iterable) 从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象
- next(iterator) 从迭代器iteraror中获取下一个记录, 如果无法获取下一条数据,则触发StopIteration异常
- 说明:
- 迭代器只能向前取值,不会后退
- 用iter函数可以返回一个可迭代对象的迭代器
- 作用:
- 迭代器对象能用next 函数获取下一个元素
- 示例:
```
L = [2, 3, 5, 7]
it = iter(L) # 用L 对象访问迭代器
next(it) # 2
next(it) # 3
next(it) # 5
next(it) # 7
next(it) # StopIteration 通知(没有数据)
```
2. 生成器 Generator (python 2.5及之后)
生成器是能够动态提供数据的对象,生成器对象也可迭代对象
-
生成器有两种
- 生成器函数
- 生成器表达式
-
生成器函数的定义
- 含有yield 语句的函数是生成函数,此函数被调用将会返回一个生成器对象
- yield 翻译为 产生 生成
- yield语句
- 语法
yield 表达式 - 说明:
- yield 用于 def 函数中,目的是将此函数作用生成器函数使用
- yield 用来生成数据,供迭代器的next(it) 函数使用
- 语法
-
生成器函数说明:
- 生成器函数的调用经返回一个生成器对象,生成器对象是一个可迭代对象
- 在生成器函数调用return 会触发一个StopIteration 异常
-
生成器表达式
- 语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式]) - 说明: if 子句可省略
- 作用:
- 用推导式创建一个新的生成器 思考:
# iter() 函数用来生成迭代器。 # next() 返回迭代器的下一个项目。 L = [2, 3, 5, 7] L2 = [x ** 2 for x in L] # 列表推导式 it = iter(L2) print(next(it)) # 4 L[1] = 10 print(next(it)) # 9 L = [2, 3, 5, 7] L2 = (x ** 2 for x in L) # 生成器表达式 it = iter(L2) print(next(it)) # 4 L[1] = 10 print(next(it)) # 100 - 语法:
-
迭代工具函数
- 迭代工具函数的作用是生成一个个性化的可迭代对象
- 函数zip:
- 返回一个zip对象,此对象用于生成元素,此元组的个数由最小的可迭代对象决定
zip(iter1 [, iter2[, ...]]) - 示例:
number = [10086, 10000, 10010, 9558] names = ['中国移动', '中国电信', '中国联通'] for t in zip(number, names): print(t) # 输出 (10086, '中国移动') (10000, '中国电信') (10010, '中国联通') d = dict(zip(number, names)) # 输出 {10086: '中国移动', 10000: '中国电信', 10010: '中国联通'}# zip函数实现示例 number = [10086, 10000, 10010, 9558] names = ['中国移动', '中国电信', '中国联通'] def myzip(iter1, iter2): it1 = iter(iter1) it2 = iter(iter2) while True: a = next(it1) b = next(it2) yield (a, b) for t in myzip(number, names): print(t) - 函数enumerate
- 生成带索引的枚举对象,返回迭代类型为索引-值(index-value对), 默认索引从零开始,也可以用start指定
enumerate(iterable[, start]) - 示例
names = ['中国移动', '中国电信', '中国联通'] for t in enumerate(names): print(t) # 输出 (0, '中国移动') (1, '中国电信') (2, '中国联通')
- 生成带索引的枚举对象,返回迭代类型为索引-值(index-value对), 默认索引从零开始,也可以用start指定
3. 字节串和字节数组
-
字节串bytes (也叫字节数列)
- 作用:
- 存储以字节为单位的数据
- 字节串是不可变的字节序列
- 作用:
-
字节
- 字节是由8个位(bit)组成的数据单位,是计算机进行数据管理的单位
- 字节是用0 ~ 255范围内的整数表示
-
创建非空字节串的字母字面值
B = b'' B = b"" B = b'''''' B = b"""""" -
创建非空字节串的字面值
B = b'ABCD' B = b"ABCD" B = b'\x41\x42' # ascii码 16进制 B = b"""""" -
字节字符串的构造函数 bytes
- bytes() 生成一个字的字节串 等同于b''
- bytes(整数可迭代对象) # 用可迭代对象初始化一个字符串
- bytes(整数n) 生成n个值为0 的字符串
- bytes(字符串, encoding='utf-8')
- 用字符串转为编码生成一个字符串
- 示例
b = bytes() # b = b'' b = bytes(range(65, 69)) # b = b'ABCD' b = bytes(5) # b = b'\x00\x00\x00\x00\x00' b = bytes('abc中文') # b = b'ABC\xe4\xb8\xad\x96\x87'
-
bytes 运算
+ += * *= < <= > >= == != in not in 索引和切片- len(x)
- max(x)
- min(x)
- sum(x)
- any(x)
- all(x)
-
bytes 和 str的区别
- bytes 存储字节(通常值在range(0, 256))
- str存储unicode字符(通常值在0~65535)
-
bytes 与 str 转换
sequenceDiagram str->>bytes: 编码(encode) b = s.encode(encoding='utf-8') bytes->>str: 解码(decode) b = s.decode(encoding='utf-8') -
字节数组 bytearray
- 可变的字节序列
- 字节数组的构造函数:bytearry
构造函数 说明 bytearray() 创建空的字节数组 bytearray(整数) 用可迭代对象初始化一个字节数组 bytearray(整数可迭代对象) 用可迭代对象初始化一个字节数组 bytearray(字符串, encoding='utf-8') 用字符串的转换码生成一个字节数组 - bytearray 运算
+ += * *= < <= > >= == != in not in 索引和切片- len(x)
- max(x)
- min(x)
- sum(x)
- any(x)
- all(x)
- 字节数组支持索引和切片的赋值操作,规则同列表的索引和切片赋值规则
ba = bytearray(b'aBCDEfG) ba[0] = 65 ba[-2] = 70
- bytearray 方法
方法名 说明 BA.clear() 清空 BA.append(n) 追加一个字节(n为0~255的整数) BA.remove(value) 删除第一个出现的字节,如果没有出现,则触发VelueError错误 BA.reverse() 字节顺序反转 BA.decode(encoding='utf8') 解码为字符串 BA.find(sub[, start[, end]]) 查找sub