函数之中除了可以实现重复调用之外,还用一些相关辅助的概念,例如:变量作用域、lambda、闭包处理
一、变量的作用域
变量的使用采用的就是就近取用的原则,Python中的LEGB就是Python语言里定义的变量的使用范围
L:函数内部变量名称
E:外部嵌套函数变量名称
G:函数所在模块或程序文件的变量名称
B:内置模块的变量名称
实例一:全局变量
# coding=UTF-8
num = 100 #定义全局变量 num
def out1():
print(num)
out1()
执行结果:
实例二:在函数中定义的变量
# coding=UTF-8
def out1():
num = 100 #定义在函数中的变量
def out2():
print(num)
out2()
执行结果:
实例三:全局变量与局部变量的关系,并使用global修改全局变量
# coding=UTF-8
num = 100 #定义全局变量
def change_num1():
#num的局部变量
num = 30
print("change_num1()函数中的num变量的值:%d" %num)
def change_num2():
#修改num的全局变量
global num #调用全局变量num
num = 20
change_num1()
print("全局变量num的值:%d" %num)
print("调用change_num2()函数修改全局变量")
change_num2()
print("全局变量num的值:%d" %num)
执行结果:
实例四:使用globals()、locals()获取全局变量与局部变量的信息,使用__doc__获取函数的注释信息
# coding=UTF-8
num = 100 #定义全局变量
def change_num():
'''
定义局部变量并获取所有的全局变量及局部变量的信息
'''
info = "获取信息"
print("全局变量信息:")
print(globals())
print("局部变量信息:")
print(locals())
change_num()
print("change_num()函数注释信息:%s" %change_num.__doc__)
执行结果:
二、闭包
所谓的闭包本质上指的是一种函数的嵌套结构,内部函数可以方便使用外部函数定义的内容,并且可以保持状态的一致性。内部的嵌套结构受到外部的制约
实例:
# coding: UTF-8
def outar_add(n1):
def inner_add(n2):
return n1+n2 #调用n1外部参数
return inner_add #返回内部函数
oa = outar_add(100) #用oa接受outar_add() 返回的函数
print("加法运算结果:%d" % oa(20))
print("加法计算结果:%d" % oa(50))
执行结果:
实例:使用内部函数修改外部函数的变量
# coding: UTF-8
def input_data(count):
def updata_data(n1):
nonlocal count #使用nonlocal表示不是本地变量
count += 1
return "第{}次输出数据:{}".format(count,n1)
return updata_data #返回内部函数
oa = input_data(0)
print(oa("你好"))
print(oa("你好"))
执行结果:
三、lambda表达式
lambda表达式指的是函数式的编程,可以理解为没有名字的函数 一般定义简单,并且只使用一次
实例:
# coding: UTF-8
#使用lambda完成简单的加法操作
sum = lambda n1,n2 : n1 + n2
print(sum(10,20))
#使用lambda进行闭包的加法操作
def sum1(data):
return lambda a1 : data + a1
ao = sum1(30)
print(ao(50))
执行结果:
四、主函数
Python是直接定义完源代码就可以执行的编程语言, 而其他语言比如C、C++、Java都是需要主函数来标记程序起点的
Python中要使用主函数就要借助全局变量 __name__ 的返回内容而后采用自定义的主函数进行执行
实例:
# coding: UTF-8
def sum1(data):
return lambda a1 : data + a1
def main(): #自定义主函数
ao = sum1(30)
print(ao(50))
if __name__ == "__main__": #判断是否为main来执行主函数
main()
执行结果:
注意:当主函数脚本被作为模块(module)引用时,其中的main函数是不会被执行的
例:
test.py脚本
# coding: UTF-8
print("test执行了")
def sum1(data):
return lambda a1 : data + a1
def main(): #自定义主函数
ao = sum1(30)
print(ao(50))
if __name__ == "__main__": #判断是否为main来执行主函数
main()
txt.py脚本
import test
print("main没用执行")
执行txt.py脚本的结果:
可以发现main函数并没用执行