通过Python函数运行多个输入

时间:2018-12-09 07:00:23

标签: python

我正在通过一个函数运行多个浮点数以生成科学计数法。但是,并非所有的浮子都始终被放入(它是随机的),因此会产生错误。

输入:

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”并不总是由四个元素组成(感谢辛格指出)。

有人愿意指出我正确的方向吗?

1 个答案:

答案 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))