您的位置:首页 > 编程语言 > Python开发

11 函数和函数式编程 - 《Python 核心编程》

2015-08-17 09:00 621 查看
􀁺 什么是函数
􀁺 调用函数
􀁺 创建函数
􀁺 传入函数
􀁺 形参
􀁺 变长参数
􀁺 函数式编程
􀁺 变量的作用域
􀁺 递归
􀁺 生成器

11.1 什么是函数?
函数是对程序逻辑进行结构化或过程化的一种编程方法.
函数可以以不同的形式出现.
declaration/definition def foo(): print 'bar'
function object/reference foo
function call/invocation foo()

函数 vs 过程

函数和过程两者都是可以被调用的实体.

传统意义上的函数或者“黑盒”,可能不带任何输入参数,经过一定的处理,最后向调用者传回返回值

过程是简单,特殊,没有返回值的函数.

python 的过程就是函数,因为解释器会隐式地返回默认值None.

返回值与函数类型

函数会向调用者返回一个值, 而实际编程中大偏函数更接近过程,不显示地返回任何东西.

把过程看待成函数的语言通常对于“什么都不返回”的函数设定了特殊的类型或者值的名字。
这些函数在c 中默认为“void"的返回类型,意思是没有值返回。
在python 中, 对应的返回对象类型是None。

>>> def hello():
... print('hello world !')
...
>>> hello()
hello world !
>>> he = hello()
hello world !
>>> print(he)
None
>>>

与其他大多数的语言一样,python 里的函数可以返回一个值或者对象.

>>> def bar():
... return ('abc',[42,'python'],'Guido')
...
>>> bar()
('abc', [42, 'python'], 'Guido')
>>> for item in tup:
... print(item)
...
abc
[42, 'python']
Guido
>>>
表11.1 返回值及其类型

#!/usr/bin/env python
#局部变量隐藏了全局变量,正如在这个变量作用程序中显示的。

j,k = 1,2

def proc1():

j,k = 3,4
print 'j == %d and k == %d' % (j,k)
k = 5

def proc2():
j = 6
print "j == %s" % j

k = 7
proc1()
print 'j == %d and k == %d' % (j, k)

j = 8
proc2()
print 'j == %d and k == %d' % (j, k)


View Code
11.9 *递归
如果函数包含了对其自身的调用,该函数就是递归的。
如 果一个新的调用能在相同过程中较早的调用结束之前开始,那么该过程就是递归的。
递归广泛地应用于语言识别和使用递归函数的数学应用中。
>>> def factorial(n):
... if n == 0 or n == 1: # 0! = 1! = 1
... return 1
... else:
... return n * factorial(n-1)
...
>>> factorial(3)
6
>>> factorial(4)
24
>>>
11.10 生成器
协同程序
协同程序是可以运行的独立函数调 用,可以暂停或者挂起,并从程序离开的地方继续或者重新开始。
在有调用者和(被调用的)协同程序也有通信。
举例来说,当协同程序暂停的时候,我们能从其中获得一个中间的返回值,当调用回到程序中时,能够传入额外或者改变了的参数,但仍能够从我们上次离开的地方继续,并且所有状态完整。
挂起返回出中间值并多次继续的协同程序被称为生成器,那就是python 的生成器真正在做的事。
什么是python 式的生成器?
从句法上讲,生成器是一个带yield 语句的函数。
一个函数或者子 程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果----那就是yield 语句的功能, 返回一个值给调用者并暂停执行。
当生成器的next()方法被调用的时候,它会准确地从离开地方继续(当它返回[一个值以及]控制给调用者时)
简单的生成器特性
与迭代器相似,生成器以另外的方式来运作:当到达一个真正的返回或者函数结束没有更多的 值返回(当调用next()),一个StopIteration 异常就会抛出。
>>> def simpleGen():
... yield 1
... yield '2 --> punch'
...
>>> myG = simpleGen()
>>> myG.next()
1
>>> myG.next()
'2 --> punch'
>>> myG.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> for i in simpleGen():
... print i
...
1
2 --> punch
>>>
加强的生成器特性
在python2.5 中,一些加强特性加入到生成器中,所以除了next()来获得下个生成的值,用户
可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]
由于双向的动作涉及到叫做 send()的代码来向生成器发送值(以及生成器返回的值发送回来),
现在yield 语句必须是一个表达式,因为当回到生成器中继续执行的时候,你或许正在接收一个进
入的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: