参数类型: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 fs
f1, 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 functools
def 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的作用就是把一个函数的参数给固定住