официальный FAQ охватывает три варианта для этого, хотя вы, вероятно, никогда его найти, потому что это под вопросом Why can't I use an assignment in an expression:
Во-первых, есть while True:
print('Welcome to your currency converter\n Please choose your starting currency from the four options:')
while True:
currency1=input('(GDP) = Pound Sterling £ \n(EUR) = Euro € \n(USD) = US Dollar ($) \n(JPY)= Japanese Yen ¥\n').lower()
if currency1 not in ['gdp','eur','usd','jpy']:
print('Sorry not accepted try again')
else:
break
Это может показаться странным DIEHARD C программистов, которые были научены, что break
(как в начале return
и аналогичные функции) плохо. Но Python не C. (Не говоря уже о том, что в настоящее время даже MISRA рекомендует использовать break
в новом коде C99 ...). Вы можете избежать break
с помощью while not done:
и установить done = True
вместо break
, но нет никакого преимущества для этого, и это просто делает ваш код длиннее и сложнее.
Далее, есть while <condition>:
print('Welcome to your currency converter\n Please choose your starting currency from the four options:')
currency1 = input('(GDP) = Pound Sterling £ \n(EUR) = Euro € \n(USD) = US Dollar ($) \n(JPY)= Japanese Yen ¥\n').lower()
while currency1 not in ['gdp', 'eur', 'usd', 'jpy']:
print('Sorry not accepted try again')
currency1 = input('(GDP) = Pound Sterling £ \n(EUR) = Euro € \n(USD) = US Dollar ($) \n(JPY)= Japanese Yen ¥\n').lower()
Как говорит FAQ, это "кажется привлекательным, но, как правило, менее надежными":
Проблема в том, что если вы измените ваш подумайте о том, как вы получите следующую строку (например, вы хотите изменить ее в sys.stdin.readline()), вы должны помнить об изменении двух мест в вашей программе - второе вхождение скрыто в нижней части цикла.
Наконец, как FAQ говорит, «лучший подход заключается в использовании итераторов, что позволяет перебрать объекты, используя for
заявление».
Это здорово, когда у вас уже есть итератор или вы можете построить его тривиально. Но когда вы этого не сделаете, это может добавить больше сложностей, чем вы сохраняете. И я думаю, что это так. Например, вряд ли это проще, чем другие варианты:
def get_currency():
currency1=input('(GDP) = Pound Sterling £ \n(EUR) = Euro € \n(USD) = US Dollar ($) \n(JPY)= Japanese Yen ¥\n').lower()
if currency1 in ['gdp','eur','usd','jpy']:
return currency
else:
print('Sorry not accepted try again')
for currency1 in iter(get_currency, None):
do_stuff(currency1)
Вы можете проверить [этот учебник] (https://www.khanacademy.org/science/computer-science-subject/computer-science/V /, а-петля-в-питон) ...:) – summea
'' gdp'or'eur'or'usd'or'jpy'' оценивает '' gdp'' Вероятно, вы хотите, чтобы «валюта не была в ['gdp', 'eur', 'usd', ' ] ' –