函数式编程语言
纯函数:输出完全依赖输入的函数,不能读写外部变量、没有IO
Python中的相关内置函数:
1. map(函数,迭代器)
将迭代器中的所有内容依次传递给函数,并返回一个迭代器
可以是list...
e.g.
map(lamda x: x*2, [1, 2, 3]) => 返回[1, 4, 9]
2.filter(函数,迭代器)
将函数(迭代器内容)为True的保存到一个迭代器中
e.g.
filter(lamda x: x % 2 == 1, [1, 2, 3]) =>返回[1, 3]
3.list comprehension
e.g.
[n for n in list if (n%2) == 1]
一个微积分的例子:
def d(f):
def calc(x):
dx = 0.0001
return (f(x + dx) - f(x))/dx
return calc
f = lamda x: x**2 + 5 * x + 3
求f的导数:f1 = d(f)
求某处的斜率:f1(2)
类的实例
Python中,类也是有实例的。类的实例包含函数和类属性。
设有类A:
//test.py
class A:
count = 0
def __init__(self)
A.count += 1
def __del__(self)
A.count -= 1
并且有A的实例a
a = A()
//end
我在Python2.7版本的IDLE中运行以上语句
会发生什么?
对类A,会生成一个实例,在内存中我们叫它
A1
根据
A1,会生成实例a,a指向的对象实例我们叫它
a1
现在A.count 是1,即
A1实例中的count为1
此时如果我们退出程序,a不会被立刻回收因此此时A.count仍然为1,sys.getrefcount(a)仍然为2(还有1为传入参数时增加的)
现在再打开test.py运行一次,会发生什么那?
首先,会生成一个新的A的实例,我们叫它
A2吧,
A2的count为0。此时
A1仍然存在
现在运行a = A(),根据
A2生成对象实例,我们称之为
a2。
a2的建立使内存中新的A的实例
A2.count = 1
此时a指向
a2,所以a1这块内容ref count为0,会调用
A1.__del__
问题来了,为什么此时
A2.count = 0了那?
因为A2.count覆盖了A1实例中的代码A.count,如果将A.count改为self.__class__.count则__del__中仍然修改的时A1.count
是不是很像super?