迭代器 Iterator
迭代器是访问可迭代对象的工具(对象)
什么是迭代器
迭代器是指用iter(obj) 函数返回的对象(实例)
迭代器可以用next(it) 函数获取可迭代对象的数据
迭代器相关函数
iter(iterable) 从可迭代对象中返回一个迭代器, iterable 必须是一个能提供一个迭代器的对象
next(iterator) 从迭代器iterator中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常通知
说明:
迭代器只能往前取值,不能后退
用iter 函数可以返回一个可迭代对象的迭代器
作用:
可迭代对象可用于
for 语句
列表推导式
示例:
L = [2, 3, 5, 7]
it = iter(L) # 让可迭代对象L 提供一个迭代器
next(it) # 2
next(it) # 3
next(it) # 5
next(it) # 7
next(it) # StopIteration 异常通知
it = iter(range(1, 10, 3))
next(it) # 1
next(it) # 4
next(it) # 7
next(it) # StopIteration
示列:
用while 语句遍历列表L中的全部元素
L = [2, 3, 5, 7]
见iterator.py
练习:
有一个集合:
xiyou = {'唐僧', '悟空', '八戒','沙僧'}
用for 语句来遍历所有元素如下:
for x in xiyou:
print(x)
else:
print("遍历结束")
请将上面的for语句改写为while语句及迭代器实现
生成器 Generator (python 2.5 及之后)
什么是生成器
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象
生成器有两种:
1. 生成器函数
2. 生成器表达式
生成器函数定义:
含有语句的函数是生成器函数,此函数被调用将返回一个生成器对象
注: yield 翻译为(产生或生成)
yield 语句
语法:
yield 表达式
说明:
yield 用于def 函数中,目的是将此函数作为生成器函数使用
yield 用来生成数据,供迭代器的next(it) 函数使用
示例见:
yield.py
生成器函数说明:
1. 生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象
2. 生成器函数调用 return 会触发一个StopIteration异常
# 用生成函数生成一系列从0开始的整数, 示例见:
myinteger.py
练习:
写一个生成器函数myeven(start, stop),用来生成从start开始,到stop结束区间内的一系列偶数
def myeven(start, stop): # 不包含stop
.... 此处自己实现
it = iter(myeven(5, 10))
print(next(it)) # 6
print(next(it)) # 8
evens = list(myeven(10, 20))
print(evens) # [10, 12, 14, 16, 18]
for x in myeven(21, 30):
print(x) # 22 24 26 28
生成器表达式:
语法:
(表达式 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
看程序执行结果有什么不同:
1) 程序1
L = [2, 3, 5, 7]
lst = [x + 1 for x in L]
it = iter(lst)
print(next(it)) # 3
L[1] = 30
print(next(it)) # 4
2) 程序2
L = [2, 3, 5, 7]
lst = (x + 1 for x in L)
it = iter(lst)
print(next(it)) # 3
L[1] = 30
print(next(it)) # 31
迭代工具函数:
作用:
生成一个个性化的可迭代对象
函数名 函数说明
zip(iter1, iter2, iter3, ....) 返回一个zip对象,此对象用于生成一个元组,此元组的中的元素分别由iter1,iter2可迭代对象中的元素构成(元组个数由最小的可迭代对象决定)
enumerate(iterable, start=0) 生成带索引的枚举对象,返回的迭代类型为索引-值对 (index-value) 对, 默认索引从零开始,也可用start指定
示例:
numbers = [10086, 10000, 10010, 95588]
names = ['中国移动', '中国电信', '中国联通']
for t in zip(numbers, names):
print(t)
for n, a in zip(numbers, names): # 等同于序列赋值
print(a, '的客服号码是:', n)
for t in zip(range(2), numbers, names):
print(t)
d = dict(zip(numbers, names)) # ???
for t in enumerate(names):
print(t) # (0, '中国移动') ....
for t in enumerate(names, 20000):
print(t) # (20000, '中国移动') ....
练习:
写一个程序,读入任意行文字,当输入空行时结束输入
打印带有行号的输入结果
如:
请输入:hello
请输入:world
请输入:python
请输入:<回车>
输入如下:
第1行: hello
第2行: world
第3行: python
问题:
序列:
list, str, tuple, bytes, bytearray
1k=1024bytes 1m=1024k
字节串 bytes (也叫字节序列)
作用:
存储以字节为单位的数据
说明:
字节串是不可变的字节序列
字节是0~255的整数
字节:
字节是由8个位组成的数据单位,是计算机进行数据管理的单位
字节使用0-255范围内的整数表示
创建空字节串的字面值
b = b'' b 绑定空字节串
b = b"" b 绑定空字节串
b = b'''''' b 绑定空字节串
b = b"""""" b 绑定空字节串
创建非空字节串的字面值
b = b'ABCD'
b = b'\x41\x42'
字节串的构造函数bytes
bytes() 生成一个字的字节串,等同于b''
bytes(整型可迭代对象) 用可迭代对象初始化一个字节串
bytes(整数n) 生成n个值为0的字节串
bytes(字符串, encoding='utf-8') 用字符串的转换编码生成一个字节串
例:
b = bytes()
b = bytes(range(0, 255))
b = bytes(10)
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~65535或更大)
str 与 bytes转换
编码(encode)
str ----------> bytes
b = s.encode(encoding='utf-8')
解码(decode)
bytes -------------> str
s = b.decode(encoding='utf-8')
str tuple dict frozenset set bytes bytearray
字节数组 bytearray
可变的字节序列
创建函数bytearray
bytearray() 创建字节数组
bytearray(可迭代对象) 同bytes(可迭代对象)
bytearray(整数n) ...
bytearray(字符串, encoding='utf-8')
运算操作:
+ += * *=
比较运算: <<= >>= == !=
in / not in
索引 index / 切片 slice
(字节数组支持索引和切片赋值,规则同列表的索引和切片赋值规则)
字节数组的方法:
详见:
help(bytearray)
ba.clear()
ba.append(n) 追加一个字节(n为0-255的整数)
ba.remove()
ba.reverse() 字节顺序反转
ba.decode(encoding=’utf-8’) #解码为字符串
ba.find(sub[,start]) 查找sub