python中的高阶函数

一、迭代器

概念:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的。
特征:
不依赖于索引,而通过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值