11.6 next():主要用于获取迭代器中的下一个元素
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]def is_even(number):return number % 2 == 0iterator = filter(is_even, arr)
# 迭代器的元素是一个一个往外"蹦" 一个一个计算的 而不是全部计算出来
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
# print(next(iterator)) # StopIteration
# 当一个迭代器被next用完时,则迭代器失效,因为已经计算完成
# 如果还想遍历元素,那么就只能重新创建新的迭代器
# 此时的iterator已经没有元素可以计算了!iterator = filter(is_even, arr)
# next(iterator, default)
# default 当迭代器被耗尽时,则返回这个默认值,作为一个结束的标记来使用
# 不能赋值迭代器包含的元素 如果存在 则中断循环的计算
while True:num = next(iterator, 2)if num == 2:breakprint(num)
# 后续依旧可以继续迭代元素,直到迭代器耗尽为止
print(next(iterator))arr = [1,2,3]
arr = [x for x in range(10)] # 列表推导式
# print(next(arr))
# print(next(arr)) # TypeError: 'list' object is not an iterator
arr = (x for x in range(10)) # 列表解析式 -> 迭代器
while True:num = next(arr, -1)if num == -1:breakprint(num)arr = [(x for x in range(10))] # [迭代器对象]
print(arr)arr = list((x for x in range(10)))
print(arr)
11.7 iter() :获取某个可迭代对象的迭代器
arr = [1, 2, 3]
iterator = iter(arr)
# 将一组元素 转为 迭代器
print(next(iterator))
s = {3, 1, 2}
print(s)
iterator = iter(s)
print(next(iterator))dic = {"name": "张三", "age": 18, "height": 180}
print(dic.keys())
# 将所有键的集合封装为一个迭代器
iterator = iter(dic.keys())
print(next(iterator))
print(dic.values())
# 将所有值的集合封装为一个迭代器
iterator = iter(dic.values())
print(next(iterator))for key in dic.keys(): # 实质上也是先将dic.keys()转迭代器再进行遍历 一个一个计算print(key)keys = set(dic.keys())
print(keys)# 传入一个自定义的迭代函数
num = 1def get_number():global numresult = numnum += 1return result# for i in range(10):
# print(get_number())# source 指的就是迭代函数 sentinel 指的是迭代上限
iterator = iter(get_number, 100)
for item in iterator:print(item)
print("此时的num", num)num = 1
iterator = iter(get_number, 10)
lst = list(iterator)
print(lst)
11.8 map():用于可迭代对象中的每个元素应用指代定的函数,并返回一个迭代器
arr = ['A', 'B', 'C', 'D', 'E']def to_lower(letter):return letter.lower()iterator = map(to_lower, arr)
while True:letter = next(iterator, -1)if letter == -1:breakprint(letter)
arr = list(map(to_lower, arr))
print(arr)arr1 = [1, 2, 3, 4]
arr2 = [5, 6, 7]def add(x, y):return x + yarr3 = list(map(add, arr1, arr2))
# 结果以arr1和arr2长度最短的为主
print(arr3)
11.9 reversed() :反转,返回的是一个迭代器,用于逆序遍历,不对原数据进行改变
arr = [1,2,3,4,5,6,7,8,9,10]
arr.reverse() # 列表对象函数 反转 修改原列表
print(arr)arr = [1,2,3,4,5,6,7,8,9,10]
lst = list(reversed(arr)) # 内置函数 反转 新建反转后的列表 不影响原列表
print(lst)
print(arr)
11.10 zip():将多个可迭代对象中对应位置的元素打包成一个个元组,然后返回这些元组组成的迭代器
# 将多个序列拼成元组
arr1 = [1,2,3,4,5]
arr2 = ['A','B','C','D','E']
arr3 = ['a','b','c','d','e']
# 同样以最短为主
iterator = zip(arr1,arr2,arr3)
lst = list(iterator)
print(lst)# 将多个元组解析出多个序列
lst = [(1, 'A', 'a'), (2, 'B', 'b'), (3, 'C', 'c'), (4, 'D', 'd'), (5, 'E', 'e')]
l1,l2,l3 = zip(*lst)
print(l1)
print(l2)
print(l3)