Python--(高阶)函数

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值