Python函数式编程
来源:互联网 发布:电子券怎么在淘宝使用 编辑:程序博客网 时间:2024/06/06 15:01
参数类型:func(*args, **kw)万能的
1、必要参数;
2、默认参数:定义时给一个默认值;
3、可变参数:*开头
4、关键字参数:**开头
5、命名关键字参数:*后面的参数作为命名范围
6、参数组合:必选参数、默认参数、可变参数、命名关键字参数、关键字参数;
函数式编程(是可以把函数当做参数传递,并且可以把函数retrun的编程方式)
1、变量名可以指向函数(java只能指向基本数据类型或者引用数据类型);
>>> f = abs>>> f<built-in function abs>
2、函数名也是变量
a)我们可以将函数abs赋予别的对象,这时候就不能通过abs调用abs()函数了,只有重启python环境才会恢复;
3、传入函数
a)函数作为参数传入函数;
>>> def add(x,y,f):... return f(x)+f(y)...>>> add(-1,-9,abs)>10
Map/Reduce(python内创建map和reduce函数)
1、map()接受两个参数一个函数,一个iterable,并把结果作为新的iterator返回;
>>> def f(x): ... return x * x ... >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]
2、reduce()reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数;
例:reduce把结果继续和序列的下一个元素做累积计算,其效果如下:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
实际代码:
>>> from functools import reduce >>> def add(x, y): ... return x + y ... >> reduce(add, [1, 3, 5, 7, 9]) 25
{}[]会对应list里的元素取出字典里的值,list里只能有一个值;
Map/Reduce会把str类型视为list单个字符进行处理;如下
>>> from functools import reduce>>> def fn(x, y):... return x * 10 + y...>>> def char2num(s):... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]...>>> reduce(fn, map(char2num, '13579'))13579
处理过程为:map方法把‘13579’拆分为单个元素去匹配char2num里面的元素取出来,然后返回一个list,然后就是reduce登场了;
Filter(filter())
1、传入一个函数和一个序列,根据函数但会的是true还是false来决定是是否保留还是会丢弃该元素;(TRUE保留反之删除)
2、Lambda表达式来创建匿名函数;
Sorted(排序sorted())
1、两种用法:
a)普通用法:sorted(list)默认从小到大;
b)高阶用法:stored(list,key=xx):key指定的函数作用于list上的每一个函数再进行排序(注意:最终的结果list的值不会改变);
c)字符串的比较默认是按照ASCII值进行排序;
d)进行反向排序只需要在key后面加上reverse=True就可以了,当有多个函数时用“,”分开;
返回函数
1、可以将函数作为参数,也可以将函数作为返回值进行返回(当返回的是一个函数的时候,该函数并未执行不是一个确切的值,只有再次调用返回的函数时才会得到确切的值)
闭包
1、返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
2、如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变;也可用lambda改写
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fsf1, f2, f3 = count()变化后如下:def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()return fs
匿名函数(lambda)
只能有一个表达式,不用写return,返回值就是该表达式的结果。
装饰器(decorator)
1、借助Python的@语法
一个完整的装饰器代码如下:
import functoolsdef log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
2、若decorator本身需要传参数则只需要再加一个返回decorator的高阶函数即可;
偏函数(由functools提供)
1、进制转换int(_,base)base为默认参数值默认为10;
2、functools.partial就是帮助我们创建一个偏函数的,代码如下:
>>> import functools>>> int2 = functools.partial(int, base=2)>>> int2('1000000')64
functools.partial的作用就是把一个函数的参数给固定住
- python函数式编程
- Python 函数式编程
- python 函数式编程
- python函数式编程
- Python:函数式编程
- Python函数式编程
- python 函数式编程
- python函数式编程
- python函数式编程
- python-函数式编程
- python 函数式编程
- python函数式编程
- python函数式编程
- Python--函数式编程
- Python: 函数式编程
- Python函数式编程
- python 函数式编程
- Python函数式编程
- 四旋翼飞行器的控制规律及算法实现
- NewsFragmentTabHost 导航栏
- 最长公共子串 后缀自动机
- Java Web开发中路径问题小结
- Java创建内部类对象
- Python函数式编程
- 安卓JNI/NDK开发3(进阶 在C代码中调用java方法)
- centos7.2+zabbix3.2+sedmail邮件告警
- magento 2.1.4 url出现版本号,怎样解决?
- 类继承中的一个知识点
- Codeforces 768C Jon Snow and his Favourite Number
- MongoDB replication (1)
- 【Android】用RecycleView实现可以横向滚动的ListView效果
- Navicat11全系列激活(注册机)