python函数(三): 内嵌函数,闭包,lambda表达式,filter()与map()函数

(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]
>>> 

同样返回可迭代对象,所以还要转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值