Программа на Python не закрывается; импортировать случайные ошибки
Простите, если это выходит из-под контроля, я не преувеличиваю, когда говорю, что работаю над этой программой уже более 13 часов, и я серьезно лишен сна. Это моя 4-я ревизия, и я, честно говоря, больше не знаю, что делать, поэтому, если кто-нибудь сможет мне помочь, это будет с благодарностью. Я познакомился с учителем по программированию и хотел, чтобы из его шаблона мы сделали учебную программу на "флэшке". Я использую Idle 3.3.3 на машине с Windows 7.
#Flash Cards
#Uses parallel arrays to store flash card data read from file
#Quizzes user by displaying fact and asking them to give answer
import random
def main():
answer = [] #array to store answer for each card
fact = [] #array to store fact/definition for each card
totalTried = 0 #stores number of cards attempted
totalRight = 0 #stores number of correct guesses
loadCards(answer, fact) #call loadcards() and pass it both arrays
numCards = len(answer) #find number of cards loaded
keepGoing = "y"
while keepGoing == "y" or keepGoing == "Y":
#Enter your code below this line
# 2a. Pick random integer between 0 and numCards and store the
# number in a variable named randomPick.
randomPick = random.randint (0, numCards)
# 2b. Add one to the totalTried accumulator variable.
totalTried = totalTried + 1
# 2c. Print element randomPick of the fact array. This shows the
# user the fact/definition for this flashcard.
print (fact [randomPick] )
# 2d. Prompt the user to input their guess and store the string they
# enter in a variable named "userAnswer"
userAnswer = input ('What is your answer?' )
# 2e. Compare the user's guess -userAnswer- to element
# -randomPick- of the answer array.
if userAnswer == (answer [randomPick]):
# 2e-1 If the two strings are equal, tell the user they
# guessed correctly and add 1 to the totalRight
# accumulator variable.
print ('That is correct.')
totalRight == totalRight + 1
# 2e2. If the two strings are not equal, tell the user they guessed
# wrong and display the correct answer from the answer array.
else:
print ('That is incorrect.')
print (answer [randomPick])
#2f. Prompt the user the user to see if they want to continue and
#store their response in the keepGoing variable.
keepGoing = input ('Would you like to continue?')
#Enter your code above this line
print("You got", totalRight, "right out of", totalTried, "attempted.")
def loadCards(answer, fact):
#Enter your code below this line
# 1a. Open flashcards.txt in read mode & assign it var name "infile"
infile = open('flashcards.txt', 'r')
# 1b. Read 1st line from file and store in var. name "line1"
line1 = infile.readline ()
# 1c. Use while loop to make sure EoF has not been reached.
while line1 != '':
# 1c1. Strip newline escape sequence (\n)from variable's value.
line1 = line1.rstrip ('\n')
# 1c2. Append string to answer array.
answer.append (line1)
# 1c3. Read next line from file and store in var. name "line2"
line2 = infile.readline ()
# 1c4. Strip newline escape sequence (\n) from variable's value.
line2 = line2.rstrip ('\n')
# 1c5. Append the string to the fact array.
fact.append (line2)
# 1c6. Read next line from file and store it in var. name "line3".
line3 = infile.readline ()
# 1d. Close file.
infile.close()
#Enter your code above this line
main()
Когда я запускаю программу, на самом деле ничего не происходит, но когда я пытаюсь потом закрыть окно оболочки, она говорит мне, что программа все еще работает, и спрашивает, хочу ли я ее убить.
Отладчик не показывает мне никакой информации, когда я пытаюсь это проверить.
Однако, если я копирую код в оболочку и запускаю его оттуда, я получаю "SyntaxError: найдено несколько операторов при компиляции одного оператора". Ни один файл не изменился, но ранее мне сообщалось, что возникла проблема с "случайным импортом".
Заранее благодарю за любую помощь.
2 ответа
Я бросил быстрый взгляд, и это в большинстве случаев кажется мне нормальным. Я изменил input() на raw_input() (два из них в вашем коде) и заметил, что у вас было двойное равенство, когда вы, вероятно, имели в виду одно
строка 36:
totalRight == totalRight + 1
изменился на
totalRight = totalRight + 1
который исправляет ваш счетчик правильных ответов и строку 68:
line3 = infile.readline ()
изменился на
line1 = infile.readline ()
иначе это навсегда останется в вашем цикле. И я просто скопировал строку 54:
line1 = infile.readline ()
и вставил его так, чтобы он дважды добавлял еще один вызов readline(), просто ленивый способ пропустить первую строку в вашем текстовом файле, так как он кажется комментарием, а не частью ответов и вопросов. Вы, вероятно, не хотите делать это и просто удалите комментарий из вашего текстового файла. = Ь
С этими изменениями, похоже, у меня все работает.
Так как это для класса (и я не могу только комментировать, я могу просто ответить), я хочу добавить, что на самом деле существует такая вещь, как слишком много комментариев
Эти комментарии (и, честно говоря, большинство ваших комментариев) являются отвлекающими и ненужными
answer = [] #array to store answer for each card
fact = [] #array to store fact/definition for each card
totalTried = 0 #stores number of cards attempted
totalRight = 0 #stores number of correct guesses
loadCards(answer, fact) #call loadcards() and pass it both arrays
numCards = len(answer) #find number of cards loaded
Кроме того, весь смысл помещения вашей программы в функцию под названием main
так что вы можете запустить эту функцию, только если вы вызываете этот файл напрямую, и вы, вероятно, должны поставить
if __name__ == '__main__':
main()
в нижней части вашего кода, а не просто
main()
Использование input()
обычно считается опасным (если только вы не используете Python3 или более позднюю версию, где он совпадает с raw_input()
) из-за того, что оценивает вход. Вы должны обрабатывать тип самостоятельно с чем-то вроде, если вы хотите целое число,
foo = int(raw_input('Input a number: '))
(Обратите внимание, что возвращение raw_input является строкой, поэтому, если вам нужна строка, вам не нужно ничего делать)