zoukankan      html  css  js  c++  java
  • python基础 day10 函数式编程、名称空间、作用域、高阶函数

    一、函数的参数

    3.万能参数

    *args

    函数定义时,*代表聚合,它将所有的位置参数聚合成一个元组,赋值给了args

    def fun_name(*args):
        print('%s, %s, %s, %s' % args)
    
    
    fun_name('jason', 'carly', 'dog', 'cat')
    

    练习:写一个函数,计算出传入函数的所有数字的乘积

    def func(*args):
        result = 1
        for i in args:
            result = i * result
        return result
    
    
    print(func(1, 2, 3, 4))
    

    **kwargse

    函数定义时,**代表聚合,它将所有的关键字参数聚合成一个字典,赋值给了kwargs

    def info(**kwargs):
        print(kwargs)
    
    
    info(name='jason', age=24, sex='man')
    
    # 万能参数
    def info(*args, **kwargs):
        print(args)
        print(kwargs)
    

    形参的顺序:

    def func(位置参数,*args,默认参数,仅限关键字参数,**kwargs):
    # 默认参数和仅限关键字参数顺序可互换
    

    在函数调用时,*代表打散

    • 打散的只能时可迭代对象
    • 实际效果相当于for循环每一个传入的可迭代对象,在将循环得到的结果传给*args
    def func(*args):
        print(args)
    
    
    func(*'1234', *'5678')  #结果为('1', '2', '3', '4', '5', '6', '7', '8')
    
    def func(*args):
        print(args)
    
    
    func(*[1, 2, 3, 4], *[5, 6, 7, 8])  # 结果为(1, 2, 3, 4, 5, 6, 7, 8)
    
    def func(*args):
        print(args)
    
    
    func(*{'k1': 'v1', 'k2': 'v2'}, *{'k3': 'v3', 'k4': 'v4'})
    # 结果为('k1', 'k2', 'k3', 'k4')
    

    用**只能打散字典

    • 实际效果相当于for循环传入的每一个字典,而kwargs就是循环得到的所有键值对构成的一个字典
    def func(**kwargs):
        print(kwargs)
    
    
    func(**{'k1': 'v1', 'k2': 'v2'}, **{'k3': 'v3', 'k4': 'v4'})
    # 结果为{'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}
    

    *的其他用法

    # 首先看下分别赋值
    a, b = (1, 2)
    print(a, b)  # 1 2
    # 其实还可以这么用:
    a, *b = (1, 2, 3, 4,)
    print(a, b)  # 1 [2, 3, 4]
    *rest, a, b = range(5)
    print(rest, a, b)  # [0, 1, 2] 3 4
    print([1, 2, *[3, 4, 5]])  # [1, 2, 3, 4, 5]
    

    二、名称空间

    1. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

    2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间

    3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

    加载顺序:内置命名空间-->局部命名空间-->全局命名空间
    取值顺序:全局命名空间-->局部命名空间-->内置命名空间

    三、作用域

    1.全局作用域:内置名称空间、全局名称空间
    2.局部作用域:局部名称空间

    • 局部作用域可以引用全局作用域的变量
    • 全局作用域不可引用局部作用域的变量
    • 局部作用域不可改变全局作用域的变量

    globals() locals()

    a = 1
    b = 2
    def func():
        c = 3
        d = 4
        print(globals())
        print(locals())
    func()
    

    四、高阶函数

    def func1():
        print(1)
        def fun2():
            print(2)
            print(3)
        fun2()
        print(4)
    func1()
    """结果为:
    1
    2
    3
    4
    """
    
  • 相关阅读:
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 344 反转字符串
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
  • 原文地址:https://www.cnblogs.com/west-yang/p/12590616.html
Copyright © 2011-2022 走看看