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

How to modify this Python define function code?

谁能看看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) returns 对范围 (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) 

如果您期望 Z(Q) 为 return 多个值,您可能需要使用 "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))

这将允许对其进行迭代,并将 return for 循环的每个 运行 的总和。

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


编辑:

仔细查看(并安装正确的库...)后,我原来的答案似乎不正确。堆栈跟踪(最好包含在您的问题中:))指向 Z 本身的 return 行。这是因为您的原始代码在每次迭代 range(len(p)) 时都试图 运行 调用 sum 而不是 运行 在所有结果上调用一次。

您可以调整您的代码以正确地执行 return 单个求和值,方法是将求和 移到 函数之外,即:

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)
  • 的结果

希望对您有所帮助!