2014-01-14 3 views
1

я не знаю, как повторно запустить определенную часть моего кода:Повторно запустить код из определенной точки

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() 
if currency1!='gdp' or 'eur' or 'usd' or 'jpy': 
    print('Sorry not accepted try again') 

Когда код печатает Sorry not accepted try again Я хочу, чтобы запустить код. Как мне это сделать?

+2

Вы можете проверить [этот учебник] (https://www.khanacademy.org/science/computer-science-subject/computer-science/V /, а-петля-в-питон) ...:) – summea

+1

'' gdp'or'eur'or'usd'or'jpy'' оценивает '' gdp'' Вероятно, вы хотите, чтобы «валюта не была в ['gdp', 'eur', 'usd', ' ] ' –

ответ

0

А лучший способ сделать это, чем другие ответы рекомендую, это поставить условие в заявлении в то время как это:

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() 
+1

DRY нарушение - у вас есть валютный вопрос в двух местах. – DSM

+0

@DSM Ну, это проблема с тем, что у вас не было «do ... while». Я думаю, что это выглядит лучше, чем наличие выражения if if else внутри цикла while, но я думаю, что это субъективно. –

+1

Официальный [FAQ] (http://docs.python.org/2/faq/design.html#why-can-ti-use-an-assignment-in-an-expression) говорит, что эта опция «... кажется привлекательный, но, как правило, менее надежный », и далее объясняет, почему (но в принципе, DSM прекрасно его обобщил двумя словами). – abarnert

3

Вы хотите использовать while петлю, чтобы продолжать работать код «а» недействительно и

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 

Примечание:currency1!='gdp'or'eur'or'usd'or'jpy' не делать то, что вы думаете, что он делает. Используйте метод in, как описано выше

Отредактировано на комментарий abarnert в

+2

Было бы проще просто использовать' else: break' и избавиться от флага, как в удаленном ответе Markku K. – abarnert

+0

@abarnert, gawd, сколько раз я это делал, не думая об этом. Спасибо! – mhlester

3

официальный 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) 
+0

Хороший ответ, лучше, чем у меня. OP должен принять это. Я не думал, что вам нужно изменить код на два места, если вы решите изменить код. –

+0

Я не хватаю цикл 'do ... while' для этих ситуаций. Прокомментировал ли это руководство? –

+0

@SteinarLima: Насколько я знаю, не напрямую, но см. [PEP 315] (http://www.python.org/dev/peps/pep-0315/) и ссылки на темы обсуждения. Вкратце, он считает, что 'do ... while' 'не сделает язык более изящным или более легким для изучения. Они просто сэкономили бы несколько поспешных людей, которые печатали, делая других, которые должны читать/поддерживать свой код, интересно, что это значит «. В другом месте обсуждения другие основные разработчики говорили о своей полезности и нецелесообразности в C, и кто-то утверждал, что это полезно только для специального случая 'do {...} while (0)', используемого для принудительной области (что не было бы относящихся к Python). – abarnert

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