一、迭代器
概念:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的。
特征:
不依赖于索引,而通过next指针迭代所有数据,一次只取一个值,大大节省空间。
1、可迭代对象
可迭代对象分三种: 容器类型数据,range对象,迭代器
setvar = {"a","b","c","d"}
for i in setvar:
print(i)
# dir 获取当前类型对象中的所有成员
"""__iter__ 方法用来判断是否是可迭代性数据"""
lst = dir(setvar)
print(dir("123"))
res = "__iter__" in dir(setvar)
print(res)
运行结果:
如图,是可迭代对象。
2、迭代器
for 循环能够遍历一切可迭代性数据的原因在于,底层调用了迭代器,通过next方法中的指针实现数据的获取
可迭代对象 -> 迭代器 不能够被next直接调用 -> 可以被next直接调用的过程
如果是一个可迭代对象不一定是迭代器
但如果是一个迭代器就一定是一个可迭代对象
1)如何定义一个迭代器
lst = [1,2,3,4,5]
it = iter(lst)
print(it,type(it))
运行结果:
2)如何判断一个迭代器
如果it中含有iter和next两种魔术方法,那么其类型为迭代器。
lst = [1,2,3,4,5]
it = iter(lst)
res = "__iter__" in dir(it) and "__next__" in dir(it)
print(res)
运行结果:
3)如何调用一个迭代器
next在调用迭代器中的数据时,是单向不可逆,一条路走到黑的过程。
lst = [1,2,3,4,5]
it = iter(lst)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
运行结果:
如果继续迭代,会发生StopIteration 报错,停止迭代。
4)重制迭代器
lst = [1,2,3,4,5]
it = iter(lst)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
it = iter(lst)
res = next(it)
print(res)
运行结果:
5).使用其他方式判断迭代器或者可迭代对象
Iterator 迭代器 Iterable 可迭代对象
from … 从哪里 import 引入 …
from collections import Iterator,Iterable
lst = [1,2,3,4,5]
it = iter(lst)
res = isinstance(it,Iterator)
print(res)
res = isinstance(it,Iterable)
print(res)
运行结果:
6).使用其他方式调用迭代器中的数据
for 循环
lst = [1,2,3,4,5]
it = iter(lst)
for i in it:
print(i)
运行结果:
for + next
lst = [1,2,3,4,5]
it = iter(lst)
for i in range(5):
res = next(it)
print(res)
运行结果:
二、高阶函数map
map(func,Iterable)
- 功能:
把Iterable中的数据一个一个拿出来,扔到func中做处理
把处理后的结果放到迭代器中,最后返回迭代器 - 参数:
func:自定义函数
Iterable:可迭代性数据(容器类型数据、range对象、迭代器) - 返回值:
迭代器
#常规写法
lst = ["1","2","3","4"]
lst_new = []
for i in lst:
lst_new.append(int(i))
print(lst_new)
用map高阶函数改写:
lst = ["1","2","3","4"]
it = map(int,lst)
print(list(it))
运行结果:
- 代码解析:
先把"1" 扔到int当中做处理,将强转后的结果扔到迭代器中
然后把"2" 扔到int当中做处理,将强转后的结果扔到迭代器中
然后把"3" 扔到int当中做处理,将强转后的结果扔到迭代器中
然后把"4" 扔到int当中做处理,将强转后的结果扔到迭代器中
最终返回迭代器
在上题中,我们一般有四种获取迭代器值的方法:
1、next
res = next(it)
print(res)
2、for
for i in it:
print(i)
3、for + next
for i in range(3):
res = next(it)
print(res)
4、list强转
print(next(it))
练习:将[1,2,3,4] 转换为[2,8,24,64]
lst = [1,2,3,4]
it=map(lambda n : n << n,lst)
print(list(it))
注:可利用位运算符
运行结果:
三、高阶函数filter
filter(func,iterable)
- 功能: 过滤数据
return True 当前这个数据保留
return False 当前这个数据舍弃 - 参数:
func : 自定义函数
iterable : 可迭代型数据(容器类型数据,range对象,迭代器) - 返回值:
迭代器
在lst = [1,2,3,4,5,6,7,8,9,10]中筛选出所有偶数,并将筛选出的数字添加到一个新列表。
常规写法:
lst = [1,2,3,4,5,6,7,8,9,10]
lst_new = []
for i in lst:
if i % 2 == 0:
lst_new.append(i)
print(lst_new)
运行结果:
用filter高阶函数进行改写(套用lambda表达式,如不清楚可查看之前函数part3中匿名函数相关写法)
lst = [1,2,3,4,5,6,7,8,9,10]
it = filter(lambda n : n % 2 == 0,lst)
print(list(it))
同样可得到以上结果。
四、高阶函数reduce
educe(func,iterable)
功能:计算数据
先把iterable中的前两个值拿出来,扔到func当中做运算,
把计算的结果和iterable中的第三个元素在扔到func当中做运算,
再把结果算出来,和第四个元素做运算,以此类推
直到所有结果运算完毕.返回该结果
参数:
func : 自定义函数
iterable : 可迭代型数据(容器类型数据,range对象,迭代器)
返回值:
计算之后的结果
将列表[5,4,8,8]转为整型5488:
常规写法:
lst = [5,4,8,8]
it = iter(lst)
num1 = next(it)
num2 = next(it)
num = num1 * 10 + num2
for i in it:
num = num * 10 + i
print(num)
用reduce高阶函数进行改写:
from functools import reduce
lst = [5,4,8,8]
res=reduce(lambda x,y:x*10+y,lst)
print(res)
运行结果:
五、高阶函数sorted
sorted(iterable,key=函数,reverse=False)
- 功能:排序
- 参数:
iterable(容器类型数据,range对象,迭代器)
key 指定 自定义函数或 内置函数
reverse : 代表升序或者降序 , 默认是升序(从小到大排序) reverse=False - 返回值:
排序后的结果
lst = [1,2,3,4,5,-90,-4,-1,100]
res = sorted(lst)
print(res)
默认从小到大排序:
运行结果:
reverse进行反转
res = sorted(lst,reverse=True)
print(res)
sort和sorted区别:
(1) sorted可以排序一切容器类型数据, sort只能排列表
(2) sorted返回的是新列表,sort是基于原有的列表进行修改
(3) 推荐使用sorted