python函数进阶

时间:2019-06-18 19:48:21   收藏:0   阅读:108
  1. 函数的传参:形参角度:第三种传参方式。

    **动态参数:*args**

    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('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')
    
    # **kwargs
    def func(**kwargs):  # 函数的定义时:**将实参角度所有的关键字参数聚合成了一个字典,给了kwargs.
        print(kwargs)
    func(name='alex',age=84,hobby='唱跳rap篮球')
    
    # *args,**kwargs 万能参数
    def func(*args,**kwargs):
        print(args,kwargs)
    func(1,2,4,'fjdksal',age=84,hobby='唱跳rap篮球')
    

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

    def sum1(*args):
        # print(args)  (100, 2, 67, 3)
        result = 0
        for i in args:
            result += i
        return result
    print(sum1(100,2,67,3))
  2. *的魔性用法

    # *的魔性用法: (函数中)
    
    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 = 1 , b = 2 , c = [3, 4, 5] 
    a,*c,b, = [1,2,3,4,5] # a = 1 , b = 5 , c = [3, 4, 5]
    a,*c = range(5) # a = 0 , c = [1, 2, 3, 4]
    a,*c,b = (1,2,3,4,5,6) # a = 1 , b = 6 , c = [2, 3, 4, 5]
    print(a,c,b)
    
  3. 形参角度的最终顺序

    # *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)
  4. 函数的传参:形参角度:第四种传参方式(了解)

    # 仅限关键字参数  (了解)
    # 位置参数,*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,)
    
  5. 从空间角度研究函数

    全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。

    临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。

    内置名称空间:input,print,内置函数等。

  6. 取值顺序加载顺序

    加载顺序:上面这三个空间,谁先加载到内存。

    内置名称空间 ----》 全局名称空间 ----》 (函数执行时)临时名称空间

    取值顺序:(就近原则)

  7. 作用域

    全局作用域:全局名称空间,内置名称空间。

    局部作用域:局部名称空间。

  8. 内置函数:globals,locals

    """此文件研究的是内置函数 globals locals"""
    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()
  9. 高阶函数(嵌套函数)

    # 例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
    '''
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!