如何修改这个 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 定义函数代码?的主要内容,如果未能解决你的问题,请参考以下文章

Python动态执行代码修改命名空间

python函数篇

Python学习—函数

Python装饰器(你想知道的这里都有)

Python_函数

python函数