11 函数和函数式编程 - 《Python 核心编程》
2015-08-17 09:00
721 查看
什么是函数
调用函数
创建函数
传入函数
形参
变长参数
函数式编程
变量的作用域
递归
生成器
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 返回值及其类型
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 语句必须是一个表达式,因为当回到生成器中继续执行的时候,你或许正在接收一个进
入的对象。
调用函数
创建函数
传入函数
形参
变长参数
函数式编程
变量的作用域
递归
生成器
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 语句必须是一个表达式,因为当回到生成器中继续执行的时候,你或许正在接收一个进
入的对象。
相关文章推荐
- python自动登录BAIDU,失效版
- 分享一个获取代理ip的python函数
- 分享一个获取代理ip的python函数
- python-with
- python之数据库操作(sqlite)
- python之数据库操作(sqlite)
- 全面解读Python Web开发框架Django
- 全面解读Python Web开发框架Django
- 全面解读python web 程序的9种部署方式
- 全面解读python web 程序的9种部署方式
- python对web服务器做压力测试并做出图形直观显示
- python对web服务器做压力测试并做出图形直观显示
- 6个最佳的开源Python应用服务器
- 6个最佳的开源Python应用服务器
- 流行python服务器框架
- 流行python服务器框架
- python 读取图片的尺寸、分辨率
- python 读取图片的尺寸、分辨率
- Python,PIL压缩裁剪图片
- Python,PIL压缩裁剪图片