返回值与函数类型
>>def hello():
...print 'hello world'
>>>
>>>res = hello()
helloworld
>>>res
>>>print res
None
>>>type(res)
<type'None'>
deffoo():
print'in foo()'
bar()
defbar():
print'in bar()'
太神奇了,这段代码可以非常好的运行,不会有前向引用的问题:
>>>foo()
infoo() in bar()
这段代码是正确的因为即使(在foo()中)对bar()进行的调用出现在bar()的定义之前,但foo()本身不是在bar()声明之前被调用的。换句话说,我们声明foo(),然后再声明bar(),接着调用foo(),但是到那时,bar()已经存在了,所以调用成功。
内部/内嵌函数
外部函数的定义体内定义函数(用def关键字),如在:
deffoo():
defbar():
print'bar() called'
print'foo() called'
bar()
foo()
bar()
我们将以上代码置入一个模块中,如inner.py,然后运行,我们会得到如下输出:
foo()called bar() called
Traceback(most recent call last): File "inner.py", line 11, in ?
bar()
NameError:name 'bar' is not defined
内部函数一个有趣的方面在于整个函数体都在外部函数的作用域(即是你可以访问一个对象的区域;稍后会有更多关于作用域的介绍)之内。如果没有任何对bar()的外部引用,那么除了在函数体内,任何地方都不能对其进行调用,这就是在上述代码执行到最后你看到异常的原因
另外一个函数体内创建函数对象的方式是使用lambda语句。如果内部函数的定义包含了在外部函数里定义的对象的引用(这个对象甚至可以是在外部函数之外),内部函数会变成被称为闭包(closure)的特别之物。
*函数(与方法)装饰器
装饰器背后的主要动机源自python面向对象编程。装饰器是在函数调用之上的修饰。这些修饰仅是当声明一个函数或者方法的时候,才会应用的额外调用。
装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰的函数,和装饰函数的可选参数。装饰器看起来会是这样:
@decorator(dec_opt_args)
deffunc2Bdecorated(func_opt_args):
:
传递函数
因为所有的对象都是通过引用来传递的,函数也不例外。当对一个变量赋值时,实际是将相同对象的引用赋值给这个变量。如果对象是函数的话,这个对象所有的别名都是可调用的。
>>>def foo():
...print 'in foo()'
...
>>>bar = foo
>>>bar()
infoo()
甚至可以把函数作为参数传入其他函数来进行调用。
>>>def bar(argfunc):
...argfunc()
...
>>>bar(foo)
infoo()
匿名函数与lambda
>>>b= lambda *z: z
>>>b(23, 'zyx')
(23,'zyx')
内建函数filter()、map()、reduce()
filter(func,seq)
调用一个布尔函数func来迭代遍历每个seq中的元素;返回一个使func返回值为ture的元素的序列。
map(func,seq1[,seq2...])
将函数func作用于给定序列(s)的每个元素,并用一个列表来提供返回值;如果func为 None,func 表现为一个身份函数,返回一个含有每个序列中元素集合的n个元组的列表。
reduce(func,seq[, init])
将二元函数作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列元素),连续的将现有的结果和下雨给值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值init给定,第一个比较会是init和第一个序列元素而不是序列的头两个元素
>>>map((lambda x: x+2), [0, 1, 2, 3, 4, 5])
[2,3, 4, 5, 6, 7]
>>>
>>>map(lambda x: x**2, range(6))
[0,1, 4, 9, 16, 25]
>>>[x+2 for x in range(6)]
[2,3, 4, 5, 6, 7]
>>>
>>>[x**2for x in range(6)]
[0,1, 4, 9, 16, 25]
>>map(lambda x, y: x + y, [1,3,5], [2,4,6])
[3,7, 11]
>>>
>>>map(lambda x, y: (x+y, x-y), [1,3,5], [2,4,6])
[(3,-1), (7, -1), (11, -1)]
>>>
>>>map(None, [1,3,5], [2,4,6])
[(1,2), (3, 4), (5, 6)]
>>>print 'the total is:', reduce((lambda x,y: x+y), range(5))
the total is: 10
偏函数应用
>>>from operator import add, mul
>>>from functools import partial
>>>add1 = partial(add, 1)
#add1(x) == add(1, x)
>>>mul100 = partial(mul, 100) # mul100(x) == mul(100, x)
>>>
>>>add1(10)
11
>>>add1(1)
2
>>>mul100(10)
1000
>>>mul100(500)
50000