1.函数
函数可以一个或多个返回值,
也可以没有
def f():
return 1,3
x,y=f()
x==>1
y==>3
2.变量查找顺序LEGB
Local(function)
Enclosing function locals
Global(module)
Built-in(Python)
X = 9 # Global scope name
def f1():
#global X
#print X
X = 8 # Global or enclosing
def f2():
#CAUTION:这句话会报错,因为内部变量有x,在调用的时候就回去拿内部变量,但是,运行这句话的时候,x还没有被赋值,因此报错
print “in f2()”, X
X=7 # enclosing or local
print “in f2()”, X
f2()
print “in f1()”,X
导包时避免打印测试语句
if name==”main“:
f1()
print “out f1()”,X
在方法内部处理全局变量
用global关键字
3.*args和**kargs
def f2(s,*args):
print s,args
f2(1,2,3,4)==>1 (2,3,4)
def f2(s,*args,**kwargs):
print s
print args
print kwargs
f2(1,2,3,4,5,key=1,value=’Jack’)
==>
1
(2, 3, 4, 5)
{‘value’: ‘Jack’, ‘key’: 1}
4.函数默认参数问题
def f(a=1):
print a,id(a)
a+=2
print a,id(a)def f1(a=[]):
print a,id(a)
a.append(1)
# a=[1]
print a,id(a)for i in xrange(3):
f()
for i in xrange(3):
f1()==>
1 140593385723784
3 140593385723736
1 140593385723784
3 140593385723736
1 140593385723784
3 140593385723736
[] 4328867960
[1] 4328867960
[1] 4328867960
[1, 1] 4328867960
[1, 1] 4328867960
[1, 1, 1] 4328867960
官方解释:
python中函数的默认值只会被执行一次,(和静态变量一样,静态变量初始化也是被执行一次)。Python可以通过函数的默认值来实现静态变量的功能。
个人暂且理解:
默认参数指向一个地址,如果在函数中被赋值了,下次进来,重新回到这个指向的地址。因为,[]和{}的增添操作,都是对指向地址对象的操作,因此下次进来时,读取的默认值发生了变化。
5.函数式编程
把函数当作一种单元,去组合实现功能。函数即变量。
比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程
6.sum函数
对列表或者元组进行求和
7.高阶函数
把函数当作变量来用
8.name
获取函数名称
9.filter
filter()函数包括两个参数,分别是function和list。该函数根据function参数返回的结果是否为真来过滤list参数中的项,最后返回一个新列表
#过滤出字母,
.isalpha()被字符串调用,如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
filter(str.isalpha,s)
10.map
两个参数,分别是function和list。对list(可以是字符串)中的每个元素都执行function方法,最后返回结果列表。
a=[‘a’, ‘b’, ‘c’]
map(lambda x:x+’a’,a)
==>
[‘aa’, ‘ba’, ‘ca’]#function接收多个参数时,采用列表包含元组的方式传递第二个参数
map(lambda (x,y):x+y,[(1,2),(‘1’,’s’)])
11.reduce
两个参数,分别是function和list。对list中的前两个元素执行function方法,然后将结果和第三个元素一起再执行function方法,以此类推。
reduce(lambda x,y:x+y,[1,2,3,4])
==>
10
12.回调函数
把函数当作变量传入,在主函数中执行,也可以把函数返回
13.闭包
绑定外部变量的函数
特征:
1.是一个嵌套函数
2.内部函数引用外部函数的变量
3.返回内部函数
注意:
1.内部函数不能“改变”外部变量
2.如果内部函数引用的变量是list或dict等可变的变量,可以在内部或者外部修改变量。即使变量在外部没有被引用也不回被回收。
def p(x):
def i(v):
#访问x时,发现内部没有x,x是外部变量,那么对其值进行了修改
x[0]=1
#执行内部函数时,发现内部有x,因此直接对x进行赋值,属于内部变量,不会修改外部x
#x=[3,3]
return v**x[0]
return i
a=[2,3]
print p(a)(3)
print(a)
一个闭包应用
#初始坐标
origin=[0,0]
#创建玩家
def create(pos):
def player(direction,stop):
pos[0]=pos[0]+direction[0]*step
pos[1]=pos[1]+direction[1]*step
return pos
return player
#创建玩家1,初始位置是复制后传递给函数,因此初始位置不会变。同时,player1会始终维持自己的位置坐标
player1=create(origin[:])
print player1([1,0],10)
print player1([1,0],20)
print player1([-1,0],10)
#origin ==>[0,0]
player2=create(origin[:])
print player2([1,0],20)
print player2([-1,0],10)
print player2([1,0],13)