Технически вы используете выражение генератора , а не список .Но результат в этом случае аналогичен.
Вы читаете ввод в s
, но затем вы переназначаете s
в каждой итерации, а затем присоединяетесь к s
.
Вам нужна другая переменная.Для ввода и для заглавных букв.Выражение генератора выполняет возврат одного значения за раз вместо создания всего списка с заглавными буквами сразу.Но здесь вам нужно будет объявить это.
Кроме того, не имеет смысла присваивать ответ на каждой итерации, join
- это последнее, что вам нужно сделать после подготовки списка с заглавными буквами.
Это должно работать:
toCapitalize = input('Please enter a string: ')
capitalizedList = []
for idx, char in enumerate(toCapitalize):
if idx % 2:
capitalizedList.append(char.upper())
else:
capitalizedList.append(char.lower())
answer = ''.join(capitalizedList)
print(answer)
В случае, если это поможет, я попытался отразить, какая строка идет с какой частью выражения генератора ниже:
for idx, char in enumerate(toCapitalize): # for idx, char in enumerate(s)
if idx % 2: capitalizedList.append(char.upper()) # char.upper() if idx % 2
else: capitalizedList.append(char.lower()) # else char.lower()
answer = ''.join(capitalizedList) # answer = ''.join()
Опять же, переменная capitalizedList
неявно присутствует в выражениях генератора или в списках.
Выражения генератора
Чтобы понять выражения генератора, взгляните на этот код:
capitalize = 'hello'
generator = (char.upper() if idx % 2 else char.lower() for idx, char in enumerate(capitalize))
print(next(generator)) # h
print(next(generator)) # E
print(next(generator)) # l
print(next(generator)) # L
print(next(generator)) # o
print(next(generator)) # raises a StopIteration exception, we've reached the end.
Каждый вызов next()
вычисляет результат следующей итерации на лету.Что более эффективно по памяти, чем создание целого списка за один раз, когда у вас большие списки.В вашем случае вызов join()
использует весь генератор и объединяет возвращаемые значения.
В качестве понимания списка
Ваш код в качестве понимания списка будет:
s = input('Please enter a string: ')
answer = ''.join([ char.upper() if idx % 2 else char.lower() for idx, char in enumerate(s) ])
print(answer)
Как я объяснил выше, разница в том, что здесь мы строим целый список сразу, генератор возвращает только одно значение за раз.
Ваш код как генератор
И, наконец, если быть технически правильным, ваш код будет эквивалентен следующему:
def generator(s):
for idx, char in enumerate(s):
if idx % 2:
yield char.upper()
else:
yield char.lower()
answer = ''.join(generator(s))
print(answer)
Вот как вы строите генератор в Python.