zoukankan      html  css  js  c++  java
  • Python3 函数基础2

    可变长参数

    可变长形参: *args

    形参中的* 会将溢出的位置实参全部接收, 然后以元祖的形式存储, 并将元祖赋值给*后面的args

    # 我们习惯把*后面的形参叫做args
    def func(a, *args):
        print(args)
        
    func(1, 2, 3, 4)  # (2, 3, 4)
    

    可变长实参: *容器类

    实参中的*会将其后面的容器类型的元素(列表, 集合, 元祖, 字典)依次取出, 变成位置实参

    def func(a, b, c, d):
        print(a, b, c, d)
        
    tup = (2, 3)    
    func(1, *tup, 4)  # 1 2 3 4
    

    可变长形参: **kwargs

    形参中的**会将溢出的关键字实参全部接收, 然后以字典的形式存储, 并赋值给后面的kwargs

    # 我们习惯把**后面的形参叫做kwargs
    def func(a, **kwargs):
        print(kwargs)
        
    func(1, b=2, c=3)  # {'b': 2, 'c': 3}
    

    可变长实参: **字典

    实参中的**会将其后面的字典类型key:value取出, 转化为关键字实参(key=value)

    def func(a, b, **kwargs):
        print(**kwargs)
        
    dic = {'c':3, 'd':4}
    func(1, 2, **dic)  # {'c': 3, 'd': 4}
    

    函数对象

    我们可以把函数看做一种数据类型, 函数名就是这个函数的函数对象

    引用

    def func():
        print('from func')
    
    print(func)  # <function func at 0x00000000024C1E18>
    
    f = func
    f()  # from func
    

    当做容器类型元素

    def func():
        print('from func')
        
    lis = [func, 1, 2, 3]
    
    lis[0]()  # from func
    

    当做参数传给一个函数

    def func1():
        print('from func1')
        
    def func2(x):
        x()
            
    func2(func1)  # from func1
    

    当做函数的返回值

    def func():
        print('from func1')
    
    def func2(x):
        return x
    
    res = func2(func1)
    res()  # from func1
    

    函数对象应用

    # 简易购物系统
    
    def register():
        print('注册')
    
    
    def login():
        print('登录')
    
    
    def shopping():
        print('购物')
    
    
    func_dict = {
        '1': register,
        '2': login,
        '3': shopping
    }
    
    while True:
        print('''
    1 注册
    2 登录
    3 购物
    ''')
        choice_inp = input('请选择你需要的功能(输入q退出): ')
        if choice_inp == 'q':
            break
        func_dict[choice_inp]()
    

    名称空间和作用域

    名称空间

    用来存储名称的空间(变量名/函数名等)

    内置名称空间

    存储了Python内置方法的名称

    局部名称空间

    存储了函数内部定义的名称

    全局名称空间

    除了内置和局部的名称都存储在全局名称空间

    空间名称的生成顺序

    1. 内置名称空间: Python解释器启动时
    2. 全局名称空间: 执行文件代码时
    3. 局部名称空间: 函数调用的时

    名称空间搜索顺序

    比如我们现在要 print(x), Python解释器就会在各个名称空间搜索我们有没有定义过x

    搜索顺序: 先从当前名称空间开始寻找, 找不到会按着局部-->全局-->内置-->报错顺序寻找

    作用域

    全局作用域

    全局有效, 全局存活, 包含内置名称空间+全局名称空间

    局部作用域

    局部有效, 临时存储, 只包含局部名称空间

    注意事项

    1. 全局作用域和局部作用域之间是相互独立的
    
    def func():
        x = 1
        print(f'局部作用域x: {x}')
        
    x = 2
    func()  # x = 1
    print(f'全局作用域x: {x}')
    
    '''
    局部作用域x: 1
    全局作用域x: 2
    '''
    
    1. 局部作用域1和局部作用域2之间也是相互独立的
    def func1():
        x = 1
        def func2():
            x = 2
            print(f'局部作用域2中x: {x}')
        func2()  # x = 2
        print(f'局部作用域1中x: {x}')
        
        
    func1()
    '''
    局部作用域2中x: 2
    局部作用域1中x: 1
    '''  
    

    补充

    1. global
    x = 1
    
    def func():
        global x  # global声明x为全局变量
        x = 2
    
    func()
    print(x)  # 2
    
    1. nonlocal
    def func1():
        x = 1
        
        def func2():
            nonlocal x  # nonlocal声明x为顶层函数的局部作用域变量
            x = 2
            
        f2()
        print(x)
    
    func1()  # 2
    
    
    1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
    lis = []
    
    def func():
        lis.append(1)
    
    print(f"调用函数前: {lis}")
    func()
    print(f"调用函数后: {lis}")
    
    '''
    调用函数前: []
    调用函数后: [1]
    '''
    
  • 相关阅读:
    设计模式 --单例模式
    Neor Profile SQL 中文汉化
    office online server 安装部署整合到到C#项目
    C# 线程池
    WinForm版 屏幕截图
    golang-nsq高性能消息队列
    【Go Time】Go语言里的条件语句else、switch
    【Go Time】Go语言常量定义关键字const
    【Go Time】Go定义变量
    【Go Time】Go语言里的空接口
  • 原文地址:https://www.cnblogs.com/bigb/p/11559517.html
Copyright © 2011-2022 走看看