2015-11-14 5 views
0

У меня головная боль с глобальной проблемой ссылки на переменные в простой программе подсчета частоты слов. Я проверяю ответы от here и here и python docs; однако, я до сих пор не понял идею глобальной переменной.Как ссылаться на глобальную переменную более чем на одну функцию?

from collections import Counter 

with open('c:/Users/Nick/Downloads/sample_file.txt') as f: 
    words = f.read().lower().split() 

c = Counter(words) 

total_words = sum(c.values()) 


def top_n_words(n): 
    global c 
    # c = Counter(words) 
    top_n = c.most_common(n) 
    print("Top %d words are:" % n) 
    print("-" * 20) 
    for w, c in top_n: 
     # print("%10s: %-10s" % (w, c)) 
     print("{word:>10s}: {counts:<10d}".format(word=w, counts=c)) 


def word_appears(w): 
    # global c 
    c = Counter(words) 
    print("The word '{word:s}' appears {time:d} times.".format(word = w, time = c[w])) 


top_n_words(12) 
print("-" * 20) 
print("Total words: %d" % total_words) 
print("Total words: {t:d}".format(t=sum(c.values()))) 
word_appears("history") 
  1. В функции top_n_words, я заявляю, что c носит глобальный характер. Должен ли я объявить его глобальным в функции word_appears? Это не работает.
  2. Почему я не могу ссылаться на c в функции print? Оправдывает ли порядок top_n_words, word_appears на окончательную функцию печати?
  3. Что такое хорошая практика для решения такой ситуации?
+0

Я не вижу необходимости ссылаться на него. Это глобальная переменная, если ее можно использовать где угодно. Лучше всего это сделать, чтобы создать две отдельные локальные переменные и поиграть с ними в функции. –

+0

Какую версию вы используете? –

+0

@RickTeachey Я использую python 3.3.5. – Nick

ответ

1

Включите весь код в функции и используйте только аргументы, чтобы сделать счетчик доступным. Например:

from collections import Counter 


def read_words(file_name): 
    with open(file_name) as f: 
     words = f.read().lower().split() 
    return words 


def top_n_words(counter, n): 
    top_n = counter.most_common(n) 
    print("Top %d words are:" % n) 
    print("-" * 20) 
    for w, c in top_n: 
     # print("%10s: %-10s" % (w, c)) 
     print("{word:>10s}: {counts:<10d}".format(word=w, counts=c)) 


def word_appears(counter, w): 
    print("The word '{word:s}' appears {time:d} times.".format(word=w, 
     time=counter[w])) 


if __name__ == '__main__': 

    def main(file_name): 
     words = read_words(file_name) 
     counter = Counter(words) 
     top_n_words(counter, 12) 
     print("-" * 20) 
     print("Total words: %d" % len(words)) 
     word_appears(counter, "history") 

    main('words.txt') 
+0

'Положите весь код в функции и используйте только аргументы, чтобы сделать счетчик доступным. Это дает понять! Благодарим вас за доброту. – Nick

Смежные вопросы