zoukankan      html  css  js  c++  java
  • 函数以及函数的性质 名称空间以及分类 生命周期 变量的查找顺序

    函数是第一类对象:

      函数名指向的值可以被当成参数传递

    1.函数名可以被传递

    1 def func():
    2     print('from func')
    3 print(func)
    4 print(id(func))
    5 f = func
    6 func()
    7 print(f)
    8 f()  # 其实指向的也是函数func指向函数体代码的内存地址
    View Code

    2.函数名可以被当做参数传递给其他函数

     1 def func():
     2     print('from func')
     3 
     4 def index(args):
     5     print(args)
     6     args()
     7     print('from index')
     8 index(func)
     9 打印结果:
    10 <function func at 0x0000022C56F02F28>
    11 from func
    12 from index
    View Code

    3.函数名可以被当做函数的返回值

     1 def index():
     2     print('index')
     3 
     4 
     5 def func():
     6     print('func')
     7     return index
     8 res = func()
     9 print(res)
    10 res()
    11 打印结果:
    12 func
    13 <function index at 0x0000021FB1022F28>
    14 index
    View Code

    4.函数名可以被当做容器类型的参数

    def func():
        print('func')
    print(func())
    l = [1,2,func,func()] 
    print(l)

    打印结果:

     # [1,2,<function func at 0x000001F7D79899D8>,None]
    # 循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁
     1  1 # def register():
     2  2 #     username = input('username>>>:').strip()
     3  3 #     pwd = input('password>>>:').strip()
     4  4 #     print(username,pwd)
     5  5 #     print('register ...')
     6  6 # def login():
     7  7 #     print('login ...')
     8  8 # def transfer():
     9  9 #     print('transfer ...')
    10 10 # def shopping():
    11 11 #     print('shopping...')
    12 12 # def pay():
    13 13 #     print('pay ...')
    14 14 #
    15 15 # msg = """
    16 16 # 1 注册
    17 17 # 2 登陆
    18 18 # 3 转账
    19 19 # 4 购物
    20 20 # 5 支付
    21 21 # """
    22 22 # func_dict = {
    23 23 #     '1':register,
    24 24 #     '2':login,
    25 25 #     '3':transfer,
    26 26 #     '4':shopping,
    27 27 #     '5':pay,
    28 28 # }
    29 29 # while True:
    30 30 #     print(msg)
    31 31 #     choice = input('请现在你想要执行的功能>>>:').strip()
    32 32 #     if choice in func_dict:
    33 33 #         func_dict.get(choice)()  # 函数名()
    34 34     # else:
    35 35     #     print('你输入的功能暂时没有')
    View Code
    # 在函数内部调用其他函数
    # 可以将复杂的逻辑简单化
     1 #函数内部调用其他函数
     2 def index():
     3     func()
     4     print('index')
     5 
     6 def func():
     7     print('func')
     8 index()
     9 #将复杂的逻辑简单化
    10 def my_max(x,y):
    11     if x > y:
    12         return x
    13     return y
    14 
    15 def my_max4(a,b,c,d):
    16     res = my_max(my_max(a,b),my_max(c,d))
    17     return res
    18 print(my_max4(1,2,10,4))
    View Code

    函数内定义函数应用场景

    """
    写一个函数
    该函数用户可以通过传参的不同控制函数执行不同的功能
    """
     1 def outer():
     2     x = 1
     3     print('outer')
     4     def inner():
     5         print('inner')
     6     print(inner)
     7     return inner
     8 
     9 res = outer()
    10 print(res)
    11 res()    
    12 
    13 
    14 #运行结果:
    15 outer
    16 <function outer.<locals>.inner at 0x00000231FE0C4AE8>
    17 <function outer.<locals>.inner at 0x00000231FE0C4AE8>
    18 inner
    View Code

    名称空间是什么?

    # 就是放名字的地方
    # 详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方
    # 要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值

    名称空间的分类

      1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
    len
    max
    min
      2.全局名称空间:文件级别的代码
    x = 1
    
    if 1 ==1 :
    y = 2
    print(y)
    while True:
        z = 3
    for i in [1,2,3]:
    print(i)
    print(i) 
    # x,y,z都会放到全局名称空间
    # if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的
    
    
      3.局部名称空间:函数体内创建的名字都属于局部名称空间
    # username
     def func():     username = 'jason' func()

    生命周期:

      内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
      全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
      局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)

     1 # len = '我是全局名称空间的len'
     2 # def func():
     3 #     # len = '我是局部名称空间的len'
     4 #     print(len)
     5 #
     6 #
     7 #  print(len)  # 我现在站在的是全局的位置
     8 # func()
     9 #
    10 #
    11 #
    12 #
    13 # def index():
    14 #     x = 'xxx'
    15 #
    16 # def index2():
    17 #     print(x)
    18 #     y = 666
    19 #
    20 # index()
    21 # index2()
    View Code

    变量的查找顺序 (******)

      1.需要先确定你当前在哪(大前提)
        (1)站在全局: 全局 >>> 内置
        (2)站在局部: 局部 >>> 全局 >>> 内置

    # len = '我是全局名称空间的len'
    # def func():
    #     len = '我是局部名称空间的len'
    #     print(len)
    #  print(len)  # 我现在站在的是全局的位置
    # func()
    注意:函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
    x = 111
    def f1():
        x = 222
        def f2():
            x = 333
            def f3():
                x = 444
                def f4():
                    x = 555
                    print(x)
                f4()
            f3()
        f2()
    f1()
    def func():
        x = 1
        def index():
            print(x)  # 获取全局找x
        return index
    
    res = func()
    x = 999
    res()
    x=111
    def outer():
        def inner():
            print('from inner',x)
        return inner
    f = outer()
    f()
    x = 222
    f()
    x=111
    def outer():
        def inner():
            print('from inner',x)
        return inner
    f=outer()
    def func():
        x=333
        f()
    func() 
    x=111
    def outer():
        def inner():
           #x = 66666666(解决方法)
            print('from inner',x)
            x = 66666666
        return inner
    f=outer()
    f()
    # 运行结果:
    #   UnboundLocalError: local variable 'x' referenced before assignment(错误提示信息!)

    global:

      局部修改全局 如果想修改多个 逗号隔开

    nonlocal:

      局部修局部 如果想修改多个 逗号隔开

    # global 在局部修改全局的不可变数据类型
    # x = []  # 因为列表是可变类型
    x = 1  # 不可变类型
    username = 'jason'
    def func():
        # x.append('嘿嘿嘿')
        global x,username  # 修改全局变量 而不是创建局部名称空间
        x = 999
       username = 'egon'
    func()
    print(x)
    print(username)
    # nonlocal  局部修改局部
    def func():    x = 1    def index():        nonlocal x        x = 2    index()    print(x)func()
  • 相关阅读:
    WebStorm 常用功能的使用技巧分享
    Android开发-之数据的存储方式一
    C#泛型方法解析
    Vuex2.0+Vue2.0构建备忘录应用实践
    Android Studio快速开发之道
    深入jQuery中的data()
    Django---->模板层(template)
    初识DJango——MTV模型
    初识DJango——Web框架
    Offcanvas 自适应窗口示例
  • 原文地址:https://www.cnblogs.com/yangjiaoshou/p/11164705.html
Copyright © 2011-2022 走看看