• 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 笔记 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
    JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
    配置mabatis,报Could not load driverClass ${jdbc.driverClassName}
    maven-配置文件配置src/resource下的文件
    eclipse中tomcat 中server location灰色,如何修改?
    解决maven项目update project会更改jdk版本问题
    maven创建web工程Spring配置文件找不到问题解决方案
    maven:pom.xml中没有dependency标签错误
    [转载]如何让上传到新浪博客和相册中的照片更大更清晰
    [转载]如何让上传到新浪博客和相册中的照片更大更清晰
  • 原文地址:https://www.cnblogs.com/west-yang/p/12590616.html
Copyright © 2020-2023  润新知