输入麻烦

时间:2011-09-29 00:43:43

标签: python import importerror

以下是我的模块的一部分:gm.py

def avg_list(list): 
    sum = 0
    for num in list:
        sum += num

    avg = float(sum)/len(list)
    print avg



def median(list):
    i = len(list)
    if not i%2: # if i divided my 2 has no remainder

        return (list[(i/2)-1]+list[i/2])/2.0 # return the value of this block


    else:
        median = sorted(list)[len(list)/2] # otherwise, when the list is sorted, the index of len(s) / 2 is the middle number.
        return median

当我将其保存为'gm.py'并打开一个新的脚本页面以输入以下功能时:

import gm
def stats(list):

    stats = {}  # empty dict named stats
    stats['average'] = avg_list(list) # Stats(key)[average] = mean of the list of numbers [values]
    stats['median'] = median(list) # same for median
    return stats

当我运行这个程序并输入stats([2,3,4,5,6])...我得到一个错误,说明未定义全局变量avg_list。我不确定我是否正确进行导入? 我需要做一些像gm import avg_list()吗?

2 个答案:

答案 0 :(得分:4)

引用模块对象上的函数:

import gm
def stats(list):

    stats = {}  # empty dict named stats
    stats['average'] = gm.avg_list(list) # Stats(key)[average] = mean of the list of numbers [values]
    stats['median'] = gm.median(list) # same for median
    return stats

或将函数直接导入全局命名空间:

from gm import avg_list, median
def stats(list):

    stats = {}  # empty dict named stats
    stats['average'] = avg_list(list) # Stats(key)[average] = mean of the list of numbers [values]
    stats['median'] = median(list) # same for median
    return stats

请注意您不应将变量命名为list 。这会掩盖内置的list()函数/类型,如果您需要使用它,可能会导致混淆错误。

你可以写

stats = {}  # empty dict named stats
stats['average'] = avg_list(list) # Stats(key)[average] = mean of the list of numbers [values]
stats['median'] = median(list) # same for median
return stats

作为

stats = {'average': avg_list(list), 'median': median(list)}
return stats # or just return the dict literal, no real need to give it a name.

我认为您应该查看median函数的第一个分支。列表是否也需要在那里进行排序,比如第二个分支?

您的avg_list功能还屏蔽了内置函数sum(),您可以在此处使用,而不是手动添加:

def avg_list(list): 
    avg = float(sum(list))/len(list)
    print avg

最后,请查看该函数的最后一行 - print avg,但stats期待它return avg 。两者不一样。

答案 1 :(得分:2)

您需要首先放置模块名称(gm.avg_list()gm.median()),如下所示:

import gm
def stats(list):

    stats = {}  # empty dict named stats
    stats['average'] = gm.avg_list(list) # Stats(key)[average] = mean of the list of numbers [values]
    stats['median'] = gm.median(list) # same for median
    return stats

一些参考链接和更多信息:

PEP 8 - Style Guide for Python Code

A guide to Python Namespaces关于from blah import fooimport blah

之间的差异
  
      
  • 导入SomeModule
  •   
     

这是进行导入的最简单方法,通常建议使用。您   如果您使用模块,则可以访问模块的命名空间   将名称作为前缀。这意味着您可以在程序中使用名称   这些与模块中的相同,但您将能够使用   他们都。当您导入大量数据时,它也很有用   您可以看到特定名称属于哪个模块的模块。

     
      来自SomeModule的
  • 导入SomeName
  •   
     

这会从模块中导入一个名称(或几个,以逗号分隔)   命名空间直接进入程序的。要使用您导入的名称,   你不再需要使用前缀,只需要直接使用名称。这个可以   如果你确定知道你只需要使用几个名字就会很有用。   缺点是您不能使用您导入的名称   在你自己的程序中。例如,您可以使用add()而不是   Integer.add(),但是如果你的程序有add()函数,你就输了   访问Integer的add()函数。