廖雪峰讲python高阶函数求导_8.Python(高阶函数,内置函数)

一、高阶函数

A.函数式编程

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

B.高阶函数

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

C.匿名函数

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:

f = lambda x: x *xprint(f)print(f(5))

1940467-20200914214715743-1586106662.png

D.map()函数

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

deff(x):return x *x

r= map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])print(list(r))

1940467-20200429214211067-1613678736.png

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x*x,还可以计算任意复杂的函数。

num = [1, 2, 3, 4]

res = map(lambda x: x+1, num)

print(list(res))

1940467-20200429214359341-949447205.png

E.reduce()

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算.

from functools importreduce

num_l= [1, 2, 3, 100]print(reduce(lambda x, y: x+y, num_l, 5)) #5是初始值

print(reduce(lambda x, y: x+y, num_l))

1940467-20200430154319214-296129677.png

F.filter()

Python内建的filter()函数用于过滤序列。

和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

删掉偶数,保留奇数

defis_odd(n):return n % 2 == 1

print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])))

1940467-20200430154808772-1006047093.png

movie_people = ['alex_sb', 'wupeiqi_sb', 'linhaifeng', 'yuanhao_sb']print(list(filter(lambda n: not n.endswith('sb'), movie_people)))

1940467-20200430155147557-1840417177.png

G.匿名函数(这段完全抄的廖雪峰老师的)

当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。

1.计算一个列表中每个元素的平方

print(list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])))

1940467-20200606085404147-2084761907.png

可以看出 lambda x:x*x 可以等效为

deff(x):return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

2、用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:

f = lambda x: x *xprint(f)print(f(5))

1940467-20200606085918148-872476260.png

同样,也可以把匿名函数作为返回值返回,比如:

defbuild(x, y):return lambda: x * x + y * y

二、内置函数

补充几个上面没有的

name='你好'

print(bytes(name,encoding='utf-8'))print(bytes(name,encoding='utf-8').decode('utf-8'))print(bytes(name,encoding='gbk'))print(bytes(name,encoding='gbk').decode('gbk'))

1940467-20200430164123132-887046744.png

2.

print(bin(10))#10进制->2进制

print(hex(12))#10进制->16进制

print(oct(12))#10进制->8进制

1940467-20200430164312924-2119549606.png

3.zip()函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

print(list(zip(('a','n','c'),(1,2,3))))print(list(zip(('a','n','c'),(1,2,3,4))))print(list(zip(('a','n','c','d'),(1,2,3))))

1940467-20200606084326190-220941999.png

4.max(),min()

(1) 类型为字符串,返回最大值

a='1,2,3,4'

print(max(a))

1940467-20200606095306245-979287658.png

类型为列表(里面组成元素相同)同理

不同类型不能比较,比如一个字符和一个整形是无法比较的

(2)与zip()结合使用

age_dic={'alex_age':18,'wupei_age':20,'zsc_age':100,'lhf_age':30}print(list(max(zip(age_dic.values(),age_dic.keys()))))

1940467-20200606095857196-1041664320.png

默认比较的是字典的key

print(max(age_dic))

max([(1,2),(2,3),(3,4)])

按照元素里面元组的第一个元素的排列顺序,输出最大值(如果第一个元素相同,则比较第二个元素,输出最大值)据推理是按ascii码进行排序的

(3)max()函数当传入一个可迭代对象,比如列表,则函数内部可自己进行循环,取出列表中的元素,然后进行比较大小。

people =[

{'name': 'alex', 'age': 1000},

{'name': 'wupei', 'age': 10000},

{'name': 'yuanhao', 'age': 9000},

{'name': 'linhaifeng', 'age': 18},

]print(max(people, key=lambda dic: dic['age']))#这个程序相当的绕,不要脸,不好看,而且我也不知道我理解的对不对#首先max()函数将people这个列表内部循环变成了 people[0],people[1],people[2],people[3]#然后 把这些东西扔到后面的匿名函数,顺利取出age这个key下的value,#最后,就开始进行比较,看到10000最大,打印出他所在的这个字典,也就是people列表中的一个元素######最重要的是,我不知道为什么会这样,可能是固定用法,先死记住吧

1940467-20200606103452317-1497081911.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值