day11:return关键字&全局/局部变量&函数名的使用&函数的嵌套&nonlocal关键字&locals/globals

关键字:return

自定义函数的返回值,return可以把值返回到函数的调用处
        1.return+六大标准数据类型,还有类和对象,函数
        如果不定义return,默认返回的是None
        2.在执行return之后,立刻终止函数,后面的代码不执行

# 1.return的返回类型
def func():
    # return 1
    # return 3.14
    # return "abc"
    # return []
    # return ()
    # return {"a":1}
    pass
res=func()
# 如果不定义return,默认返回的是None
print(res)
# 2.在执行完return 之后,立刻终止函数,后面的代码不执行
def func():
    print(1)
    print(2)
    return 3 # 立刻终止函数,后面的print(4)和print(5)不执行
    print(4)
    print(5)
res =func()
print(res)

def func():
    for i in range(3):
        if i==2:
            return 1
        print(i)
res = func()
print(res) # 0 1 1
# 3.模拟简单的计算器 + - * /
def func(sign,num1,num2):
    if sign=="+":
        res= num1+num2
    elif sign=="-":
        res =num1-num2
    elif sign=="*":
        res = num1*num2
    elif sign=="/":
        if num2 ==0:
            return "除数不能为0,老弟"
        res = num1/num2
    else:
        return "这个本计算器真算不了"
    return res

res = func("+",3,5)
res = func("-",10,20)
res = func("*",10,20)
res = func("/",20,10)
res = func("/",20,0)
res = func("&",20,0)
print(res)

全局变量和局部变量

局部变量:在函数内部定义的变量(局部命名空间)
全局变量:在函数外部定义的或者使用global在函数内部定义(全局命名空间)
作用域:作用的范围

局部变量作用域:在函数的内部
全局变量作用域:横跨整个文件

生命周期:
内置变量>全局变量>局部变量

1.局部变量

# 1.局部变量
def func():
    # 定义局部变量
    a=5
    # 获取局部变量
    print(a)
    # 修改局部变量
    a=10
    print(a)
func()
print(a) # error 不能在全局调用局部变量

2.全局变量

# 2.全局变量
# 定义全局变量
b=10
# 获取全局变量
print(b)
# 修改全局变量
b=20

def func():
    # 可以在函数内部获取全局变量
    print(b)
func()

3.使用global在函数内部创建全局变量

# 3.使用global在函数内部创建全局变量
def func():
    global c
    c=200
func()
print(c)

4.使用global在函数内部修改全局变量

# 4.使用global在函数内部修改全局变量
d=300
def func():
    global d
    d=400
func()
print(d)

5.总结:

可以使用global关键字在函数内部定义一个全局变量
也可以使用global关键字在函数内部修改一个全局变量

 

函数名的使用

1.函数名是一个特殊的变量,可以把函数当做变量对它赋值

def func():
    print("我是func函数")
    return 1

# 1.函数名是个特殊的变量,可以当做变量赋值
a="你好"
print(a)
a=func()
# a()

# 函数可以像变量一样销毁
del a
a()

2.函数名可以作为容器类型数据的参数

# 2.函数名可以作为容器类型数据的元素
def func1():
    print("我是func1函数")
def func2():
    print("我是func2函数")
def func3():
    print("我是func3函数")

lst=[func1,func2,func3]
for i in lst:
    print(i)
    i() # func1() func2() func3()

3.函数名可以作为函数的参数

# 3.函数名可以作为函数的参数
def func3():
    print("我是func3函数")

def func4(f):
    f() # 我是func3函数

func4(func3)

4.函数名可以作为函数的返回值

# 4.函数名可以作为函数的返回值
def func(f):
    return f
res = func(func2) # f---> func2 -----> res=func2()
res()

5.__doc__ 或者help查看文档

#  __doc__ 或者help查看文档
def func(a):
    """
    功能:xxxx
    参数:a
    返回值:1
    """
    print("xxxx")
    return 1

help(func)
res = func.__doc__
print(res)

输出结果:  功能:xxxx
          参数:a
          返回值:1
            

 函数的嵌套

1.一个简单的例子

def outer():
    def inner():
        print("我是inner函数")
    inner()
outer()
inner() # 调用外部函数时,内部函数不可以再函数外部调用!

1.内部函数可以直接在函数外部调用吗?不行
2.调用外部函数后,内部函数可以在函数外部调用吗?不行
3.内部函数可以在函数内部调用吗? 可以
4.内部函数在函数内部调用时,是否有先后顺序?有!必须先定义再调用

2.函数嵌套案例

# 外层是outer,内层是inner,最里层是smaller,调用smaller里面的所有代码

def outer():
    def inner():
        def smaller():
            print("我是smaller函数",id)
        smaller()
    inner()
outer()

3.LEGB原则

找寻变量的调用顺序采用LEGB原则,即就近原则
B- Builtin(Python):python内置模块的命名空间 (内建作用域)
G- Global(module):函数外部所在的命名空间(全局作用域)
E -Enclosing function locals:外部嵌套函数的作用域(嵌套作用域)
L -Local(function):当前函数内的作用域(局部作用域)
依据就近原则 从下向上 由里向外 依次寻找

 

nonlocal关键字

nonlocal 遵循LEGB就近找变量原则
        1.找当前空间上一层的局部变量进行修改
        2.如果找不到,会继续向上寻找
        3.最后什么也没有,直接报错

1.找当前空间上一层的局部变量进行修改

# 1.找当前空间上一层的局部变量进行修改
def outer():
    a=100
    def inner():
        nonlocal a
        a=200
        print(a) # 200
    inner()
    print(a) # 200
outer()

2.如果找不到,会继续向上寻找

# 2.如果找不到,会继续向上寻找
def outer():
    a=100
    def inner():
        def smaller():
            nonlocal a
            a=400
            print(a) # 400
        smaller()
        print(a) # 400
    inner()
    print(a) # 400
outer()

3.注意点:nonlocal只能修改局部变量

# 3.注意点:nonlocal只能修改局部变量
a=100
def outer():
    def inner():
        def smaller():
            nonlocal a # nonlocal只能修改局部变量,而本程序中第一行的a是全局变量,nonlocal无法修改
            a=400
            print(a)
        smaller()
        print(a)
    inner()
    print(a) 
outer()

4.不使用nonlocal修改局部变量--->只能适用于列表

# 4.不使用nonlocal修改局部变量
def func():
    lst=[1,2,3,4]
    def inner():
        lst[-1]=10
    inner()
    print(lst)
func()

globals和locals

1.locals 获取当前作用域中所有变量

locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域

# locals 在全局:获取打印之前的所有变量
def func():
    ff = 123
a = 1
b = 2
res = locals()
c = 3
print(res) # 是一个大字典,里面有很多键值对,a:1 b:2 c:3均可以打印出来(截止到打印之前)
d = 4 # d:4 不会被打印
# locals 在全局
a1 = 10
def func():
    a = 1
    b = 2
    res = locals()
    c = 3
    print(res) # a:1 b:2 会被打印出来 截止到调用local()之前的都会被打印出来
    d = 4
a2 = 20
func()
a3 = 30

2.globals 只获取全局空间中所有变量

globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域

# global 在全局
def func():
    ff = 123
a = 1
b = 2
res = globals() # a:1 b:2 c:3 截止到打印之前
c = 3
print(res)
d = 4
# global 在局部
a1 = 10
def func():
    a = 1
    b = 2
    res = globals()
    c = 3
    print(res)
    d = 4
a2 = 20
func()  # globals() a1:10 a2:20 截止到调用处
a3 = 30

3.globals 动态批量创建全局变量

# 1.用字符串定义全局变量
dic = globals() # 必须是global定义的字典,普通字典无效
print(dic) # 返回的是系统的字典
# 在全局的字典当中,通过添加键值对,自动创建全局变量
# 对应的键时变量名,对应的值是变量指向的值
dic["name"] = "致和"
print(name) # 致和
# 2.批量定义全局变量
def func():
    dic = globals()
    # 通过在全局系统字典当中,添加键值对,批量创建变量
    for i in range(1,6):
        # "a%d" % (1) => "a1"  "a%d" % (2) => "a2"  
        dic["a%d" % (i)] = i #  1~5 
        
func()

 

posted @ 2020-07-18 16:11  iR-Poke  阅读(327)  评论(0编辑  收藏  举报