我正在学习任意值参数并阅读stackoverflow this和this答案和其他教程我已经理解了* args和** kwargs在python中做了什么,但我遇到了一些错误。我有两个疑问,第一个是:
如果我运行此代码打印(w),那么我得到此输出:
def hi(*w):
print(w)
kl = 1, 2, 3, 4
hi(kl)
输出:
((1, 2, 3, 4),)
但如果我使用print(*w)
运行此代码,那么我将获得此输出:
代码:
def hi(*w):
print(*w)
kl = 1, 2, 3, 4
hi(kl)
输出:
(1, 2, 3, 4)
我的第二个疑问是:
je = {"a": 2, "b": 4, "c": 6, 4: 5}
for j in je:
print(*je)
输出
b a 4 c
b a 4 c
b a 4 c
b a 4 c
*je
究竟在做什么?它是如何在迭代中工作的?
答案 0 :(得分:4)
当你在参数def hi(*w):
的声明中使用*时,它意味着所有参数都将被压缩为元组,例如:
hi(kl, kl) # ((1, 2, 3, 4), (1, 2, 3, 4))
当您使用print(* w)*运行解压缩元组时。
je={"a":2,"b":4,"c":6,4:5}
for j in je:
print(*je)
在每次迭代中你都使用你的dict解压缩(你使用je并得到你的dict的键,如[j for j in je])
https://docs.python.org/2/tutorial/controlflow.html#tut-unpacking-arguments
答案 1 :(得分:2)
您的第一个案例,因为您将kl
作为元组传递给函数,而不是任意值。因此,*w
将扩展为单个元素元组,其中kl
为第一个值。
你实际上是在打电话:
hi((1, 2, 3, 4))
然而,我怀疑你想要的是
hi(1, 2, 3, 4)
# or in your case
hi(*kl)
在python 3中打印时,print
是一个函数,所以再次。当w
是元组时,您将其称为:
print(w)
# you'll get the tuple printed:
# (1, 2, 3, 4)
但是,您可以再次使用以下参数调用它:
print(1, 2, 3, 4)
# or in your case
print(*w)
# 1 2 3 4
对于您的第二部分,请先查看它转换为列表:
list({"a":2,"b":4,"c":6,4:5})
# ["b", "a", 4, "c"]
# Note, dictionaries are unordered and so the list could be in any order.
如果您要使用*
扩展程序将其传递给打印:
print("b", "a", 4, c)
# or in your case
print(*["b", "a", 4, "c"])
请注意,*
为您执行默认迭代。如果您想要其他一些值,请使用je.values()
或je.items()