zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    jquery 序列化form表单
    nginx for windows 安装
    nodejs idea 创建项目 (一)
    spring 配置 shiro rememberMe
    idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法
    redis 在windows 集群
    spring IOC控制反转和DI依赖注入
    redis 的安装
    shiro 通过jdbc连接数据库
    handlebars的用法
  • 原文地址:https://www.cnblogs.com/libolun/p/13336109.html
Copyright © 2011-2022 走看看