更多实例:参考:https://blog.csdn.net/u013398034/article/details/78701714

一、高阶函数

  1.可以通过变量指向函数,达到类似别名的效果:

>>> f = abs
>>> f(-10)
10

  2.函数的参数可以是函数,也就是函数可以作为一个入参

def add(x, y, f):
return f(x) + f(y)

  以下介绍几个高阶函数

  map、reduce

    这两个函数就不赘述了。和scala的功能类似,不过用法不一样,它接收两个参数,第一个是函数f,第二个是Iterable。并将计算结果作为新的Iterator返回,惰性的Iterator通过list便可以计算出结果了:

def f(x):
return x + 1 r = map(f, [1, 2, 3, 4, 5])
print(list(r))

    reduce入参类似map,但是它的f是接收两个参数,并且需要导包。并将结果作为下一次的输入,表示起来就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
from functools import reduce

def f(x, y):
return x + y r = reduce(f, [1, 2, 3, 4, 5])
# 注意这里不需要list包装了,因为返回的不是Iterator
print(r)

    filter

  和scala的filter也是类似了,返回Ture的留下,其它过滤掉。其他的入参和返回值与map相同

def f(x):
return x % 2 == 0 r = filter(f, [1, 2, 3, 4, 5])
print(list(r))

   sorted

    sorted可以直接对list进行比较

>>> sorted([-1, 3, 2, 6])
[-1, 2, 3, 6]

    也可以传入一个key的函数进行处理:

    key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

sorted([36, 5, -12, 9, -21], key=abs)

    如果是对字符串比较,默认是比较ASCII码,也就是Z<a;要忽略大小写,可以通过传入的key函数对每个元素进行操作:

sorted(['img', 'ang', 'Zbb'], key=str.lower)
['ang', 'img', 'Zbb']

    反向排序,传入reverse参数

sorted(['img', 'ang', 'Zbb'], key=str.lower, reverse=True)
['Zbb', 'img', 'ang']

    一个简单的排序小示例如下:

# -*- coding: utf-8 -*-
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_name(t):
return t[0].lower() def by_score(t):
return t[1] L2 = sorted(L, key=by_name)
L3 = sorted(L, key=by_score, reverse=True)
print(L2)
print(L3)

二、返回函数

   高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

  以惰性求和为例,传统的求和是返回结算的结果,而高阶函数可以返回一个计算的函数,当调用这个返回的函数时才真正计算结果:

# -*- coding: utf-8 -*-
def my_sum(*args):
def sum_in():
s = 0
for i in args:
s += i
return s return sum_in

  直接调用返回计算函数:

f = my_sum(1,2,3,4)
f
<function my_sum.<locals>.sum_in at 0x000002C607E15048>

  f才是真正的计算函数:

f()
10

  // 这里返回的内部函数sum_in引用了外部函数my_sum的参数和局部变量,这也叫Python中的闭包!

三、匿名函数

  也就是我们熟悉的拉姆达表达式了:lambda。Python中的用法如下:(需要显式使用lambda关键字)

list(map(lambda x:x*x, [1,2,3]))
[1, 4, 9]

  其他的lambda表达式不再赘述,和Java、scala一致

四、装饰器

  之前提到的,可以通过变量给函数起别名:

def fun1():
print("100分,100分!") f1 = fun1

  真实名字可以通过.__name__得出:

f1.__name__
'fun1'

  装饰器在其他语言中也比较常见了,这里介绍Python的装饰器。它本质上是一个返回函数的高阶函数:

    使用的方式是通过注解形式进行装饰,而装饰者Log这里接收一个函数,并返回一个函数

# -*- coding: utf-8 -*-
def log(fun):
def wrapper(*args, **kv):
print("被装饰的函数是:%s" % fun.__name__)
return fun(*args, **kv)
return wrapper @log
def func():
print("现在是2018-04-24") func()

  至于装饰者本身需要参数的情况,参考廖老师的博客

五、偏函数

  偏函数有点儿类似原来的默认参数,就是把函数的某些参数给固定住。这样就能快速调用:

    偏函数的功能由functools提供,需要提前导包:

# -*- coding: utf-8 -*-
import functools int2 = functools.partial(int, base=2) int2('')

  以上的偏函数就把int函数的base参数给固定住了,这样int2在进行字符串转换时就会默认转换为2进制了,而不用每次都通过int(str, base=2)来指定了!

Python3入门(六)——函数式编程的更多相关文章

  1. s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

    python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...

  2. JS 学习笔记 (六) 函数式编程

    1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...

  3. 06 . Python3入门之IO编程(文件操作)

    IO编程简介 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口 ...

  4. Python学习札记(二十六) 函数式编程7 修饰器

    修饰器 NOTE 1.函数对象有一个__name__属性,可以拿到函数的名字: #!/usr/bin/env python3 def now(): print('2017/2/19') def mai ...

  5. python学习笔记(六) 函数式编程

    一 函数对象 函数同样可以作为对象复制给一个变量,如下: f = abs; print(f(-10)) f = 'abs'; print(f) def add(a,b,f): return f(a) ...

  6. JavaScript ES6函数式编程(一):闭包与高阶函数

    函数式编程的历史 函数的第一原则是要小,第二原则则是要更小 -- ROBERT C. MARTIN 解释一下上面那句话,就是我们常说的一个函数只做一件事,比如:将字符串首字母和尾字母都改成大写,我们此 ...

  7. Haskell 函数式编程快速入门【草】

    什么是函数式编程 用常规编程语言中的函数指针.委托和Lambda表达式等概念来帮助理解(其实函数式编程就是Lambda演算延伸而来的编程范式). 函数式编程中函数可以被非常容易的定义和传递. Hask ...

  8. Python函数式编程:从入门到走火入魔

    一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...

  9. 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

    本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...

  10. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

随机推荐

  1. CSS中的三种常用定位

    一.相对定位(position:relative) 如果想让一个元素在本来的位置进行一个位移,可以将该元素的定位设置为relative,同时指定相对位移(利用top,bottom,left,right ...

  2. Intellij IDEA添加项目依赖

    在idea的设置中,存在下面几个标签页 Libraies是向idea中添加的jar或者文件夹进入. module是添加具体的项目依赖,后面的选项为部署时是否忽略. artifacts配置打包方式,需要 ...

  3. 将caj文件转化为pdf文件进行全文下载脚本(ubuntu下亲测有用)

    最近ubuntu下caj阅读器,突然崩掉了,而偏偏要准备开题,在网上搜索原因未果,准备放弃时候,突然在网上看到一个脚本,说是很好用,可以在指定页面将caj文件转化为pdf文件,亲测有用,这里直接给出脚 ...

  4. 使用ArcGIS Runtime 100 进行本地GIS数据处理的注意事项

    如下图所示,如果需要使用ArcGIS Runtime 100 进行本地GIS数据处理,则需要依赖Local Server通过发布GP服务实现. 一.ArcGIS Runtime所使用的GPK是有版本限 ...

  5. iOS设计模式-原型模式

    | 导语 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 通过深复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象.这个指定的对象可被称为“原型”对象,也就是通过复制原型 ...

  6. Hive分组取Top N

    Hive在0.11.0版本开始加入了row_number.rank.dense_rank分析函数,可以查询分组排序后的top值   说明: row_number() over ([partition ...

  7. [Android] 状态栏的一些认识

    前段时间遇到几个关于状态栏的问题,又了解了一下状态栏相关的知识,现在做一下记录. 本文地址:http://www.cnblogs.com/rossoneri/p/4316343.html 前戏和问题 ...

  8. linux信息收集篇之sosreport

    sosreport是一个类型于supportconfig 的工具,sosreport是python编写的一个工具,适用于centos(和redhat一样,包名为sos).ubuntu(其下包名为sos ...

  9. UNIX高级环境编程(10)进程控制(Process Control)- 竞态条件,exec函数,解释器文件和system函数

    本篇主要介绍一下几个内容: 竞态条件(race condition) exec系函数 解释器文件    1 竞态条件(Race Condition) 竞态条件:当多个进程共同操作一个数据,并且结果依赖 ...

  10. 第六次作业 orm整合 接口

    结合以前一个项目,将普通的jdbc进行了相关整合,全部改写成了hibernate接口 项目名称:短视频分享平台 主要功能:用户模块:注册.登录.编辑资料.查看用户相关 分类模块:分类添加.查看 视频共 ...