1:Python中,内置函数名相当于一个变量,指向内置函数。所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了。

2:高级函数:Python中,可以把一个函数变量作为函数参数来使用。参数中有函数变量的函数,称之为高阶函数。

map(f,list)函数:定义一个函数f,把f和一个list作为map()的参数,可=可以对list的每一个元素进行f操作,并返回一个新的list。

reduce(f,list,init)函数:对list的元素反复进行f操作,直到list最后一个元素处理完毕。init参数可选,作为reduce计算的初始值。可以用来求和、求积。

filter(f,list)函数:接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

sorted(list)函数可对list进行排序,sorted(list,f)也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。(-1在前).sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较.

3:函数内定义函数与返回函数:Python函数中,可以再定义函数,然后把该内部函数作为返回值return。

返回函数的懒使用:用一个变量接收了函数返回值之后,相当于该变量指向了一个函数。调用该函数很简单,用  接收变量()  的形式即可调用函数。

注意:内层函数引用了外层函数的变量(外层函数参数也算变量),则该内层函数不能移到外层函数的外面去。内层函数使用外层函数的变量并且作为外层函数的返回值的情况称为闭包(Closure)。要正确使用闭包,就要确保引用的外层函数的变量在外层函数返回后不能变,不然返回后的内层函数被调用时就会使用错的参数值。

4:匿名函数:可以用 lambda 参数:表达式 定义一个匿名函数作为高阶函数的参数,表达式的结果就是匿名函数返回值。

5:装饰器

可以定义一个高阶函数,传进来一个函数参数。在高阶函数中,对参数f进行操作上的包装,如:先打印日志,再调用函数f。函数装饰器类比Java中的动态代理

定义装饰器:

def performance(f):
def fn:
对参数函数f进行包装;
return fn;//返回包装过的函数

使用装饰器:

@performance//在需要包装的函数定义前面加 @装饰器名  ,即可把该函数传递给装饰器
def factorial(n):
函数操作 之后,在其他地方调用factorial(n)时,其实是调用装饰器中包装过的方法fn

4:带参数的装饰器

带参数的装饰器内部还包含一个装饰器,外层装饰器有参数,内部装饰器负责包装并返回包装过的函数:

def log(prefix)://外层装饰器,接收参数prefix
def log_decorator(f)://内层装饰器,对函数f进行包装
def wrapper(*args, **kw)://包装函数:自适应任何参数定义的函数,用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用
print '%s %s()...' % (prefix, f.__name__)//使用外层装饰器的参数值
return f(*args, **kw)//调用被包装的函数,注意参数列表
return wrapper//返回包装过的函数
return log_decorator//返回内层装饰器 @log('DEBUG')//定义函数时,使用装饰器并传参
def test():
pass
print test()

5:完善装饰器

使用装饰器包装过函数f后,返回fn。这样在别的地方使用f()时,其实是调用fn(),并且打印f.__name__等函数属性时,其实是fn函数的属性。

为了避免包装后函数f的属性被改变,可以在包装函数前面,通过 @functools.warps(f) 把函数f的一些属性直接赋值给fn的同名属性,使得二者一致。

def log(prefix)://外层装饰器,接收参数prefix
def log_decorator(f)://内层装饰器,对函数f进行包装
@functools.wraps(f)//把参数f的函数名等属性赋值给包装函数wrapper
def wrapper(*args, **kw)://包装函数:自适应任何参数定义的函数,用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用
print '%s %s()...' % (prefix, f.__name__)//使用外层装饰器的参数值
return f(*args, **kw)//调用被包装的函数,注意参数列表
return wrapper//返回包装过的函数
return log_decorator//返回内层装饰器 @log('DEBUG')//定义函数时,使用装饰器并传参
def test():
pass
print test()

6:偏函数

fn = functools.partial(f, 默认参数值):可以指定函数f的一些默认参数值,然后在其他地方使用 fn(参数) 调用函数f 时,就可以不写默认参数,减少代码量。

import functools

def cmp_ignore_case(s1, s2)://定义比较器
return cmp(s1.lower(),s2.lower()) sorted_ignore_case = functools.partial(sorted,cmp=cmp_ignore_case)//定义偏函数,为排序函数指定默认比较器 print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])//调用偏函数进行排序

(可见,函数式编程是以函数为单位、为对象的编程思维,可以把面向对象编程的封装、代理等思想应用到函数式编程中)

Python学习笔记二:函数式编程的更多相关文章

  1. Clojure学习笔记(二)——函数式编程

    定义 “函数式编程”是一种编程范式(programming paradigm),即如何编写程序的方法论.主要思想是把运算过程尽量写成一系列嵌套的函数调用. 举例来说,现在有这样一个数学表达式: (1 ...

  2. python学习笔记011——函数式编程

    1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...

  3. Python学习笔记6 函数式编程_20170619

    廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...

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

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

  5. python学习笔记1 -- 函数式编程之高阶函数 map 和reduce

    我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def  fw(参数)这种方式定义一个函数 python有很多的内置函 ...

  6. Python学习笔记之函数式编程

    python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...

  7. python学习笔记1 -- 函数式编程之高阶函数 sorted排序

    python提供了很强大的内置排序函数,妈妈再也不担心我不会写冒泡排序了呀,sorted函数就是这个排序函数,该函数参数准确的说有四个,sorted(参数1,参数2,参数3,参数4). 参数1 是需要 ...

  8. python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值

    使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...

  9. python学习笔记1 -- 函数式编程之高阶函数 filter

    filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...

  10. python学习笔记(二)、字符串操作

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...

随机推荐

  1. [UI] 精美UI界面欣赏[13]

    精美UI界面欣赏

  2. Android布局分析工具HierarchyView的使用方法

    本文是从这里看到的:http://www.2cto.com/kf/201404/296960.html 如果我们想宏观的看看自己的布局,Android SDK中有一个工具HierarchyView.b ...

  3. Orchard模块开发全接触3:分类的实现及内容呈现(Display)

    一:分类用现有技术怎么实现? 实际就是创建 Query 和 Projection,如果不知道怎么做,参考:Orchard之在前台显式一个属于自己的列表(在这篇里,还进行了稍稍拓展),当然,基础的知道, ...

  4. .Net AppDomain详解(一)

    AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序.AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDom ...

  5. caffe中的学习率的衰减机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Julialove102123/article/details/79200158 根据  caffe/ ...

  6. go语言之进阶篇通过switch实现类型断言

    1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...

  7. [leetcode]Anagrams @ Python

    原题地址:https://oj.leetcode.com/problems/anagrams/ 题意: Given an array of strings, return all groups of ...

  8. 解决ASP.NET页面回车回发的问题

    在asp.net页面中在文本框.按钮等服务器控件上回车都会导致页面回发,网上很多解决方案是使用JS来进行event.keyCode==13判断是否按下的回车键,如果是就event.returnValu ...

  9. Hadoop家族学习路线、实践案例

    作者:Han Hsiao链接:https://www.zhihu.com/question/19795366/answer/24524910来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  10. android 数据加密——加密的概述

    数据加密又称密码学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法.它利 ...