在下面的方法定义,什么是*
和**
为做param2
?
def foo(param1, *param2):
def bar(param1, **param2):
Run Code Online (Sandbox Code Playgroud) python syntax parameter-passing variadic-functions argument-unpacking
*
运算符在Python 中的含义是什么,例如在代码中zip(*x)
或f(**k)
?
python syntax parameter-passing argument-unpacking iterable-unpacking
考虑一下这些表达方式......请耐心等待...这是一个很长的清单......
(注意:重复一些表达式 - 这只是为了呈现"上下文")
a, b = 1, 2 # simple sequence assignment
a, b = ['green', 'blue'] # list asqignment
a, b = 'XY' # string assignment
a, b = range(1,5,2) # any iterable will do
# nested sequence assignment
(a,b), c = "XY", "Z" # a = 'X', b = 'Y', c = 'Z'
(a,b), c = "XYZ" # ERROR -- too many values to unpack
(a,b), c = "XY" # ERROR -- need more than 1 value …
Run Code Online (Sandbox Code Playgroud) 所以在Python和Ruby中,有一个splat运算符(*)用于将数组作为参数解包.在Javascript中有.apply()函数.有没有办法在Go中将数组/切片作为函数参数解包?任何资源都会很棒!
有点像这样:
func my_func(a, b int) (int) {
return a + b
}
func main() {
arr := []int{2,4}
sum := my_func(arr)
}
Run Code Online (Sandbox Code Playgroud)
如果我犯了语法/各种错误,我会道歉.我是Go的新手.
如果没有子类化dict,那么类需要被视为一个映射,以便它可以传递给**的方法
from abc import ABCMeta
class uobj:
__metaclass__ = ABCMeta
uobj.register(dict)
def f(**k): return k
o = uobj()
f(**o)
# outputs: f() argument after ** must be a mapping, not uobj
Run Code Online (Sandbox Code Playgroud)
至少到它抛出缺少映射功能的错误,所以我可以开始实现.
我查看了模拟容器类型,但只是定义魔术方法没有效果,并且使用ABCMeta覆盖并将其注册为dict将断言验证为子类,但是失败是isinstance(o,dict).理想情况下,我甚至不想使用ABCMeta.
我一直在寻找将Python倾向于调用它们的数组或列表传递给函数.
我读了一些关于使用*args的内容,例如:
def someFunc(*args)
for x in args
print x
Run Code Online (Sandbox Code Playgroud)
但不确定这是对还是错.似乎没有什么能像我想的那样工作.我习惯于能够轻松地将数组传递给PHP函数,这让我感到困惑.我似乎也做不到这个:
def someFunc(*args, someString)
Run Code Online (Sandbox Code Playgroud)
因为它引发了一个错误.
我想我只是让自己完全糊涂了,并且正在找人为我清理它.
从列表中提取项目并将它们作为参数传递给函数调用的简单方法是什么,如下例所示?
例:
def add(a,b,c,d,e):
print(a,b,c,d,e)
x=(1,2,3,4,5)
add(magic_function(x))
Run Code Online (Sandbox Code Playgroud) 有没有人知道为什么unary(*
)运算符不能用在涉及iterators/lists/tuples的表达式中的原因?
为什么它只限于功能拆包?或者我认为错了?
例如:
>>> [1,2,3, *[4,5,6]]
File "<stdin>", line 1
[1,2,3, *[4,5,6]]
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
为什么不是*
运营商:
[1, 2, 3, *[4, 5, 6]] give [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
而当*
操作符与函数调用一起使用时,它会扩展:
f(*[4, 5, 6]) is equivalent to f(4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
使用列表时+
和*
使用列表时之间存在相似性,但在使用其他类型扩展列表时则不相似.
例如:
# This works
gen = (x for x in range(10))
def hello(*args):
print args
hello(*gen)
# but this does not work
[] + gen
TypeError: can only concatenate …
Run Code Online (Sandbox Code Playgroud) python argument-unpacking python-2.7 iterable-unpacking pep448
我有一个函数定义如下,我传递的是关键字参数.如何返回与关键字参数同名的字典?
我可以手动做:
def generate_student_dict(first_name=None, last_name=None , birthday=None, gender =None):
return {
'first_name': first_name,
'last_name': last_name,
'birthday': birthday,
'gender': gender
}
Run Code Online (Sandbox Code Playgroud)
但我不想这样做.有没有什么方法可以让我在没有实际输入字典的情况下完成这项工作?
def generate_student_dict(self, first_name=None, last_name=None, birthday=None, gender=None):
return # Packed value from keyword argument.
Run Code Online (Sandbox Code Playgroud) 拆包/图示运营商*
和**
在横跨Python版本(2.7,3.X <3.5和3.x> = 3.5)其适用性广泛不同.
例如:
| 2.7 | 3.1-3.4 | 3.5
----------------------------------------------------------------------
function(*args) ? ? ?
x, *y, z = [1, 2, 3, 4, 5] x ? ?
{**x, **y} x x ?
Run Code Online (Sandbox Code Playgroud)
我错过了各种版本之间是否还有其他差异?我正在浏览PEP和Readmes,但文档并未详细说明.
python function parameter-passing argument-unpacking iterable-unpacking
python ×9
syntax ×2
class ×1
dictionary ×1
function ×1
go ×1
list ×1
mapping ×1
pep448 ×1
python-2.7 ×1
python-3.x ×1