Причина, по которой List
не является List
, заключается в том, что вы можете вставить Cat
в List
, но не в List
... вы можете использовать подстановочные знаки для по возможности расширять дженерики; например, чтение из List
похоже на чтение с List
- но не на запись.
Общие для Java-языка и Раздел «Общие» из учебников Java содержит очень хорошее, подробное объяснение того, почему некоторые вещи являются или не являются полиморфными или разрешены с помощью дженериков.
Вы можете работать с исключением:
class AdventureDone(Exception): pass
def yn(x, f, g):
if x == 'y':
print(f)
elif x == 'n':
print(g)
raise AdventureDone
name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'
try:
while True:
ready = raw_input('y/n ')
yn(ready, "Good, let's start our adventure!",
'That is a real shame.. Maybe next time')
except AdventureDone:
pass
# or print "Goodbye." if you want
Это цикл цикла while
снова и снова, но внутри функции yn()
возникает исключение, которое прерывает цикл. Чтобы не печатать трассировку, исключение должно быть уловлено и обработано.
Вам нужно вырваться из цикла while внутри самого цикла, а не из другой функции.
Что-то вроде следующего может быть ближе к тому, что вы хотите:
def yn(x, f, g):
if (x) == 'y':
print (f)
return False
elif (x) == 'n':
print (g)
return True
name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'
while True:
ready = raw_input('y/n: ')
if (yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time')):
break
Используя break, вы можете выйти из цикла, даже если условие окончания цикла не выполняется. Вы не можете перерыв, потому что «if / elif» не является циклом, а просто условным утверждением.
a = True
def b():
if input("") == "Quit":
global a
a == False
else:
pass
while a == True:
print('Solution')
Вам нужно будет изменить разрыв внутри вашей функции на возврат, и вам нужно иметь оператор else
в случае, если пользователь не предоставил вам правильный ввод. Наконец, вам нужно включить вызов в while loop
в оператор if.
Это позволит вам разорвать оператор while, если игрок войдет в нужную команду, если он не попросит снова. Я также обновил вашу функцию yn
, чтобы позволить пользователю использовать символы нижнего и верхнего регистра, а также да и нет.
def yn(input, yes, no):
input = input.lower()
if input == 'y' or input == 'yes':
print (yes)
return 1
elif input == 'n' or input == 'no':
print (no)
return 2
else:
return 0
name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, %s. Are you ready for your adventure?' % name
while True:
ready = raw_input('y/n ')
if yn(ready, 'Good, let\'s start our adventure!',
'That is a real shame.. Maybe next time') > 0:
break
Идея этого довольно проста. Функция yn
имеет три состояния. Любой пользователь ответил да, нет или недействителен. Если ответ пользователя есть либо «да», либо «нет», функция вернет 1 для «да», а «2 - нет». И если пользователь не предоставляет действительный ввод, например. пустое пространство, оно вернет 0.
Внутри цикла while True:
мы завершаем функцию yn ('....', '....') с if statement
, которая проверяет если функция yn
возвращает число, большее 0. Поскольку yn
вернет 0, если пользователь предоставит нам действительный ввод и 1 или 2 для допустимого ввода.
Как только мы получим действительный ответ от yn
мы называем break, который останавливает while loop
, и мы закончили.
Один из подходов заключался бы в том, чтобы yn
возвращал логическое значение, которое затем использовалось бы для выхода из цикла. В противном случае функция break
внутри функции не может выйти из цикла в вызывающей функции.
def yn(x, f, g):
if (x) == 'y':
print (f)
return True
elif (x) == 'n'
print (g)
return False
name = raw_input('What is your name, adventurer? ')
print 'Nice to meet you, '+name+'. Are you ready for your adventure?'
done = False
while not done:
ready = raw_input('y/n ')
done = yn(ready, 'Good, let\'s start our adventure!', 'That is a real shame.. Maybe next time')