栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python逆向参数收集

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python逆向参数收集

Python逆向参数收集
  • 1、用 * 实现可迭代对象的解包
  • 2、函数形参是普通形参
  • 3、函数形参是 *args 形参
  • 4、不给 args 传参
  • 5、字典的逆向收集

所谓逆向参数收集,指的是把可迭代对象拆开后作为实参传给函数的形参。逆向参数收集需要在传入的表示可迭代对象的变量名之前添加一个星号,在字典参数之前添加两个星号。

可迭代对象都可以解包。

除字典外的可迭代对象解包后以位置实参形式传入,字典解包后以关键字实参形式传参,要据此确定形参的形式。

1、用 * 实现可迭代对象的解包
a = [1,2,3,4,'a','b','c']
print(a)	# 这样输出a是带方括号的
print(*a)	# 这样输出a是不带方括号的

b={'a':1,'b':2,'c':3}
print(b)	# 字典原样输出
print(*b)	# 一个一个输出键,就是把字典解包然后只输出键,字符串形式的键输出时不带双引号了。这里只能用一个 *

输出:

[1, 2, 3, 4, 'a', 'b', 'c']
1 2 3 4 a b c
{'a': 1, 'b': 2, 'c': 3}
a b c
2、函数形参是普通形参

当函数形参是普通形参时,如果不使用逆向收集(不在列表变量名之前添加星号),整个列表将会作为一个参数,而不是将列表的元素作为多个参数。

def greet(name1,name2):
	print(f"Hello,{name1.title()}.")
	print(f"Hello,{name2.title()}.")

names = ['zhang','wang']
greet(*names)	

输出:

Hello,Zhang.
Hello,Wang.
3、函数形参是 *args 形参
def greet(name1,name2,*args):
	print(f"Hello,{name1.title()}.")
	print(f"Hello,{name2.title()}.")
	print(f"Hello,{args}.")

names=['zhao','zhang','wang','li','cao','hong']
greet(*names)  # 解包之后前两个元素传给普通形参 name1 和 name2,剩下的实参被打包成元组传给形参 args
greet('ning',*names)  # 解包之后第一个元素传给普通形参 name2,剩下的实参被打包成元组传给形参 args

输出:

Hello,Zhao.
Hello,Zhang.
Hello,('wang', 'li', 'cao', 'hong').
Hello,Ning.
Hello,Zhao.
Hello,('zhang', 'wang', 'li', 'cao', 'hong').

错误情况:列表被解包后传给 args 再打包,但是后面两个普通形参缺少关键字实参

# 错误示例
def greet(*args,name1,name2):
	print(f"Hello,{name1.title()}.")
	print(f"Hello,{name2.title()}.")
	print(f"Hello,{args}.")

names=['zhao','zhang','wang','li','cao','hong']
greet(*names)

报错:TypeError: greet() missing 2 required keyword-only arguments: ‘name1’ and ‘name2’


4、不给 args 传参
def greet(name1,*args):
	print(name1)
	print(args)

names=['zhao','zhang','wang','li','cao','hong']
greet(names)	# 没有给 args 传递实参,元组为空元组,输出的是列表,带方括号

输出:

['zhao', 'zhang', 'wang', 'li', 'cao', 'hong']
()

5、字典的逆向收集

字典也支持逆向收集,字典将会以关键字参数的形式传入。

def buy(book, price, desc): 
    print(book, "价格是:", price) 
    print('描述信息', desc)

my_dict = {'price': 15, 'book': '汤姆叔叔的小屋', 'desc': '这是一个关于美国黑奴的故事。'}
# 按逆向收集的方式将my_dict的多个key-value传给buy()函数
buy(**my_dict)

输出:

汤姆叔叔的小屋 价格是: 15
描述信息 这是一个关于美国黑奴的故事。

在上述程序中,键和形参相同。键值对顺序不需要和形参顺序相同。buy() 需要三个参数。接下来程序定义了一个 my_dict 字典,该字典正好包含三个 key-value 对,程序使用逆向收集即可将 my_dict 包含的三个 key-value 对以关键字参数的形式传给 buy() 函数。


字典解包后以关键字实参的形式传参,所以不能用 *args 作为形参,可以用 **kwargs 作为形参。

# 错误示例
def buy(*book): 
    print(book)
my_dict = {'price': 15, 'book': '汤姆叔叔的小屋', 'desc': '这是一本关于美国黑奴的故事。'}
# 按逆向收集的方式将my_dict的多个key-value传给buy()函数
buy(**my_dict)

报错:TypeError: buy() got an unexpected keyword argument ‘price’

看报错的解释,定义 buy 函数的原意是接受位置实参(任意多个),此处却传递了关键字实参,因而出错。

def buy(**book): 
    print(book)
my_dict = {'price': 15, 'book': '汤姆叔叔的小屋', 'desc': '这是一本关于美国黑奴的故事。'}
# 按逆向收集的方式将my_dict的多个key-value传给buy()函数
buy(**my_dict)

输出:

{'price': 15, 'book': '汤姆叔叔的小屋', 'desc': '这是一本关于美国黑奴的故事。'}

可以看见字典原样输出了,因为在调用函数 buy 时用 ** 解包,在函数接受实参时又用 ** 压包,且是压成字典形式,故而得到了字典的原样。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/355730.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号