【问题标题】:Result of function vs loop函数与循环的结果
【发布时间】:2020-06-02 18:57:46
【问题描述】:

我的第一个脚本不返回整个输入列表的结果,第二个不返回可迭代元组。有什么建议吗?

input= [0.1, 0.2]
def newvalue():
    for i in input:
        value=integrate.quad(lambda i:(np.exp(-i))/i,i,np.inf)
        return value[0]
print(newvalue()) #1.8229239584193715

如果我使用以下脚本,它会完成工作并打印输入列表产生的所有值,但这个脚本的问题是我无法遍历计算值。

for i in input:
    value = integrate.quad(lambda i: (np.exp(-i)) / i, i, np.inf)
    print(value[0]) #1.8229239584193715
                    #1.2226505441838773

【问题讨论】:

  • 你需要建立一个数组并在for循环结束后返回它。
  • return 打破循环。
  • 您在寻找yield 吗?而不是打破循环,它会在每次调用时为您提供下一个值,查看generators,...您还应该将“输入”作为参数传递,而不是将其用作全局

标签: python loops tuples


【解决方案1】:

正如 cmets 中所说,您需要创建一个循环并在其中附加值,如下所示:

import numpy as np
from scipy import integrate

input_= [0.1, 0.2]

def newvalue():
    values = []
    for i in input_:
        value=integrate.quad(lambda i:(np.exp(-i))/i,i,np.inf)
        values.append(value[0])
    return values

print(newvalue()) #[1.8229239584193715, 1.2226505441838773]

【讨论】:

  • input_ 显然是 newvalue 函数的 input,因此应该是参数,而不是全局变量。
  • 我完全同意...我总是尝试用最少的更改来解决问题。
【解决方案2】:

第一个脚本只提供一个值,因为循环中有一个 return — 之后循环不会继续。

有两种典型的方法来处理这种情况。第一种是在循环之前创建一个空数组,在循环期间将每个结果添加到数组中,并在循环之后返回该结果数组。如果值/循环的数量很少,这种方法是可以的,即您不想构建一个 10,000,000 元素的数组。

如果值/循环的数量更大,或者如果您的外部函数可能不需要所有值,请使用 yield 代替您的返回。这允许被调用函数在从外部循环调用时根据需要生成每个值。

【讨论】:

    【解决方案3】:

    在调用return 语句后,函数不会继续,所有未返回或未由函数范围外的变量引用的信息都会丢失。

    Anwarvic 的回答应该可以解决问题。

    【讨论】:

      【解决方案4】:

      你的函数不应该从全局变量中获取它的参数。 您可以定义您的函数,使其接受一个值,并返回该值的计算结果。

      def newvalue(input):
          value=integrate.quad(lambda i:(np.exp(-i))/i,i,np.inf)
          return value
      

      然后你可以用几种不同的方式查询它:

      1. 循环中
      for i in [0.1, 0.2]:
          print(newvalue(i))
      
      1. 或通过列表理解:
      inputs = [0.1,0.2]
      answers = [newvalue(i) for i in inputs]
      
      print(answers)
      
      

      【讨论】:

        【解决方案5】:

        在您的第一个示例中,只需替换命令

        return value[0]
        

        yield value[0]
        

        那么你可以在这些形式中使用newvalue(),例如:

        1. list(newvalue()) 获取所有计算值的列表,
        2. for i in newvalue(): 遍历计算值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多