Как получить один элемент и сделать что-то конкретно в цикле for в Python 3? - PullRequest
2 голосов
/ 03 ноября 2019

Это код:

ls = ['apple', 'banana', 'pear']


for z in ls:
    x = input("Do you like %s ?" %z)
    if x == 'yes':
        print('Cool, ' + z + ' is very good.')
        break
    elif x == 'no':   
        continue
    else:
        print('I am not sure what you want')

С этим кодом я хотел бы сделать две вещи:

1 - после повторения во второй раз (Выкак банан?) Я хотел бы напечатать сообщение. Но ТОЛЬКО после того, как «ты любишь банан», а не в другое время, он зацикливаетсяТак есть ли способ напечатать сообщение только для одного из циклов? Потому что, если я попробую вот так:

elif x == 'n':   
    print('are you sure you do not like it?')
    continue

, он напечатает сообщение для всех 3 пунктов в списке (яблоко, банан и груша).

2 - Другое дело, чтобыустановите, что при выполнении оператора else (пользователь вводит что-то отличное от 'yes' или 'no'), я бы хотел, чтобы он перезапустился в начале цикла (снова спросите пользователя: «Вам нравится яблоко?» вместопереходите ко второму пункту («Вам нравится банан?»). Есть ли способ настроить цикл, чтобы вернуться в начало?

Надеюсь, вопросы достаточно ясны.

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 ноября 2019

Если все в порядке, я сделал это с перечислением и флагом:

while True:
    successful_flag = True
    for i, z in enumerate(ls): 
        x = input("Do you like %s ?" %z) 
        if x == 'yes': 
            print('Cool, ' + z + ' is very good.') 
        elif x == 'no': 
            if i == 1: 
                print('Are you sure you do not like it?')    
        else: 
            print('I am not sure what you want') 
            successful_flag = False
            break 
    if successful_flag:
        break

Вывод: Do you like apple ?yes Cool, apple is very good. Do you like banana ?no Are you sure you do not like it? Do you like pear ?get out I am not sure what you want Do you like apple ?

0 голосов
/ 03 ноября 2019

То, что называется «конечным автоматом», достаточно хорошо описывает вашу проблему

placeholder text for image

Каждый круг / квадрат на диаграмме является состоянием. "Пользовательский ввод управляет переходами между состояниями

КОД:

class YesNoStateBase:
    pass

class ExitState(YesNoStateBase):
    def ask_for_instructions(self):
        return ""

    def ask_for_data(self):
        return str(self)

    def ask_for_geography(self, *args):
        return self
ExitState.ExitState = ExitState

class YesNoState:

    def __init__(self, prompt, *, yes=ExitState, no=ExitState):
        self._prompt = prompt + " "
        self._yes = yes
        self._no = no

    def set_yes(self, state):
        self._yes = state

    def ask_for_instructions(self):
        return self._prompt

    def ask_for_data(self):
        return self._data

    def ask_for_geography(self, x_stryng):
        i_stryng = str(x_stryng).strip().lower()
        nxt_state = type(self).ExitState
        if i_stryng == "y" or i_stryng == "yes":
            self._data = self._prompt + " yes"
            nxt_state = self._yes
        elif i_stryng == "n" or i_stryng == "no":
            self._data = self._prompt + " no"
            nxt_state = self._no
        else:
            nxt_state = YesNoState(
                "I don't understand. Please try again\n" + self._prompt,
                yes=self._yes,
                no=self._no
            )
        return nxt_state

YesNoState.YesNoState = YesNoState
YesNoState.ExitState = ExitState

class StateMiner:
    def __init__(self):
        self._data = list()
    def go_to_work(self, state):
        while True:
            # `msg`............`message`
            msg = state.ask_for_instructions()
            nxt_state = state.ask_for_geography(input(msg))
            datum = state.ask_for_data()
            self._data.append(datum)
            if nxt_state== state.ExitState:
                return
            state = nxt_state



GoAgainQ    = YesNoState("Do you want to play again? ")
PearQ       = YesNoState("Do you like pears? ", yes=GoAgainQ, no=GoAgainQ)
SureBananaQ = YesNoState("Are you certain that you do not like bananas (yes = hate bananas)?", yes=PearQ, no=PearQ)
BananaQ     = YesNoState("Do you like bananas? ", yes=PearQ, no=SureBananaQ)
AppleQ      = YesNoState("Do you like apples? ", yes=BananaQ, no=BananaQ)
GoAgainQ.set_yes(AppleQ )

bob = StateMiner()
bob.go_to_work(AppleQ)
print(40*"#", "RESULTS:", 40*"-", sep="\n")
print("\n".join(bob._data))
print(40*"-", sep="\n")

Пример вывода:

########################################
RESULTS:
----------------------------------------
Do you like apples?   yes
Do you like bananas?   yes
Do you like pears?   yes
Do you want to play again?   yes
Do you like apples?   yes
Do you like bananas?   yes
Do you like pears?   yes
Do you want to play again?   no
----------------------------------------

Process finished with exit code 0
0 голосов
/ 03 ноября 2019

Я думаю, это то, что вам нужно:

ls = ['apple', 'banana', 'pear']
i = 0
flag = True
while i<len(ls) :

    x = input("Do you like %s ?" %ls[i])
    if x == 'yes':
        print('Cool, ' + ls[i] + ' is very good.')
        flag = True
        break

    elif x == 'no':   
        if i >=1 and flag:
            print('are you sure you do not like it?')
            i = i -1
            flag = False
    else:
        i = -1
        flag = True
    i+=1

вывод:

1.

Do you like apple ?no
Do you like banana ?no
are you sure you do not like it?
Do you like banana ?no
Do you like pear ?no

2.

Do you like apple ?yes
Cool, apple is very good.

3.

Do you like apple ?no
Do you like banana ?yes
Cool, banana is very good.
...