首页 > 代码库 > Python的两件小事----函数式编程&类实例

Python的两件小事----函数式编程&类实例

函数式编程语言

http://program-think.blogspot.com/2012/02/why-choose-python-4-fp.html
纯函数:输出完全依赖输入的函数,不能读写外部变量、没有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生成对象实例,我们称之为a2a2的建立使内存中新的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?

Python的两件小事----函数式编程&类实例