Python核心编程第十一章笔记

返回值与函数类型

>>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)的每个元素,并用一个列表来提供返回值;如果funcNone,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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值