函数式编程
深拷贝
>>>from copy import deepcopy
>>>d = {}
>>>d['names'] = ['Alfred', 'Bertrand']
>>>c = d.copy()
>>>dc = deepcopy(d)
>>>d['names'].append('Clive')
>>>c
{'names':['Alfred', 'Bertrand', 'Clive']}
>>>dc
{'names': ['Alfred','Bertrand']}
简单函数定义
deffibs(num):
result = [0, 1]
for i in range(num-2):
result.append(result[-2] +result[-1])
return result
文档字符串
在函数的定义def后面使用''来定义一个文档字符串,这样可以在存续中访问。
定义:
defsquare(x):
'Calculates the square of thenumber x.'
return x*x
使用:
square.__doc__
或者使用help函数。
help(square)
多参数
多参数的时候可以传递0个或则多个值给函数。
元组
defprint_params_2(title, *params):
print title
print params
使用
>>>print_params_2('Params:', 1, 2, 3)
Params:
(1,2, 3)
可以看到就不用其他的数据结构才能传递参数了。
字典
defprint_params_4(x, y, z=3, *pospar, **keypar):
print x, y, z
print pospar
print keypar
使用
>>>print_params_4(1, 2, 3, 5, 6, 7, foo=1, bar=2)
1 23
(5,6, 7)
{'foo':1, 'bar': 2}
参数反转
使用*和**可以把多个参数打包成一个数据结构;如果把这个符号作用于字典和元组的时候也可以得到相反的效果。
1,反转一个元组可以用来传递参数。
defadd(x, y): return x + y
>>>add(*params)
3
2,反转一个字典也可以用来给一噶函数传递参数,只是字典的键会自动变成函数的参数名。也就是不起作用。
生成器
一个生成器就是一个特殊的函数,每次调用它都会放回下一个数字。事实上生成器表现的想一个迭代器,只不过这儿的迭代器的对象是一个函数。
例如:
nested= [[1, 2], [3, 4], [5]]
defflatten(nested):
for sublist in nested:
for element in sublist:
yield element
>>>nested = [[1, 2], [3, 4], [5]]
>>>for num in flatten(nested):
printnum
...
1
2
3
4
5
注意:生成器函数已经有默认的返回值——生成器了,你不能再另外给一个返回值;对,即使是return None也不行。但是它可以使用空的return语句结束。
函数式编程特性
关键字参数
在参数传递的时候可以使用函数定义时的参数名。
defhello_1(greeting, name):
print'%s, %s!' % (greeting, name)
这时候参数的顺序就不成问题了。
>>>hello_1(greeting='Hello', name='world')
Hello,world!
另一个:
>>>hello_1(name='world', greeting='Hello')
Hello, world!
默认参数
闭包
Python中可以在函数中声明另外一个函数并且返回,这个比起Ruby来说更加自然一点。因为在Ruby中必须用匿名函数来实现这个特性。
defmultiplier(factor):
def multiplyByFactor(number):
return number*factor
return multiplyByFactor