高阶函数与柯里化new

本文介绍了Python中的高阶函数概念,包括函数作为一等公民的特性,以及如何定义和使用高阶函数。文章通过具体示例讨论了counter函数是否为高阶函数,并引导读者实现自定义的sort函数,探讨sorted、filter和map的实现原理。最后,文章详细解释了柯里化的概念,展示了如何将一个接受两个参数的函数转换为接受一个参数的柯里化函数。

高阶函数

一等公民

函数在Python是一等公民(First-Class Object)

函数也是对象,是可调用对象

函数可以作为普通变量,也可以作为函数的参数、返回值

高阶函数

高阶函数(High-order Function)

数学概念 y = f(g(x))

在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数

接受一个或多个函数作为参数

输出一个函数

观察下面的函数定义,回答问题

def counter(base):

	def inc(step=1):

		base += step

		return base

	return inc

请问counter是不是高阶函数

上面代码有没有问题?如果有,如何改进

如何调用以完成计数功能

f1 = counter(5)和f2=counter(5),请问f1和f2相等吗?

练习:自定义sort函数

仿照内建函数sorted,请自行实现一个sort函数(不用使用内建函数),能够为列表元素排序

思考:通过练习,思考sorted函数的实现原理,map、filter函数的实现原理

思路:

内建函数sorted函数,它返回一个新的列表,可以设置升序或降序,可以设置一个用于比较的函数(自定义 函数也要实现这些功能)

新建一个列表,遍历原列表,和新列表中的当前值依次比较,决定带插入数插入到新列表的什么位置 实现

请问下面的函数是什么排序?代码还能怎么改变

def sort(iterable, *, key=None, reverse=False):

	newlist = []

		for x in iterable:

			for i, y in enumerate(newlist):

				if x > y: 
                    newlist.insert(i, x)
					break

				else: # 不大于,说明是最小的,尾部追加

					newlist.append(x)

		return newlist

x > y 或 x < y能控制什么

这个算法是如何实现排序的

** **

进一步实现reverse参数

def sort(iterable, *, key=None, reverse=False):

	newlist = []

	for x in iterable:

		for i, y in enumerate(newlist):

				comp = x > y if reverse else x < y # 实现reverse参数

				if comp: # x > y立即插入,说明y小被挤向右边。 
                    newlist.insert(i, x)

                    
					break

				else: # 不大于,说明是最小的,尾部追加

					newlist.append(x)

			return newlist

** **

进一步实现key参数功能

def sort(iterable, *, key=None, reverse=False):

newlist = []

for x in iterable:

cx = key(x) if key else x

for i, y in enumerate(newlist):

cy = key(y) if key else y

comp = cx > cy if reverse else cx < cy # 实现reverse参数

if comp: # x > y立即插入,说明y小被挤向右边。 换成 x < y是什么意思? newlist.insert(i, x)

break

else: # 不大于,说明是最小的,尾部追加

newlist.append(x)

return newlist

内建高阶函数

排序sorted

定义 sorted(iterable, *, key=None, reverse=False) - >list ,不在赘述

sorted(lst, key=lambda x:6-x) # 返回新列表

list.sort(key=lambda x: 6-x) # 就地修改

过滤filter

定义 filter(function, iterable)

对可迭代对象进行遍历,返回一个迭代器

function参数是一个参数的函数,且返回值应当是bool类型,或其返回值等效布尔值。

function参数如果是None,可迭代对象的每一个元素自身等效布尔值

list(filter(lambda x: x%3==0, [1,9,55,150,-3,78,28,123]))

list(filter(None, range(5)))

list(filter(None, range(-5, 5)))

映射map

定义 map(function, *iterables) - > map object

对多个可迭代对象的元素,按照指定的函数进行映射

返回一个迭代器

list(map(lambda x: 2*x+1, range(10)))

dict(map(lambda x: (x%5, x), range(500)))

dict(map(lambda x,y: (x,y), ‘abcde’, range(10)))

** **

柯里化**

指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参 数为参数的函数

z = f(x, y) 转换成 z = f(x)(y)的形式

例如

def add(x, y):

return x + y

原来函数调用为 add(4, 5) ,柯里化目标是 add(4)(5) 。如何实现?

每一次括号说明是函数调用,说明 add(4)(5) 是2次函数调用。

add(4)(5)

等价于

t = add(4)

t(5)

也就是说add(4)应该返回函数。

def add(x):

def _add(y):

return x + y

return _add

add(100, 200)

通过嵌套函数就可以把函数转成柯里化函数。

** **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值