函数之中除了可以实现重复调用之外,还用一些相关辅助的概念,例如:变量作用域、lambda、闭包处理

  

一、变量的作用域

变量的使用采用的就是就近取用的原则,Python中的LEGB就是Python语言里定义的变量的使用范围

  L:函数内部变量名称

  E:外部嵌套函数变量名称

  G:函数所在模块或程序文件的变量名称

  B:内置模块的变量名称

  

  实例一:全局变量

# coding=UTF-8
num = 100  #定义全局变量 num
def out1():
    print(num)
out1()

  执行结果:

  

python函数内部使用外部变量 python函数内部定义的变量_python函数内部使用外部变量

 

 

 

   实例二:在函数中定义的变量

# coding=UTF-8
def out1():
    num = 100  #定义在函数中的变量
def out2():
    print(num)
out2()

  执行结果:

  

python函数内部使用外部变量 python函数内部定义的变量_局部变量_02

 

 

 

  实例三:全局变量与局部变量的关系,并使用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)

  执行结果:

  

python函数内部使用外部变量 python函数内部定义的变量_python函数内部使用外部变量_03

 

 

 

  实例四:使用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__)

  执行结果:

python函数内部使用外部变量 python函数内部定义的变量_全局变量_04

 

 

二、闭包

所谓的闭包本质上指的是一种函数的嵌套结构,内部函数可以方便使用外部函数定义的内容,并且可以保持状态的一致性。内部的嵌套结构受到外部的制约

  实例:

# 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))

执行结果:

  

python函数内部使用外部变量 python函数内部定义的变量_python函数内部使用外部变量_05

 

  实例:使用内部函数修改外部函数的变量

# 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("你好"))

执行结果:

  

python函数内部使用外部变量 python函数内部定义的变量_python函数内部使用外部变量_06

 

 

三、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函数内部使用外部变量 python函数内部定义的变量_python函数内部使用外部变量_07

 

 

 

 四、主函数

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

执行结果:

  

python函数内部使用外部变量 python函数内部定义的变量_python函数内部使用外部变量_08

 

 

注意:当主函数脚本被作为模块(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脚本的结果:

  

python函数内部使用外部变量 python函数内部定义的变量_全局变量_09

 

 可以发现main函数并没用执行