Проблемы с импортом - PullRequest
       12

Проблемы с импортом

1 голос
/ 29 сентября 2011

Вот часть моего модуля: 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 ]

4 голосов
/ 29 сентября 2011

Либо ссылаться на функции на объекте модуля:

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. Два не одинаковы.

2 голосов
/ 29 сентября 2011

Сначала нужно указать имя модуля (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 - Руководство по стилю для кода Python

Руководство по пространствам имен Python по различиям между from blah import foo и import blah

  • import SomeModule

Это самый простой способ сделать импорт и обычно рекомендуется.Вы получаете доступ к пространству имен модуля при условии, что вы используете имя модуля в качестве префикса.Это означает, что в вашей программе могут быть имена, совпадающие с именами в модуле, но вы сможете использовать оба из них.Это также полезно при импорте большого количества модулей, поскольку вы видите, к какому модулю относится определенное имя.

  • из SomeModule import SomeName

Импортирует имя(или несколько, разделенных запятыми) из пространства имен модуля непосредственно в программу.Чтобы использовать имя, которое вы импортировали, вам больше не нужно использовать префикс, только имя напрямую.Это может быть полезно, если вы точно знаете, что вам нужно использовать только несколько имен.Недостатком является то, что вы не можете использовать имя, которое вы импортировали для чего-то другого в вашей собственной программе.Например, вы можете использовать add () вместо Integer.add (), но если ваша программа имеет функцию add (), вы потеряете доступ к функции add () Integer.

...