• 函数的进阶


    def func1():
        a1 = 1
        b2 = 2
        print(666)
    func1()
    # len()
    print()
    

    全局名称空间:存储的是全局(py文件)的变量与值的对应关系
    临时(局部)名称空间:当函数执行时,会在内存中临时开辟一个空间,此空间记录函数中的变量与值的对应关系,随着函数的结束,临时名称空间而关闭。
    python中的空间:
    全局名称空间
    临时(局部)名称空间
    内置名称空间: len print 等内置函数等等。
    print()
    加载顺序: 内置名称空间 ---> 全局名称空间 ---> 函数执行时:临时(局部)名称空间


    作用域:
    全局作用域: 内置名称空间 全局名称空间
    局部作用域:临时(局部)名称空间

    取值顺序: 函数执行时:临时(局部)名称空间 ---> 全局名称空间 ----> 内置名称空间

    # 取值顺序满足就近原则
    len = 66
    print(len)
    a = 1
    def func():
        a = 66
        def func1():
            a = 99
            print(a)
        func1()
    func()
    

    坑 (取值)
    global nonlocal

    局部只能引用全局的变量但是不能修改,修改就会报错
    global
    1可以修改全局变量
    2在局部空间可以声明一个全局变量

    # global第一个作用 可以修改全局变量
    a = 1 def func(): global a #使用global引用全局变量a a=1 a += 1 print(a) func() # 2在局部空间可以声明一个全局变量
    def func():
        global a
        a = 1
    # print(a)
    func()
    print(a)
    # nonlocal
    # 1,不能操作全局变量
        # 1,不能操作全局变量
    a = 2
    def func():
        nonlocal a
        print(a)
    func()
    

     

    # 2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改 变。

    子名称空间只能引用父名称空间的变量,但是不能修改。
    def func1():
        a = 1
        def inner():
            nonlocal a
            a += 1
            print(a)   # a=2
        print(a)    #a=1
        inner()
        print(a) #a=2
    func1()

    二、函数的嵌套
    def func1():
        print(111)
        def func2():
            '''1万行代码'''
            print(222)
        print(333)
        func2()
        print(444)
    func1()
    # 结果:111 333 222 444
    def func1():
        print(111)
    
    def func2():
        print(222)
        func1()
    
    
    def func3():
        func2()
        print(333)
    
    func3()

    三、函数名的运用

    1、函数名可以作为普通变量用
    def func1():
        print(111)
    func1()
    
    # 函数名(函数的内存地址) 特殊的变量
    a = 1
    b = a
    print(b)    #结果出来的是1
    
    print(func1)   #直接打印函数名,函数名对应的就是 函数的内存地址 它是一个特殊的变量
    f1 = func1 
    f2
    = f1
    # print(f2) 打印f2就是相当于执行print(func1)就是对应的函数的内存地址
    f2()      # 相当于执行func1这个函数,所以结果出来的是111

    2、函数名可以作为函数的参数
    
    
    def func1():
        print(111)
    
    def func2(x):   #x当做一个形参接收。 是func1这个函数名 
        print(x)   #所以打印的func1这个函数名的内存地址
        x()      #执行x()就相当于执行func1函数,所以结果出来的是111
    func2(func1)
    这就是变量名的交换,我把func1变量名传给了x,我打印x,然后让x执行,就相当于执行func1

    3、函数名可以作为函数的返回值
    这个有点难度了。
    def func1():
        print(111)
    
    def func2(x):
        return x    # 2、我的return x返回值返回给func2(func1) 就相当于返回给 ret,
    
    ret = func2(func1)  # 1、此时我要执行func2这个函数了,然后我把func1传给了x。   3、ret=x  x=func1
    ret()        # 4、相当于执行func1

    4、函数名可以作为容器类数据类型的参数
    a = 1
    b = 2
    c = 3
    l1 = [a,b,c]
    for i in l1:
        print(i)

    故此我们可以这样:

    def func1():
        print(111)
    
    def func2():
        print(222)
    
    def func3():
        print(333)
    
    def func4():
        print(444)
    l1 = [func1, func2, func3, func4]
    for i in l1:
        i()

    不仅如此,我们还可以这样,先写4个函数,然后把函数执行的序号和函数名放到字典中,使用while循环这个可以选择的序号,就可以执行相对应的函数。双击666:

    def func1():
        print(111)
    
    def func2():
        print(222)
    
    
    def func3():
        print(333)
    
    
    def func4():
        print(444)
    
    dic = {
        1: func1,
        2: func2,
        3: func3,
        4: func4,
    }
    while 1:
        choice = int(input('请输入数字:'))
        dic[choice]()

     

     
  • 相关阅读:
    SSH-框架工作笔记
    Ajax基础
    Hibernate基础
    Struts1 中的国际化
    MyEclipse中的快捷键
    Oracle_存储过程
    oracle_开发子程序和包
    常用的正则表达式
    jQuery中的事件
    AcWing 1118. 分成互质组
  • 原文地址:https://www.cnblogs.com/wangkaiok/p/9878687.html
Copyright © 2020-2023  润新知