1. 匿名函数
def f(x):
return x*x
c=lambda x: x*x
print (f(2))
>>> 4
print (c(2))
>>> 4
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数.
2. 偏函数
注意和数学中的偏函数不一样
int()函数可以把字符串转为整数,默认情况下抓为十进制的整数
print (int("100")) #123
int()函数还可以接收第二个base参数,可以做到N(2<=N<=36)进制的转换
print (int("100",base=2)) #4
如果批量转换二进制,可以定义一个函数
def int2(x,base=2):
return int(x,base)
而偏函数做的就是把函数的某些参数固定住,这样不需要额外的定义另一个函数,例如:
import functools
int2 = functools.partial(int, base=2) #注意这里的int是一个函数
int2("1000") #8
但是你又可以手动指定固定的参数,例如(接上代码):
int2("1000",base=10) #1000
3. 迭代器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
from collections import Iterable
from collections import Iterator
isinstance([],Iterable) #True
isinstance({},Iterable) #True
isinstance("abc",Iterable) #True
isinstance((1,2,3),Iterable) #True
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
from collections import Iterable
from collections import Iterator
isinstance([],Iterator) #False
isinstance({},Iterator) #False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
from collections import Iterable
from collections import Iterator
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
Iterator可作用与next()函数
list=[1,2,3]
a=iter(list)
a.next() #1
a.next() #2
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
迭代器只可以向前获取数据
总结:
函数式编程的优点:
- 在数学上验证一个程序的正确性,所以函数式编程在人工智能领域应用较多
- 模块化,把解决问题的方案划分为N个模块
- 组合和复用
缺点:
- 有些难
- 比较倾向于某个适用方向
网友评论