Простой вопрос относительно циклов for на конкретном примере - PullRequest
0 голосов
/ 16 июня 2020

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

VOWELS = ('a', 'e', 'i', 'o', 'u', 'y')
pigLatin = [] # A list of the words in Pig Latin.
for word in message.split():
    # Separate the non-letters at the start of this word:
    prefixNonLetters = ''
    while len(word) > 0 and not word[0].isalpha():
        prefixNonLetters += word[0]
        word = word[1:]
    if len(word) == 0:
        pigLatin.append(prefixNonLetters)
        continue

    # Separate the non-letters at the end of this word:
    suffixNonLetters = ''
    while not word[-1].isalpha():
        suffixNonLetters += word[-1]
        word = word[:-1]

    # Remember if the word was in uppercase or title case.
    wasUpper = word.isupper()
    wasTitle = word.istitle()

    word = word.lower() # Make the word lowercase for translation.

    # Separate the consonants at the start of this word:
    prefixConsonants = ''
    while len(word) > 0 and not word[0] in VOWELS:
        prefixConsonants += word[0]
        word = word[1:]

    # Add the Pig Latin ending to the word:
    if prefixConsonants != '':
        word += prefixConsonants + 'ay'
    else:
        word += 'yay'

    # Set the word back to uppercase or title case:
    if wasUpper:
        word = word.upper()
    if wasTitle:
        word = word.title()

    # Add the non-letters back to the start or end of the word.
    pigLatin.append(prefixNonLetters + word + suffixNonLetters)

# Join all the words back together into a single string:
print(' '.join(pigLatin))

Итак, по сути, в конце каждой итерации я добавляю полное слово в список pigLatin. , включая само преобразованное слово, небуквенный суффикс и префикс (если они существуют).

Однако меня это немного сбивает с толку, потому что это бросает вызов тому, как я думал о циклах for до этого случая. Я думал, что содержимое таких переменных, как prefixNonLetters или prefixConsonants в этом случае, должно оставаться на каждой итерации. Но если это так, это испортит все слова, следующие за первым (они будут слишком длинными с частями предыдущих слов).

Итак, мой вопрос заключается в следующем: каждая итерация в for l oop очищает переменные внутри него? Мне это кажется довольно своеобразным и определенно не согласуется с тем, как я ранее рассматривал циклы for, но, похоже, это так, потому что программа, написанная таким образом, действительно работает правильно ...

Заранее спасибо и извините если вопрос, который я задаю, слишком прост c для некоторых из вас; В конце концов, я же просто новичок.

1 Ответ

0 голосов
/ 16 июня 2020

Нет. Переменные не «очищаются» на каждой итерации, если вы не измените их вручную, что вы делаете. Я попытаюсь объяснить на фрагменте вашего кода:

# Separate the consonants at the start of this word:
prefixConsonants = ''

Переменная prefixConsonants теперь содержит пустую строку. Если это была первая итерация, она просто создавалась в этой области. Если это была последующая итерация, она была «очищена», т.е. строка, которую она удерживала раньше, заменяется пустой строкой.

while len(word) > 0 and not word[0] in VOWELS:
    prefixConsonants += word[0]
    word = word[1:]

В конце этого l oop переменная prefixConsonants заполняется символов из word или пусто, если условие len(word) > 0 and not word[0] in VOWELS ложно с самого начала. Какая бы строка ни была prefixConsonants, она будет удерживаться до тех пор, пока интерпретатор снова не выполнит строку prefixConsonants = ''.

...