第十一章函数和函数式编程
2016-04-04 19:06:04 4 举报
AI智能生成
Python函数和函数式编程
作者其他创作
大纲/内容
什么是函数
对程序逻辑进行结构化或过程化的一种编程方法
函数可以用来定义重用代码、组织和简化代码
定义函数
函数头:def关键字开始,后面接函数名以及形参并以冒号结束
函数体:包含一个定义函数做什么的语句块
返回值
带返回值的函数
>>> def bar():
return 'abc', [42, 'python'], "Guido"
>>> a = bar()
>>> a
('abc', [42, 'python'], 'Guido')
不带返回值的函数
>>> def hello():
print 'hello world'
>>>
>>> res = hello()
hello world
>>> res
>>> print res
None
>>> type(res)
调用函数
为了使用函数,必须调用它
当调用函数时,需要将实参传递给形参
用关键字参数调用函数
def net_conn(host, port):
net_conn_suite
net_conn(port=8080, host='chino')
用位置参数调用函数
def net_conn(host, port):
net_conn_suite
net_conn('kappa', 8080)
可变长度参数调用-(位置参数,关键字参数,非关键字可变长度参数,关键字可变长度参数)
def func(arg1, arg2='default', *args, **kwargs):
print "arg1=%s, arg2=%s, *args=%s, **kwargs=%s" % (arg1, arg2, args, kwargs)
func(1,2,3,4,x=1,y=2)
output:
arg1=1, arg2=2, *args=(3, 4), **kwargs={'x': 1, 'y': 2}
参数调用,程序执行可视化
变量的作用域
一个变量的作用域和它寄住的名字空间相关
LEGB:查找顺序local-->enclosing function locals-->global-->builtin
L-Local(function);函数内的名字空间
E-Enclosing function locals;外部嵌套函数的名字空间(例如closure)
G-Global(module);函数定义所在模块(文件)的名字空间
B-Builtin(Python);Python内置模块的名字空间
global
nonlocal (Python 3.x)
闭包
def counter(start_at=0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
装饰器
作用
引入日志
增加计时逻辑来检测性能
给函数加入事务的能力
递归函数
直接或间接调用自身的函数
一个或多个基础情况(最简单的情况),被用来停止递归
每次递归调用都会简化原始问题,让他不断地接近基础情况,直到它变成基础情况
斐波那契数两种实现方法例子
def fibonacci(n):
a, b = 0, 1
for i in range(n):
a, b = b, a+b
return a
-----------------------------------------------------------
def fibonacci(n):
if n == 0: #base case
return 0
elif n == 1: #base case
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
某些情况下,对于其它方法很难解决的问题,使用递归就能给出一个很自然,直观,简单的解决方案
几个特殊函数
好处:程序更简洁
lambda
lambda [arg1[, arg2, ... argN]]: expression
>>> def add(x): return x+3
>>> add(2)
5
>>> add = lambda x:x+3
>>> add(2)
5
filter
filter(func, seq)
调用一个布尔函数 func 来迭代遍历每个 seq 中的元素; 返回一个
使 func 返回值为 ture 的元素的序列。
>>> numbers =[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
>>> filter(lambda x: x>0, numbers)
[1, 2, 3, 4]
map
map(func, seq1[,seq2...])
将函数 func 作用于给定序列(s)的每个元素,并用一个列表来提
供返回值;如果 func 为 None, func 表现为一个身份函数,返回
一个含有每个序列中元素集合的 n 个元组的列表。
>>> lst1 = [1,2,3,4,5]
>>> lst2 = [6,7,8,9,0]
>>> lst3 = [7,8,9,2,1]
>>> map(lambda x,y,z: x+y+z, lst1,lst2,lst3)
[14, 17, 20, 15, 6]
reduce
reduce(func, seq[, init])
将二元函数作用于 seq 序列的元素,每次携带一对(先前的结果
以及下一个序列元素),连续的将现有的结果和下一个值作用在获
得的随后的结果上,最后减少我们的序列为一个单一的返回值;如
果初始值 init 给定,第一个比较会是 init 和第一个序列元素而不
是序列的头两个元素。
>>> reduce(lambda x,y: x+y,[1,2,3,4,5])
15
生成器
占用内存小,效率高
一个带有yield的函数,一种特殊的迭代器
>>> def reverse(data):
... for index in range(len(data)-1, -1, -1):
... yield data[index]
...
>>> for char in reverse('hello'):
... print(char)
...
o
l
l
e
h
生成器表达式
>>>: my_generator = (x*x for x in range(4))
>>> for i in my_generator:
... print i
...
0
1
4
9

收藏
0 条评论
下一页