如何修改这个Python定义函数代码?

时间:2017-04-07 15:29:44

标签: python function iterable

有谁可以请看一下Python中的以下功能代码?

import numpy as np
import scipy.stats as stats
from scipy.stats import poisson, norm

cs = 100
co = 300
mu = 4.7

G = poisson(mu)
p = G.pmf(np.arange(3*mu))

# Define Z(Q) function 

def Z(Q):
    for i in range(len(p)):
        return sum(p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0))

# Plot Q and (Q)

import pylab as pl

x = []
y = []

for Q in range(0, 12):
    x.append(Q)
    y.append(Z(Q))

pl.plot(x, y, '-o')
pl.show()

错误消息显示在上一个“Plot”过程中: 在Z(Q)中,'numpy.float64'对象不可迭代。

我希望Z(Q)返回在范围(0,len(p))中对每个i求和的值,这是一个具有变量Q的函数。最后,绘图是Q(X轴)和Z(Q )(Y轴)每个Q可以绘制。

如何修改Z(Q)?谢谢!

如果我想输出[Q,Z(Q)]我怎么能做到?我的代码:

   with open('opt.csv', 'wb') as fd:
        a = csv.writer(fd, delimiter=',')
        data1 = [['Order_Number', 'Cost'],
                 [Q, Z(Q)]]
        a.writerows(data1) 

1 个答案:

答案 0 :(得分:0)

如果您期望Z(Q)返回多个值,您可能需要使用“yield”语句:

def Z(Q):
    for i in range(len(p)):
        yield sum(p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0))

这将允许它被迭代并将返回for循环的每次运行的总和。

如果您需要输出作为列表而不是通用的可迭代,您需要在该调用中构造列表,或者将您的调用包装在列表中的Z(Q):list(Z(Q))

修改

仔细观察(并安装正确的库...)后,我的原始答案似乎不正确。堆栈跟踪(理想情况下会包含在您的问题中:))指向Z本身的返回行。这是因为您的原始代码每次迭代sum时都会尝试调用range(len(p)),而不是在所有结果上运行一次。

您可以调整代码,通过移动外部函数来正确返回单个求和值,即:

import numpy as np
import scipy.stats as stats
from scipy.stats import poisson, norm

cs = 100
co = 300
mu = 4.7

G = poisson(mu)
p = G.pmf(np.arange(3*mu))

# Define Z(Q) function 

def Z(Q):
    for i in range(len(p)):
        yield p[i]*cs*max((Q-i), 0) + p[i]*co*max((i-Q), 0)

# Plot Q and (Q)

import pylab as pl

x = []
y = []

for Q in range(0, 12):
    x.append(Q)
    y.append(sum(Z(Q)))

pl.plot(x, y, '-o')
pl.show()

总结一下这些变化:

  • Z(Q)现在产生函数的每次迭代,如上所述
  • sum操作现在在Z(Q)
  • 的结果上运行

我希望有所帮助!