这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/107858057
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!
写在开头的话
- 请记住:实践是掌握知识的最快方法
- 如果你只是怀着看看的态度去快速浏览文章,而不去认认真真的把文章里面讲的任何一个知识点去实践一遍,那么你永远也掌握不了它
- 生命不息,折腾不止!
Python 高阶函数、柯里化
00. 高阶函数概念
First Class Object
- 函数在
Python
中是一等公民 - 函数也是对象,可调用的对象
- 函数可以作为普通变量、参数、返回值等等
- 函数在
- 高阶函数
- 数学概念
y=g(f(x))
- 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
- 接受一个或多个函数作为参数
- 输出一个函数
- 数学概念
- 写一个函数实现程序的计数功能
def couter(base):
def inc(step=1):
nonlocal base
base += step
return base
return inc
if __name__ == "__main__":
foo = couter(10)
foo1 = couter(10)
print("foo1 is foo:", foo1 is foo)
print("foo1(1):", foo1(1))
print("foo1(1):", foo1(1))
print("foo(1):", foo(1))
print("fo0(1):", foo(1))
上面的
foo1
和foo
,每次往其中加入一个参数,那么就自动的加上这个参数。foo
和foo1
不相等。因为它们引用的是不同函数里面的counter
函数
01. 自定义sort函数
- 排序问题
- 仿照内建函数
sorted
,请自行实现一个sort
函数(不使用内建函数),能够为列表元素排序
- 仿照内建函数
- 思路
- 内建函数
sorted
函数是返回一个新的列表,可以设置升序或降序,可以设置一个排序的函数。 自定义的sort
函数也要实现这个功能
- 内建函数
- 新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中
- 代码演示
def my_sort(iterable, key=lambda a,b:a<b, reverse=False):
ret = []
for i in iterable:
for j, k in enumerate(ret):
flag = key(k, i) if reverse else key(i, k)
if flag:
ret.insert(j, i)
break
else:
ret.append(i)
return ret
if __name__ == "__main__":
list1 = [1, 4, 6, 7, 8, 9]
tuple1 = (3, 5, 6, 7, 8, 9)
print(tuple(list1))
print(list(tuple1))
print(my_sort(list1))
print(my_sort(list1, reverse=True))
- 运行结果
(1, 4, 6, 7, 8, 9)
[3, 5, 6, 7, 8, 9]
[1, 4, 6, 7, 8, 9]
[9, 8, 7, 6, 4, 1]
- 我的思路
- 自定义一个函数,函数参数能够接收可迭代元素、和
reverse
值的设置,同时可迭代元素是什么类型,便返回什么类型。 - 函数内部自己冒泡排序,然后根据
reverse
的值,自己决定冒泡排序的比较方式 - 返回一个新的可迭代元素,对原来的可迭代元素不做修改
- 演示代码
import copy
def my_sorted(iterable_arg, reverse=False):
iterable = copy.deepcopy(iterable_arg)
is_tuple = False
if type(iterable) is tuple:
iterable = list(iterable)
is_tuple = True
for i in range(len(iterable)):
for j in range(1, len(iterable) - i):
if not reverse:
if iterable[j-1] > iterable[j]:
iterable[j], iterable[j - 1] = iterable[j - 1], iterable[j]
else:
if iterable[j - 1] < iterable[j]:
iterable[j], iterable[j - 1] = iterable[j - 1], iterable[j]
if is_tuple:
return tuple(iterable)
else:
return iterable
if __name__ == "__main__":
print(my_sorted([12, 56, 78, 89, 34, 1, 88, 23, 4]))
print(my_sorted((1, 0, 3, -1, 90, 23, 89, 10)))
print(my_sorted((1, 0, 3, -1, 90, 23, 89, 10), reverse=True))
- 运行结果
[1, 4, 12, 23, 34, 56, 78, 88, 89]
(-1, 0, 1, 3, 10, 23, 89, 90)
(90, 89, 23, 10, 3, 1, 0, -1)
02. 内建函数-高阶函数
sorted(iterable[, key][, reverse])
- 排序
- 返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为
key
定义的函数,reverse
表示是否排序翻转
filter(function, iterable) --> filter object
- 过滤数据
map(func, *iterables) --> map object
- 映射
filter(function, iterable)
- 过滤可迭代对象的元素,返回一个迭代器
function
,具有一个参数的函数,返回bool
- 例如,过滤出数列中能被
3
整除的数字 list(filter(lambda x: x%3==0, [1,9,55,150,-3,78,28,123]))
map(function, *iterables) --> map object
- 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
list(map(lambda x:2*x+1, range(5)))
dict(map(lambda x: (x%5,x) , range(500)))
- 内建函数的演示代码
print(list(filter(lambda x: x % 3 == 0, [23, 12, 56, 12, 90, 3, 2, 5, 8])))
print(list(map(lambda x:4*x+1, range(10))))
print(dict(map(lambda x:("x"+str(x), 2*x+1), range(10))))
- 运行结果
[12, 12, 90, 3]
[1, 5, 9, 13, 17, 21, 25, 29, 33, 37]
{'x0': 1, 'x1': 3, 'x2': 5, 'x3': 7, 'x4': 9, 'x5': 11, 'x6': 13, 'x7': 15, 'x8': 17, 'x9': 19}
03. 柯里化Currying
- 柯里化
- 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
z = f(x, y)
转换成z = f(x)(y)
的形式
- 举例
- 将加法函数柯里化
def add(x, y):
return x + y
- 举例
- 将加法函数柯里化
def add(x, y):
return x + y
- 转换如下
def add(x):
def _add(y):
return x+y
return _add
add(5)(6)
- 举例
- 将下列加法函数柯里化
def num_add(x=0, y=0, z=0):
return x+y+z
- 转换如下
def add(x):
def _add(y):
def _add1(z):
return x+y+z
return _add1
return _add
写在最后的话:
- 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
- 欢迎关注我的CSDN博客,IDYS’BLOG
- 持续更新内容:
linux基础 | 数据通信(路由交换,WLAN) | Python基础 | 云计算 - 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
- 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!