【问题标题】:Import troubles进口麻烦
【发布时间】:2011-09-29 00:43:42
【问题描述】:

这是我的模块的一部分: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。我不确定我是否正确地进行了导入? 我需要做类似... from gm import avg_list() 的事情吗?

【问题讨论】:

    标签: python import importerror


    【解决方案1】:

    要么引用模块对象上的函数:

    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
    

    最后,看看那个函数的最后一行——它是printing avg,但stats 期望它是return avg。两者不一样。

    【讨论】:

    • 如果我将 sorted 添加到第一个分支,我会收到 TypeError: 'int' object is not iterable。
    • @G.G 你不能把整个东西都包在sorted中,我的意思是你需要对列表进行排序查找中位数之前,列表是否有奇数或偶数个条目。尝试将list = sorted(list)list.sort() 添加到函数顶部,并去掉对sorted 的其他调用。
    • @afg 啊,我的错……我能做到。我使用正确的导入再次运行程序并返回:>>> stats([2,5,6,7,8]) 5.6 {'average': None, 'median': 6}
    • 我修复了它,所以它不是打印平均值,而是返回它。抱歉这个菜鸟问题......你如何遮蔽你句子的某些部分以指定为代码?
    • 使用反引号 / 反引号 / 反引号 -- ` -- 在键盘上的 1 旁边使用 ~。见stackoverflow.com/editing-help
    【解决方案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 Namespacesfrom blah import fooimport blah 之间的区别

    • 导入 SomeModule

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

    • 从 SomeModule 导入 SomeName

    这会从模块的 命名空间直接进入程序的。要使用您导入的名称, 您不再需要使用前缀,只需直接使用名称即可。这个可以 如果您确定只需要使用几个名称,这将很有用。 缺点是你不能使用你导入的名字来做某事 其他在您自己的程序中。例如,您可以使用 add() 而不是 Integer.add(),但如果你的程序有 add() 函数,你会输 访问 Integer 的 add() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多