zoukankan      html  css  js  c++  java
  • python基础之函数的进阶(基础八)

    第十章python的函数进阶

    10.1 函数的传参:形参角度:第三种传参方式

    动态传参:*args ------(接受的位置参数)---------元组

    agrs 将实参角度:定义一个函数时,所有的位置参数聚合到一个元组中.

    def eat(food1,food2,food3):
        print(f'我请你吃:{food1},{food2},{food3}')
    eat('蒸羊羔','蒸熊掌','蒸鹿尾')
    
    当给函数传入的参数数目不定时,之前的传参方式解决不了问题。
    万能参数,动态参数:*args
    
    def eat(food1,food2,food3):
        print(f'我请你吃:{food1},{food2},{food3}')
    eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
    
    def eat(*args): #将实参角度:定义一个函数时,*所有的位置参数聚合到一个元组中
        print(args)
        print(f'我请你吃:{args}')
    eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
    #函数接受不定个数的数字实参,将最终的和返回出去。
    

    练习:写一个函数,求传入函数中的不定个数的数字实现的和。

    def sum1(*args):
        print(args)
        result = 0
        for i in args:
            result += i
        return result
    print(sum1(300,100,20,10))
    

    动态传参:**kwargs------(接受的关键字的参数)------字典

    函数的定义时:**将实参角度所有的关键字参数聚合成一个字典,给了kwargs.

    def func(**kwargs):
        print(kwargs)
    func(name='alex',age='84',hobby='rap篮球')
    
    *args,**kwargs万能参数
    def func(*args,**kwargs):
        print(args,kwargs)
    func(name='alex',age='84',hobby='rap篮球')
    

    *的魔性用法:

    def func(*args,**kwargs):
        print(args)  # (1, 2, 3,'太白', 'wusir', '景女神')
        print(kwargs)
    
    l1 = [1, 2, 3]
    l2 = ['太白', 'wusir', '景女神']
    # func(l1,l2)
    # func(*l1,*l2)  # 当函数的执行时:*iterable 代表打散。
    func(*[1, 2, 3],*(11,22),*'fdsakl')  # 当函数的执行时:*iterable 代表打散。
    
    def func(*args,**kwargs):
        print(args)
        print(kwargs)
    func(**{'name':"alex"},**{'age': 73,'hobby': '吹'})
    当函数的执行时:**dict 代表打散。
    

    函数外:处理剩余元素

    a,b,*c = [1,2,3,4,5]
    a,*c,b, = [1,2,3,4,5]
    a,*c = range(5)
    a,*c,b = (1,2,3,4,5,6)
    print(a,c,b)
    

    函数形参角度的顺序:

    优先级: 位置 > 动态位置> 默认 > 动态关键字

    *args的位置:

    *args不能放在位置参数前面,a,b取不到值
    def func(*args,a,b,sex='man',):
        print(a)
        print(b)
        print(sex)
        print(args)
        # print(kwargs)
    func(1,2,4,5,6)
    
    args如果想要接收到值之前,肯定要改变sex默认参数。
    def func(a,b,sex='man',*args):
        print(a)
        print(b)
        print(sex)
        print(args)
        # print(kwargs)
    func(1,2,4,5,6)
    
    def func(a,b,*args,sex='man'):
        print(a)
        print(b)
        print(sex)
        print(args)
        # print(kwargs)
    func(1,2,4,5,6)
    func(1,2,4,5,6,sex='women')
    
    **kwargs
    位置参数,*args,默认参数,**kwargs
    def func(a,b,*args,sex='man',**kwargs,):
        print(a)
        print(b)
        print(sex)
        print(args)
        print(kwargs)
    func(1,2,4,5,6,name='太白',age=18)
    
    形参角度第四种传参方式:仅限关键字参数  (了解)
    位置参数,*args,默认参数,仅限关键字参数,**kwargs
    def func(a,b,*args,sex='man',c,**kwargs,):
        print(a)
        print(b)
        print(sex)
        print(c)
        print(args)
        print(kwargs)
    func(1,2,4,5,6,67,c=666,name='太白',age=18,)
    

    10.1.3补充内容

    lst = [12,23,3,4,5,6]
    def func(*args):
        print(*args)
    func(lst[0],lst[1]) # 笨的办法
    func(*lst)
    
    dic = {"key":1,"key1":34}
    def func(**kwargs):
        print(kwargs)
    func(**dic)
    

    10.2 空间角度研究函数

    name = 'alex'
    l1 = [1,2,3]
    
    def func():
        name = '太白'
        print(666)
    
    func()
    
    def func1():
        age = 18
    
    import time
    # print(time.time())
    print(111)
    time.sleep(1)
    age = 18
    
    print(66)
    input()
    
    变量(函数名也叫变量)
    
    
    input = 666
    print(input)
    从全局寻找input ————> 全局名称空间 ——————> 内置
    
    input = '太白'
    def func():
        # input = 666
        print(input)
    
    func()
    
    从局部寻找input ——————> 局部名称空间 ————> 全局名称空间 ——————> 内置
    取值顺序:单向不可逆
    
    def func():
        name = 'alex'
    
    func()
    print(name)
    
    name = '太白'
    def func():
        # name = 'alex'
        def inner():
            print(name)
        inner()
    func()
    

    内置空间,全局空间,局部空间总结:

    print(11)
    a = 10
    
    def func():
        b = 20
        print(b)
    
    
    内置空间 : print input len
    全局空间 : 当前py文件需要开辟的空间存放在全局空间
    局部空间 : 函数中开辟的空间就是局部空间
    
    加载顺序:
        内置空间 > 全局空间 > 局部空间
    
    取值顺序:
        局部空间 > 全局空间 > 内置空间(找不到就报错了!)
    
    作用域:
        全局作用域: 内置空间 + 全局空间
        局部作用域: 局部空间
    

    10.2.1函数注释

    def func(a,b):
        """
        逻辑判断...
        :param a: str
        :param b: int
        :return: bool
        """
        print(a,b)
    
    def func1(user,password):
        """
        密码加密
        :param user: 用户名 str
        :param password: 密码 str
        :return: 加密的密码 MD5
        """
        print(user,password)
    
    print(func.__doc__)
    print(func1.__doc__)
    print(func.__name__)
    

    10.3 内置函数globals ,nonlocals ,locals

    global : 修改全局空间的变量对应的值
    nonlocal :在外层的函数中,修改局部空间的变量值.完全不涉及全局变量,
    只修改离它最近的一层,最近的一层没有变量继续向上找,直到找到最外层函数

    def func():
        global a  # 声明修改全局变量的值
        a += 1
        print(a)
    func()
    print(a)
    
    a = 10
    def f1():
        a = 10
        def f2():
            a = 15
            def f3():
                global a
                a += 1
                print(a)  # 11
            print(a)  # 15
            f3()
        print(a)  # 10
        f2()
    f1()
    
    a = 10
    def func():
        def f1():
            global a
            a += 1
            def foo():
                nonlocal a
                a += 1
                print(a)   # 31
            foo()
            print(a) # 31
        f1()
    func()
    print(a)   # 10
    
    name = 'alex'
    l1 = [1, 2, 3]
    
    def func():
        age = '18'
    
    print(globals()) # 全局作用域所有的内容
    print(locals())  # 当前位置
    
    name = 'alex'
    l1 = [1, 2, 3]
    
    def func():
        age = '18'
        oldboy = '老男孩教育'
        print(globals()) # 全局作用域所有的内容
        print(locals())  # 当前位置的变量与值的对应关系
    
    func()
    
    name = 'alex'
    l1 = [1, 2, 3]
    
    def func():
        age = '18'
        oldboy = '老男孩教育'
        def inner():
            name_class = 'python23期'
            print(globals()) # 全局作用域所有的内容
            print(locals())  # 当前位置的变量与值的对应关系
        inner()
    func()
    

    10.4函数的嵌套

    def func():
        print(1)
        def f1():
            print(2)
        return f1()
    func()
    
    不管在什么位置,只要是函数名+() 就是在调用此函数
    函数调用执行后,函数体中开辟的空间就自动销毁了
    
    def func():
        a = 1
        def foo():
            b = 2
            print(b)  # 2
            print(a)  # 1
            def f1():
                print(b) # 2
            return f1()
        return foo()
    print(func())
    
    函数互相引用
    
    def func():
        a = 1
        foo()
        print(a)
    
    def foo():
        b = 2
        print(b)
    func()
    
    def a():
        a1 = 1
        c()
        print(c)
    def b():
        b1 = 2
        print(b1)
    def c():
        c1 = 3
        print(a)
    def run():
        a()
    run()
    
    
    def func():
        a = 1
        def b():
            print(a)
    
    def foo():
        b = 1
        def z():
            print(func)
            print(b)
        ret = z()
        func()
        return ret
    
    def run():
        foo()
    print(run())
    
    
    def func(a):
        foo(a) #10
    
    def foo(e):
        b(e) # return 10
    
    def b(c):
        print(c)
        return 10
    
    print(func(5))
    
     例1:
    
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        print(4)
    
    func1()
    print(1)
    func2()
    print(2)
    '''
    in func1
    3
    1
    in func2'
    4
    2
    
    '''
    
    
    例2:
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        func1()
        print(4)
    
    print(1)
    func2()
    print(2)
    
    '''
    1
    in func2
    in func1
    3
    4
    2
    '''
    
    
    例3:
    
    def fun2():
        print(2)
        def func3():
            print(6)
        print(4)
        func3()
        print(8)
    
    print(3)
    fun2()
    print(5)
    
    '''
    3 2 4 6 8 5
    
    
    '''
    
  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/yueling314/p/11246661.html
Copyright © 2011-2022 走看看