一、变量的作用域
1.什么是变量的作用域?
在程序中定义一个变量时,这个变量是有作用范围的,变量的作用范围就叫做作用域。
2.根据变量的定义位置分类:
1)局部变量:在函数中定义的变量,包括函数的参数,都被称为局部变量。每个函数在执行时,系统都会为该函数分配一块“临时内存空间”,所有的局部变量都被保存在这块空间,当函数执行完成后,这块内存空间就会被释放了,局部变量也就失效了。
2)全局变量:在函数外定义的变量,被称为全局变量。全局变量意味着它可以在全部函数内被访问。
3. 不管是局部变量,还是全局变量,这些变量和它们的值就像是一个字典,变量名就是字典的Key,变量值就是字典的Value。 Python提供了三个函数来获取"变量字典":
globals()、locals()、vars(object)
4. 全局变量遮蔽:在函数内部对变量进行赋值时,默认就是重新定义新的局部变量。如果定义了与全局变量同名的变量,则全局变量就被遮蔽了。例如:
#在函数中直接访问全局变量name是允许的
>>> name ="Jeff"
>>> def my_name():
print(name)
>>> my_name() #运行结果:Jeff
# 在函数内部增加一行对name赋值,刚全局变量name被遮蔽,报错变量不存在
>>> name="Jeff"
>>> def my_name():
print(name)
name="mary"
>>> my_name() #运行结果报错
5. 防止全局变量被遮蔽的两种方法:
1)使用globals()函数,例如:
>>> name="Jeff"
>>> def my_name():
print(globals()['name'])
name="mary"
>>> my_name() # 运行结果:Jeff
>>> print(name)#运行结果: Jeff
2)在函数中声明全局变量,例如:
>>> name="Jeff"
>>> def my_name():
global name # 声明name是全局变量
print(name) #直接访问全局变量name
name="mary"
>>> my_name() # 运行结果:Jeff
>>> print(name)#运行结果: mary
二、局部函数
1. 局部函数:Python还支持在函数体内定义函数,这种被放在函数体内定义的函数被称为局部函数。
2. 默认情况下,局部函数只能在其封闭的函数体内有效,对外是无效的。函数的返回值也可以是其内部的局部函数,这样以便程序在其它作用域中使用该局部函数。
3. 定义和调用局部函数:
#定义一个函数,内部包含两个局部函数
>>>def get_math_func(type,nn):
#定义一个局部函数square()
def square(n):
return n*n
#定义另一个局部函数cube()
def cube(n):
return n*n*n
if type=="square":
return square(nn)
else:
return cube(nn)
#调用函数
>>> print(get_math_func("square",3)) #运行结果:9
>>> print(get_math_func("cube",3)) #运行结果:27
三、函数的其它应用
Python 的函数本身也是一种对象,因此函数可以用于赋值,也可以作为其它函数的参数或返回值。
1. 将函数赋值给变量,通过变量来调用函数。例如:
#定义一个求面积的函数area
>>> def area(width,height):
return width*height
>>> my_func=area #将函数赋值给变量my_func
>>> print(my_func(3,4)) #通过变量调用函数,运行结果:12
2. 将函数作为其它函数的参数,例如:
#定义一个函数map(),其中一个参数fn是函数参数
def map(data,fn):
result=[]
for e in data:
result.append(fn(e))
return result
#定义一个求立方的函数cube()
>>> def cube(n):
return n*n*n
>>> data=[2,3,4]
#调用函数map()时,传入函数cube()作为其中一个参数
>>> print(map(data,cube))
3. 将函数作为其它函数的返回值,例如:
#定义一个函数,包含两个局部函数
>>> def math_func(type):
#定义一个局部函数,求平方
def square(n):
return n*n
#定义一个局部函数,求立方
def cube(n):
return n*n*n
if type=="square":
return square #返回值为函数
else:
return cube #返回值为函数
#调用函数math_func()
>>> my_func=math_func("cube")
>>> print(my_func(5)) 125
>>> my_func=math_func("square")
>>> print(my_func(5)) 25
四、lambda表达式
1. lambda表达式:局部函数的作用域只在其封闭函数之内,所在局部函数的函数名就变有太大意义了,这样就可以使用lambda表达式来简化局部函数的写法。lambda 表达式是比函数更灵活的代码块,它可以在程序中被传递和调用。
2. lambda 表达式的语法要点:
1)lambda表达式必须使用lambda关键字来定义。
2)lambda表达式中冒号(:)左边是参数列表,有多个参数要用逗号 (,)隔开,也可以没有参数。
3)lambda表达式中冒号(:)右边是返回值。
4)lambda表达式其实就是匿名的单行函数体。例如:
lambda x,y : x+y
可以写成函数:
def add(x,y): return x+y
3 lambda表达式的特点:
1)对于单行函数,使用lambda 表达式可以省去定义函数的过程,让代码更简洁。
2)对于不需要多次复用的函数,使用lambda表达式,用完就释放,提高了性能。
3)lambda表达式只能是单行表达式,所以不能用于替代太复杂的函数。
4. lambda表达式的用法:
1)用lambda表达式代替局部函数,例如:
>>> def math_func(type):
result=1 i
f type=="square":
#用lambda表达式代替局部函数
return lambda n:n*n
else:
return lambda n:n*n
return lambda n:n*n*n
>>> my_math=math_func('square')
>>> print(my_math(5)) 25
2)用lambda表达式来调用Python内部的函数,例如:
>>> x=map(lambda x:x*x,range(8))
>>> y=map(lambda x:x*x if x%2==0 else 0, range(8))
>>> print([e for e in y]) #结果: [0, 0, 4, 0, 16, 0, 36, 0]
>>> print([e for e in x ]) #结果: [0, 1, 4, 9, 16, 25, 36, 49]
五、本节回顾
1)什么是局部变量和全局变量?
2)如何解决全局变量被遮蔽的问题?
3)什么是局部函数?
4)怎样将函数赋值给变量,将函数做为其它函数的参数或返回值?
5)lambda表达式的语法和特点是什么?