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 "", line 1, in 
    fun2()
NameError: name 'fun2' is not defined

3.闭包

3.1 [闭包理解](https://viewer.edrawsoft.com/public/s/dcc1e761615724 )

不同编程语言实现闭包的方式是不同的;
  python中闭包从表现形式上看,如果在一个内部函数里,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包(closure)。
  
看例子:

>>> def fun1(x):
	def fun2(y):
		return x+y
	return fun2

两种传参方式:

>>> i=fun1(6)
>>> i(4)
10

----------
>>> fun1(6)(4)
10
>>> 

3.2初学者容易犯的一个错误及解决

看代码:

>>> def fun1():
	x=5
	def fun2():
		x*=x
		return x
	return fun2()

>>> fun1()
Traceback (most recent call last):
  File "", line 1, in 
    fun1()
  File "", line 6, in fun1
    return fun2()
  File "", line 4, in fun2
    x*=x
UnboundLocalError: local variable 'x' referenced before assignment

为啥调用函数时报错了呢?
UnboundLocalError: local variable ‘x’ referenced before assignment,这是因为变量“x”没有被定义就拿来使用

解决办法:

第一种:在python 3之前,用容器类型解决,
因为容器类型是存放在栈中的,因此对于内部函数而言,外部函数的变量不会被屏蔽掉,那就可以访问外部函数的变量。

直接看代码:

def fun1():
	x=[5]
	def fun2():
		x[0]*=x[0]
		return x[0]
	return fun2()

>>> fun1()
25

第二种:想一下,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])

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

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


明天继续,blog会持续更新_

你可能感兴趣的:(零基础学习python)