我正在通过一个函数运行多个浮点数以生成科学计数法。但是,并非所有的浮子都始终被放入(它是随机的),因此会产生错误。
输入:
a0,hvt,at,lambd = signify(a0,hvt,at,lambd)
功能:
def signify(*args):
rst = []
for arg in args:
if arg >= 100.0 or arg <= 0.01:
arg = '{:.2e}'.format(arg)
rst.append(arg)
return rst
换句话说,“ rst”并不总是由四个元素组成(感谢辛格指出)。
有人愿意指出我正确的方向吗?
答案 0 :(得分:1)
我认为您不太了解错误是什么。您可以发布错误消息吗?
我怀疑您试图分配a0,hvt,at,lambd = signify(a0,hvt,at,lambd)
是真正的罪魁祸首,如果从函数返回的“ rst”没有4个元素怎么办?左侧的语法强制将右侧的列表准确地分解为4个元素,并在不匹配时引发ValueError: too many values to unpack (expected 4)
。
尝试result = signify(a0,hvt,at,lambd)
并检查输出。
更新:
如果您只想修改4个术语中的一些,而让其余部分照原样通过,则只需要一个else部分。这就是您如何想到整个过程的方法。
def signify(*args):
rst = []
print(args)
for arg in args:
if arg >= 100.0 or arg <= 0.01:
arg = '{:.2e}'.format(arg) #returns a string
rst.append(arg)
else:
rst.append(arg) #take note that this else statement is the same as the last statement of if block
#also note that args going through else block are not "strings" unlike the if block, which gives a string during ".format()"
return rst
我们可以对此进行改进。
def signify(*args):
rst = []
print(args)
for arg in args:
if arg >= 100.0 or arg <= 0.01:
arg = '{:.2e}'.format(arg)
rst.append(arg) #note that you may want to typecast to string to maintain uniformity.
#rst.append(str(arg))
return rst
但是,这本质上与在所有args上应用函数相同。我们可以创建一个强调这种“按条件工作”方法的函数。
def signify_single(single_arg):
if single_arg >= 100 or single_arg <= 0.01:
return '{:.2e}'.format(single_arg)
return single_arg #or str(single_arg)
a,b,c,d = (signify_single(x) for x in (101,202,303,40))
但是,这使我们意识到这只是if-else语句。它们不必一定很丑。 (PS。最后一行是list comprehension.)
a,b,c,d = ('{:.2e}'.format(x)
if (x >= 100 or x <= 0.01)
else x #or str (x)
for x in (101,202,303,40))
可以稍微调整一下条件,以使我们有一个更清晰的理解。 请注意,如果您愿意,也可以将它们写在一行中。
a,b,c,d = (x if (0.01 < x < 100) else '{:.2e}'.format(x) for x in (101,202,303,40))
您可以使用任何一种看起来最干净的样式,或者探索并找到更好的样式。像这样将它应用于您的情况。
a0,hvt,at,lambd = (x if (0.01 < x < 100) else '{:.2e}'.format(x) for x in (a0,hvt,at,lambd))