(1)函数中如何修改全局变量且对全局产生影响?
(2)函数中是否可以再嵌套函数?
(3)倘若可以嵌套函数,内部函数是否可以引用外部函数的变量?
一. 内嵌函数与闭包
1.global关键字
因为在函数体内修改全局变量时,python会自动采用屏蔽方式来保护全局变量,自动创建一个同名的局部变量,所以无论在函数体内如何修改,仅仅只是在修改这个同名的局部变量。
如果希望在函数中修改全局变量的值——就要采用关键字global。
例子:
>>> count=5
>>> def MyFun():
global count
count = 10
print(count)
>>> MyFun()
10
>>> print(count)
10
2.内嵌函数
python中是可以内嵌函数的,但需要注意内部函数的整个作用域都在外部函数的作用域内。
例子:
>>> def fun1():
print("gagag")
def fun2():
print("sjdhs")
fun2()
>>> fun1()
gagag
sjdhs
>>> fun2()
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
fun2()
NameError: name 'fun2' is not defined
3.闭包
(1) 闭包理解
不同编程语言实现闭包的方式是不同的。python中闭包从表现形式上看,如果在一个内部函数里,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包(closure)。
例子:
>>> def fun1(x):
def fun2(y):
return x+y
return fun2
两种传参方式:
>>> i=fun1(6)
>>> i(4)
10
----------
>>> fun1(6)(4)
10
>>>
(2)初学者容易犯的一个错误
>>> def fun1():
x=5
def fun2():
x*=x
return x
return fun2()
>>> fun1()
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
fun1()
File "<pyshell#41>", line 6, in fun1
return fun2()
File "<pyshell#41>", line 4, in fun2
x*=x
UnboundLocalError: local variable 'x' referenced before assignment
为啥调用函数时报错了呢?
UnboundLocalError: local variable ‘x’ referenced before assignment,这是因为变量“x”没有被定义就拿来使用。
解决:
way1:在python 3之前,用容器类型解决,因为容器类型是存放在栈中的,因此对于内部函数而言,外部函数的变量不会被屏蔽掉,那就可以访问外部函数的变量。
def fun1():
x=[5]
def fun2():
x[0]*=x[0]
return x[0]
return fun2()
>>> fun1()
25
way2:想一下,python这么灵活,当想在函数中修改全局变量的值时,创造了关键字global,那么,当希望在内部函数修改外部函数的局部变量,就创造了nonlocal关键字。
>>> def fun1():
x=5
def fun2():
nonlocal x
x*=x
return x
return fun2()
>>> fun1()
25
二. lambda表达式
起到一个函数速写的作用。
1.lambda表达式
-
Lambda 表达式(lambda expression)是一个匿名函数
-
Lambda 表达式作用:
1)Python写一些执行脚本时,使用lambda就可以省下定义函数过程,比如说我们只是需要写个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使得代码更加精简。2)对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给 函数起个名字也是比较头疼的问题,使用lambda就不需要考虑函数命名的问题了。
3)简化代码的可读性
-
使用:
>>> def func(x):
return 3 * x
>>> func(5)
15
>>> g=lambda x:3 * x
>>> g(5)
15
2.filter(): 实现过滤功能
使用help(filter)得到:
filter(function or None, iterable) --> filter object | | Return
an iterator yielding those items of iterable for which function(item)
is true. If function is None, return the items that are true
ite
(注释 iterable:在Python里iterable被认为是一类对象,这类对象能够一次返回它的一个成员(也就是元素)。抽象一点就是适合迭代的对象)
注:
因为是返回可迭代对象,所以最后要用之前学过的list(),tuple()随便一个来转换可迭代对象
1)当第一个参数为None时,则返回iterable中为True的元素(Ture或者非0):
当参数为(None,iterable)时,示例1:
>>> filter(None,[0,1,3,True,False])
<filter object at 0x041A6230>
>>> list(filter(None,[0,1,3,True,False]))
[1, 3, True]
>>>
2)当第一个参数为function时,则将iterable中的元素作为参数代入function中,返回其中能使function的返回结果为True的元素
当参数为(function,iterable)时,示例2:
>>> def odd(x):
return x%2
>>> temp=range(10)
>>> show=filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
用lambda表达式简化示例2:
>>> list(filter(lambda x:x%2,range(10)))#用lambda表达式简化代码
[1, 3, 5, 7, 9]
>>>
3.map(): 实现映射
>>> list(map(lambda x:x%2,range(10)))
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>>
同样返回可迭代对象,所以还要转换。