获得“无”的输出,但不确定是什么触发了它

时间:2019-10-25 00:18:39

标签: python function numpy

我有一个绘制两个直方图的函数,以及一种从作业中提供给我的表中计算某些统计信息的方法。当我在jupyter笔记本中运行此功能时,将得到以下输出:

None                #Not quite sure where this came from
(26.54, 4269775.77) #This is calculated correctly

<histogram 1> #This is rendered correctly
<histogram 2> #This is also rendered correctly

我的预期输出应该只是

(26.54, 4269775.77)

<histogram 1>
<histogram 2>

我尝试注释掉不同的行,以查看是否可以隔离问题,但无济于事。下面是我正在运行的代码,与上面的输出相对应

def compute_statistics(age_and_salary_data):
    t = full_data
    age = t.column('Age')
    salary = t.column('Salary')
    age_and_salary_data = Table().with_columns('Age', age, 'Salary', salary)
    print(age_and_salary_data.hist('Age', bins = (np.arange(18,np.max(age)+1,1))))
    average_age = np.mean(age)
    average_salary = np.mean(salary)
    average_list = (np.round(average_age, 2), np.round(average_salary,2))
    return age_and_salary_data.hist('Salary', bins = np.arange(0,np.max(salary)+1, 1000000))
average_age = np.mean(full_data.column('Age'))
average_salary = np.mean(salary_data.column('Salary'))
average_list = (np.round(average_age, 2), np.round(average_salary, 2))
compute_statistics(full_data)
print(average_list)

当我通过平地机运行此程序时,我会遇到以下有关为什么我得到错误答案的答案。

>>> round(float(compute_statistics(full_data)[0]), 2) == 26.54
None
TypeError: 'NoneType' object is not subscriptable

# Error: expected
#     True
# but got
#     Traceback (most recent call last):
#       ...
#     TypeError: 'NoneType' object is not subscriptable

2 个答案:

答案 0 :(得分:0)

继续使用该功能,并通过删除功能print中的compute_statistics语句并像其他直方图一样将直方图呈现为回报,从而摆脱了讨厌的问题。供参考:

def compute_statistics(age_and_salary_data):
    age = full_data.column('Age')
    salary = salary_data.column('Salary')
    age_and_salary_data = Table().with_columns('Age', age, 'Salary', salary)
    average_age = np.mean(age)
    average_salary = np.mean(salary)
    average_list = (np.round(average_age, 2), np.round(average_salary,2))
    return age_and_salary_data.hist('Salary', bins = np.arange(min(salary),max(salary)+1, 1000000)), age_and_salary_data.hist('Age', bins = (np.arange(min(age),max(age)+1,1)))
average_age = np.mean(full_data.column('Age'))
average_salary = np.mean(salary_data.column('Salary'))
average_list = (np.round(average_age, 2), np.round(average_salary, 2))
compute_statistics(full_data)
print(average_list)

虽然这解决了我的问题,但我想可以将其视为答案,但我仍然不确定为什么要按照我的工作做,而不要出具印刷声明,任何见识都会受到赞赏

答案 1 :(得分:0)

在笔记本中:调用compute_statistics(full_data)print.hist方法的一个结果,然后return是另一个方法的结果。在这两种情况下,该方法都返回None,因此print会显示该内容,然后return ed的值也为None,但是代码中没有任何东西可以使用它。然后,您print(average_list),它将为您提供控制台中的最后一个值,并且您还将看到直方图。

.hist方法可能会产生直方图作为副作用,并返回None,因为没有返回值。

round(float(compute_statistics(full_data)[0]), 2) == 26.54

这是测试代码的样子。它期望在调用average_list时重新获得compute_statistics值,以便可以提取平均年龄,将其取整,然后与期望值进行比较。但是,它收到None,但不能下标。

测试代码根本不在乎您print。 (我假设在提供的datascience库中,.hist方法进行了某种跟踪,以确保您进行了预期的绘制这些直方图的调用。)

再次阅读分配规范,并确保您了解returnprint的区别。