Python入门篇-高阶函数

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.高级函数 

1>.First Class Object

    函数在Python中是一等公民
函数也是对象,可调用的对象
函数可以作为普通变量,参数,返回值等等

2>.高阶函数

    数学概念:y=g(f(x))
在数学和计算机科学中,高阶函数应当是至少满足下面一条条件的函数
接收一个或多个函数作为参数
输出一个函数对象

3>.计数器

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def counter(base):
def inc(step=1):
nonlocal base #这里声明base不在inc作用域内(是counter内部作用域中的一个变量),当腰使用base可以去它上级作用域查找,但是不能去全局作用域查找哟~
base += step
return base
return inc f1 = counter(5) f2 = counter(5) print("id(f1) = {} ,id(f2) = {} ,{}".format(id(f1),id(f2),f1 == f2)) print("f1() = {}".format(f1()))
print("f2() = {}".format(f2())) #以上代码执行结果如下:
id(f1) = 42081272 ,id(f2) = 42081408 ,False
f1() = 6
f2() = 6

二.自定义sort函数

1>.排序问题

排序问题:
  仿照内奸函数sorted,请自行实现一个sort函数(不使用内建函数) 思路:
  内建函数sorted函数是返回一个新的列表,可以设置升序或降序,可以设置一个排序的函数。内自定义sort函数也要实现这个功能。
  新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中。  
思考:
  sorted函数的实现原理,扩展到map,filter函数的实现原理。

2>.sort函数实现

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def sort(iterable,reverse = False):
list_1 = []
for x in iterable:
for index, y in enumerate(list_1):
flag = x > y if reverse else x < y
if flag: # 找到大的就地插入。如果换成x < y呢,函数什么意思呢?
list_1.insert(index,x) # 降序
break
else: # 不大于,说明是最小的,尾部追加
list_1.append(x)
return list_1 src = [1,2,5,4,2,3,5,6] dest = sort(src) print("src = {}".format(src))
print("dest = {}".format(dest))
print("dest = {}".format(sort(src,False)))
print("dest = {}".format(sort(src,True))) #以上代码执行结果如下:
src = [1, 2, 5, 4, 2, 3, 5, 6]
dest = [1, 2, 2, 3, 4, 5, 5, 6]
dest = [1, 2, 2, 3, 4, 5, 5, 6]
dest = [6, 5, 5, 4, 3, 2, 2, 1]

版本一

#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def comp(a,b,reverse):
return a > b if reverse else a < b def sort(iterable,reverse = False):
list_1 = []
for x in iterable:
for index, y in enumerate(list_1):
if comp(x,y,reverse): # 找到大的就地插入。如果换成x < y呢,函数什么意思呢?
list_1.insert(index,x) # 降序
break
else: # 不大于,说明是最小的,尾部追加
list_1.append(x)
return list_1 src = [1,2,5,4,2,3,5,6] dest = sort(src) print("src = {}".format(src))
print("dest = {}".format(dest))
print("dest = {}".format(sort(src,False)))
print("dest = {}".format(sort(src,True))) #以上代码执行结果如下:
src = [1, 2, 5, 4, 2, 3, 5, 6]
dest = [1, 2, 2, 3, 4, 5, 5, 6]
dest = [1, 2, 2, 3, 4, 5, 5, 6]
dest = [6, 5, 5, 4, 3, 2, 2, 1]

版本二

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def sort(iterable,key = lambda a,b:a<b,reverse = False):
list_1 = []
for x in iterable:
for index, y in enumerate(list_1):
flag = key(x,y) if reverse else key(y,x)
if flag: # 找到大的就地插入。如果换成x < y呢,函数什么意思呢?
list_1.insert(index,x) # 降序
break
else: # 不大于,说明是最小的,尾部追加
list_1.append(x)
return list_1 src = [1,2,5,4,2,3,5,6] dest = sort(src)
dest2 = sort(src,reverse=True) print("src = {}".format(src))
print("dest = {}".format(dest))
print("dest2 = {}".format(dest2)) #以上代码执行结果如下:
src = [1, 2, 5, 4, 2, 3, 5, 6]
dest = [6, 5, 5, 4, 3, 2, 2, 1]
dest2 = [1, 2, 2, 3, 4, 5, 5, 6]

三.内建函数-高阶函数

1>.sorted(iterable[, key][, reverse]) 排序

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
sorted(iterable[, key][, reverse]) 排序
返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否排序翻转
""" src = [1, 2, 5, 4, 2, 3, 5, 6] # 返回新列表
dest = sorted(src,key=lambda x:6-x)
dest2 = sorted(src,key=lambda x:6-x,reverse=True) print("src = {}".format(src))
print("dest = {}".format(dest))
print("dest2 = {}".format(dest2)) #以上代码执行结果如下:
src = [1, 2, 5, 4, 2, 3, 5, 6]
dest = [6, 5, 5, 4, 3, 2, 2, 1]
dest2 = [1, 2, 2, 3, 4, 5, 5, 6]

2>.filter(function, iterable) 过滤

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
filter(function, iterable)
过滤可迭代对象的元素,返回一个迭代器
function一个具有一个参数的函数,返回bool
""" src = [1,9,55,150,-3,78,28,123] #例如,过滤出数列中能被3整除的数字
dest = list(filter(lambda x: x%3==0,src)) print("src = {}".format(src))
print("dest = {}".format(dest)) #以上代码执行结果如下:
src = [1, 9, 55, 150, -3, 78, 28, 123]
dest = [9, 150, -3, 78, 123]

3>. map(function, *iterables) --> map object

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
map(function, *iterables) --> map object
对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
""" print(list(map(lambda x:2*x+1, range(5)))) print(dict(map(lambda x:(x%5,x) , range(500)))) #以上代码执行结果如下:
[1, 3, 5, 7, 9]
{0: 495, 1: 496, 2: 497, 3: 498, 4: 499}

四.柯里化Curing

1>.柯里化概述

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

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

2>.通过嵌套函数就可以把函数转换成柯里化函数

 #!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def add(x, y):
return x + y #将加法函数柯里化,转换如下,即:通过嵌套函数就可以把函数转换成柯里化函数
def add2(x):
def _add(y):
return x+y
return _add print(add(10,20)) #普通函数 print(add2(10)(20)) #柯里化函数 #以上代码执行结果如下:
30
30

Python入门篇-高阶函数的更多相关文章

  1. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  2. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  3. Python学习笔记 - 高阶函数

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  4. 匿名函数python内置高阶函数以及递归

    匿名函数 python定义一个函数通常使用def关键词,后面跟函数名,然后是注释.代码块等. def func(): '''注释''' print('from func') 这样就在全局命名空间定义了 ...

  5. python 常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  6. python学习笔记——高阶函数map()

    满足以下两点中任意一点,即为高阶函数: 1.函数接收一个或多个函数作为参数 2.函数返回一个函数 1 描述 用函数和可迭代对象中每一个元素作为参数,计算出新的迭代对象 map() 会根据提供的函数对指 ...

  7. python中的高阶函数

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  8. Python高级教程-高阶函数

    Higher-order function(高阶函数) 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但 ...

  9. python字符串反转 高阶函数 @property与sorted(八)

    (1)字符串反转 1倒序输出 s = 'abcde' print(s[::-1]) #输出: 'edcba' 2 列表reverse()操作 s = 'abcde' lt = list(s) lt.r ...

随机推荐

  1. 使用抓包工具将抓到的接口存放Jmeter中

    1. jmeter工作台新增 HTTP代理服务器.端口设置为:8888 2. 抓包工具上面设置代理服务器地址 3.代理服务器未启动时,抓包工具界面显示无法联网. 4.在Jmeter中点击[启动]HTT ...

  2. SpringBoot 为什么能够自动的注入一些常用的Bean ?

    原文转载至:https://blog.csdn.net/qq_29941401/article/details/79605388 但是我一直没有搞懂druid是怎么自动配置的? 这个是properti ...

  3. vue获取不到后端返回的响应头

    Response.ContentType = EPPlusHelpler.ExcelContentType; Response.Headers.Add("FileName", fi ...

  4. 配置SSH无密码登录【原著】

    环境:两台Centos虚拟机,配置了静态的ip.(详见虚拟机如何配置静态的IP地址的操作步骤) 192.168.75.21192.168.75.22 第一步:为每台服务器配置静态IP地址参见: 虚拟机 ...

  5. MATLAB 代码规范

    标识符命名原则 标识符的名字应当直观,其长度应当符合"最小长度,最大信息量"原则 非矩阵变量 变量名应该以小写字母开头的大小写混合形式 譬如:shadowFadingTable,s ...

  6. Java开发笔记(一百四十二)JavaFX的对话框

    JavaFX的对话框主要分为提示对话框和文件对话框两类,其中提示对话框又分作消息对话框.警告对话框.错误对话框.确认对话框四种.这四种对话框都使用Alert控件表达,并通过对话框类型加以区分,例如Al ...

  7. Java多线程编程(3)--线程安全性

    一.线程安全性   一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作 ...

  8. Go调用Delphi编写的DLL

    参数整数没有问题,但是如果是字符串,要注意几个细节. 记录如下: 1.Delphi定义函数的时候,字符串参数需要使用PChar类型 2.Go传递参数的时候要将字符串转成UTF16的指针,接收的时候采用 ...

  9. 插件部署【BE、BP、UI】

    1.BE插件部署 XML部署位置:D:\yonyou\U9V50\Portal\bin: DLL部署位置:D:\yonyou\U9V50\Portal\ApplicationServer\Libs; ...

  10. 个人Wiki搭建(Gitbook + GitHub Pages)

    工具选择:Gitbook + GitHub Pages 大概流程: 首先在本地编写md文件,然后生成对应的html文件,最后将这些html文件推送到github对应的gitbook仓库. 具体步骤: ...