如果我有这样的功能:
def f(a,b,c,d):
print a,b,c,d
Run Code Online (Sandbox Code Playgroud)
那么为什么会这样:
f(1,2,3,4)
f(*[1,2,3,4])
Run Code Online (Sandbox Code Playgroud)
但不是这个:
f(*[1,2] , *[3,4])
f(*[1,2] , *[3,4])
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
?
编辑:有关信息,最初的问题是替换函数包装器中的一个参数.我想替换输入的*args的给定成员并尝试类似于:
def vectorize_pos(f,n=0):
'''
Decorator, vectorize the processing of the nth argument
:param f: function that dont accept a list as nth argument
'''
def vectorizedFunction(*args,**kwargs):
if isinstance(args[n],list):
return map(lambda x : f( *(args[:n]) , x , *(args[n+1,:]), **kwargs),args[n])
else:
return f(*args,**kwargs)
return vectorizedFunction
Run Code Online (Sandbox Code Playgroud)
这就是问题产生的地方.而且我知道还有其他方法可以做同样的事情,但只想了解为什么解压缩一个序列工作但不是更多.
我正在尝试重载__init__()枚举子类的方法。奇怪的是,适用于普通类的模式不再适用于 Enum。
下面显示了使用普通类的所需模式:
class Integer:
def __init__(self, a):
"""Accepts only int"""
assert isinstance(a, int)
self.a = a
def __repr__(self):
return str(self.a)
class RobustInteger(Integer):
def __init__(self, a):
"""Accepts int or str"""
if isinstance(a, str):
super().__init__(int(a))
else:
super().__init__(a)
print(Integer(1))
# 1
print(RobustInteger(1))
# 1
print(RobustInteger('1'))
# 1
Run Code Online (Sandbox Code Playgroud)
如果与 Enum 一起使用,则相同的模式会中断:
from enum import Enum
from datetime import date
class WeekDay(Enum):
MONDAY = 0
TUESDAY = 1
WEDNESDAY = 2
THURSDAY = 3
FRIDAY = 4
SATURDAY = 5
SUNDAY = …Run Code Online (Sandbox Code Playgroud) 我发现列表理解语法非常有用且紧凑.一直使用它后,它让我想在列表外使用它,例如我想改变:
s="sausages hamsters"
intermediate=" and "
word1,word2=s.split()
s2=word1+intermediate+word2
Run Code Online (Sandbox Code Playgroud)
成
word1,word2=s.split()
s2=word1+intermediate+word2 for word1,word2 in s.split
Run Code Online (Sandbox Code Playgroud)
显然它不起作用.我在这里遗漏了什么,或者这根本不可能在一行中完成?
编辑:当然这个例子很愚蠢但在某些情况下我可以看到这个节省多行
编辑:我刚刚编写了示例,以使其阅读更加愉快,但我的问题的更多文字版本将是:
"在一个声明中,有没有办法以这种方式创建变量:
newVar= <expression using still undefined variables> \
<some keyword or symbols> \
<declaration of pre-cited undefined variables>
Run Code Online (Sandbox Code Playgroud)
就像列表理解允许这样做:
newList=[<expression using still undefined variables>
for <declaration of pre-cited undefined variables, as result of an iterator>]
Run Code Online (Sandbox Code Playgroud)
如果我们可以建立列表,是否也可以用于简单的单个对象?"