2016-07-06 5 views
0

У меня есть следующая функция, вторая функция count_forbid(a) может работать только один раз. В этом примере он подсчитывает правильное значение слова, которое не содержит буквы 'c', но для y оно возвращает ноль. Таким образом, это означает, что код может сделать только правильный первый раз и для все другого времени возврата нуль:Функция работает правильно только в первый раз, когда она называется

import string 
fin = open('words.txt') 
def forbid_or_not(word,forb): 
    for letter in word: 
     if letter in forb: 
      return False 
    return True 

def count_forbid(a): 
    count = 0 
    for line in fin: 
     word1 = line.strip() 
     if forbid_or_not(word1,a): 
      count += 1 
    return count 

x = count_forbid('c') 
y = count_forbid('d') 

ответ

4

После перебирать файл с:

for line in fin: 

он собирается дойти до конца и попытка повторной итерации не будет иметь никакого эффекта.

Либо измените функцию, чтобы использовать context manager что повторно открывает файл, когда функция вызывается:

def count_forbid(a): 
    count = 0 
    with open('words.txt') as fin: # closes the file automatically 
     for line in fin: 
      word1 = line.strip() 
      if forbid_or_not(word1,a): 
       count += 1 
    return count 

, который является предпочтительным способом открытия файлов в Python.

Или добавьте fin.seek(0) в между звонками, чтобы получить файл, чтобы указать на начало:

x = count_forbid('c') 
fin.seek(0) 
y = count_forbid('d') 
+0

Вместо того, чтобы использовать менеджер контекста вы просто «вручную» открытые и можете закрыть файл. – syntonym

+1

Конечно, но это зависит от того, что вы бдительны и всегда забудьте закрыть его. Вот почему менеджеры контекста - такая хорошая конструкция, они делают это для вас и позволяют вам беспокоиться о более важных вещах :-). –

+0

WOW, супер эффективный, большое спасибо. –

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