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
    
    
    '''
    
  • 相关阅读:
    Repository中进行模糊查询
    Spring jpa添加查询条件
    java后端repository层中进行模糊查询
    MyBatis小白问题 1、Invalid bound statement (not found): com.itheima.dao.UserDao.findAll,2、Resources.getResourceAsStream()报错
    Date类型做加减运算
    时间格式转换
    mysql-支持的数据类型
    mysql—表的完整性约束
    数据库—表操作(第二章)
    mysql—使用python操作mysql数据库(第五章)
  • 原文地址:https://www.cnblogs.com/yueling314/p/11246661.html
Copyright © 2011-2022 走看看