python 随记(4)

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类型,它们表示一个惰性计算的序列;

迭代器只可以向前获取数据

总结:

函数式编程的优点:

  1. 在数学上验证一个程序的正确性,所以函数式编程在人工智能领域应用较多
  2. 模块化,把解决问题的方案划分为N个模块
  3. 组合和复用

缺点:

  1. 有些难
  2. 比较倾向于某个适用方向

你可能感兴趣的:(python 随记(4))