Python中函数定义深入
函数之中除了可以实现重复调用之外,还用一些相关辅助的概念,例如:变量作用域、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函数并没用执行

浙公网安备 33010602011771号