加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python3 函数基础2

发布时间:2020-12-20 10:38:37 所属栏目:Python 来源:网络整理
导读:目录 可变长参数 可变长形参: *args 可变长实参: *容器类 可变长形参: **kwargs 可变长实参: **字典 函数对象 引用 当做容器类型元素 当做参数传给一个函数 当做函数的返回值 函数对象应用 名称空间和作用域 名称空间 内置名称空间 局部名称空间 全局名称空

目录

  • 可变长参数
    • 可变长形参: *args
    • 可变长实参: *容器类
    • 可变长形参: **kwargs
    • 可变长实参: **字典
  • 函数对象
    • 引用
    • 当做容器类型元素
    • 当做参数传给一个函数
    • 当做函数的返回值
    • 函数对象应用
  • 名称空间和作用域
    • 名称空间
      • 内置名称空间
      • 局部名称空间
      • 全局名称空间
      • 空间名称的生成顺序
      • 名称空间搜索顺序
    • 作用域
      • 全局作用域
      • 局部作用域
      • 注意事项
      • 补充

可变长参数

可变长形参: *args

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

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

可变长实参: *容器类

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

def func(a,b,c,d):
    print(a,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,**kwargs):
    print(**kwargs)
    
dic = {'c':3,'d':4}
func(1,**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,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]
'''

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读