在理解函数式编程之前,我还是对函数的调用,参数传递以及函数的嵌套调用一头雾水,还是花了点时间整理了写思绪,以便我后面对装饰器复杂的参数传递和函数的调用的理解。
函数的定义
def 函数名():
代码块
例如:
def func_name():
block
return value #return语句表示函数执行到此结束,如果没有return语句则会返回None,有return没有语句也是返回None
另外,Python中不允许前向引用,即在函数定义之前,不允许调用该函数。所以函数必须先定义再调用,否则会报错,找不到该函数的定义。
print func_name() #若在函数定义前调用函数,则报错
Traceback (most recent call last):
File "<pyshell#72>", line 1, in <module>
print func_name()
NameError: name 'func_name' is not defined
参数的传递
>>> def f(a,b,c=10): #定义三个参数,设置c的默认值为10
return a+b+c
>>> print(f(3,2)) #传递参数的值,默认匹配没有默认值的参数
15
>>> print(f(3,2,1)) #传递参数的值,若传递的参数都有值,则不会取默认值
6
>>>def func(*name): #包裹传递,将所有的参数传递给name元组
print type(name)
print name
>>> func(1,4,6)
<type 'tuple'>
(1, 4, 6)
>>> func(5,6,7,1,2,3)
<type 'tuple'>
(5, 6, 7, 1, 2, 3)
>>> def func(**dict): #字典收集所有的关键字
print type(dict)
print dict
>>> func(a=1,b=9)
<type 'dict'>
{'a': 1, 'b': 9}
>>> func(m=2,n=1,c=11)
<type 'dict'>
{'c': 11, 'm': 2, 'n': 1}
函数嵌套
python程序,一个函数在另外一个函数的里面,外层的函数返回的是里层函数。
函数嵌套时,内层函数可以访问外层函数的变量,但不能对其变量重新赋值。
>>> def yao1(a=1,b=32):
def yao2(c=54):
def yao3(d=3):
def yao4(e=10):
return a+b+c+d+e
return yao4
return yao3
return yao2
>>> print yao1()()()()
100
函数式编程
函数式编程与函数不同,函数式编程是将一个函数作为参数传递给另一个函数,最后返回一个函数。
典型的函数式编程辅助函数有:reduce/map/filter等函数,一需要认识和积累这些辅助和内置函数,其二了解匿名函数lambda的使用,让函数式编程的代码更加简洁和易读。
>>> number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8] #给列表赋值
>>> sum = filter(lambda x: x>0, number) #filter(func,number):从number的item中依次筛选符合func条件的元素,即从number列表中筛选x>0的元素并返回
#lambda args: expression
>>> average = reduce(lambda x,y: x+y, sum)/len(sum) #reduce(func,number):先将number元组中的前两个元素执行func函数,返回的值继续与下一个元素一起执行func函数
>>> print average
5
>>>
>>>print map(lambda x:x%3,range(6)) #map(func,seq):seq中的每个元素都经过了func函数的作用,重新得到了func(seq[n])组成的列表
[0, 1, 2, 0, 1, 2]