如何修改这个 Python 定义函数代码?
Posted
技术标签:
【中文标题】如何修改这个 Python 定义函数代码?【英文标题】:How to modify this Python define function code? 【发布时间】:2017-09-03 01:30:00 【问题描述】:有人可以看看下面的 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()
错误消息显示在最后一个“绘图”过程中: 在 Z(Q) 中,'numpy.float64' 对象不可迭代。
我希望 Z(Q) 返回的值对范围 (0, len(p)) 中的每个 i 求和,这是一个带有变量 Q 的函数。最后绘图是 Q(X Axis) 和 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)
【问题讨论】:
请向我们提供完整、准确的错误消息和跟踪信息。 提示:考虑一个函数 f 包含行def f():
和 <tab>for i in range(10):
和 <tab><tab>return i
。你希望print(f())
显示什么?结果可能会让您大吃一惊。
@deceze 问题已编辑,谢谢!
@Kevin 我的 f() 想返回一个只有变量 Q 的函数,因此对于范围内的每个 i,汇总它们并得到一个 f(Q)
@Kevin 对,正如你所说,如果我尝试了你的提示,它有错误:未定义名称'i'。
【参考方案1】:
如果您希望 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 本身的返回行。这是因为您的原始代码在每次迭代 range(len(p))
时都尝试运行对 sum
的调用,而不是在所有结果上运行一次。
您可以调整您的代码,通过将总和移到函数之外 来正确返回单个总和值,即:
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)
的结果上运行
希望对你有帮助!
【讨论】:
感谢@tr00st 我试图“让出”它,虽然它有相同的错误消息:在 Z 中,类型错误:'numpy.float64' 对象不可迭代。你说的 list(Z(Q) 是什么意思?对不起,我对 Python 有点陌生 我只是想把这个: y.append(Z(Q)) 改成这个: y.append(list(Z(Q))) 虽然如果你在更新后遇到同样的错误Z,这不太可能有帮助。我又看了一遍,很快就会编辑我的答案... 我试过这个功能,它可以工作!谢谢@tr00st 顺便说一句,如果我想将每个 (Q, sum(Z(Q)) 输出到一个 csv 文件中,似乎我不能在我的初始代码中的 Z(Q) 之前添加一个 sum() 函数. 否则会返回最后一个 (Q, Z(Q)) 不确定您的代码到底有什么问题,但我已经在代码中添加了一个 CSV 编写器,并把它放在这里:pastebin.com/hTdkjHPH - 值得比较两者,看看实现有何不同 这就是我想要的。谢谢@tr00st以上是关于如何修改这个 Python 定义函数代码?的主要内容,如果未能解决你的问题,请参考以下文章