Conceputalize разбивая список понимания перечисления - PullRequest
1 голос
/ 20 мая 2019

Я начинаю здесь и понимаю список любви.Я нашел следующую строку кода для практической проблемы, состоящей в том, чтобы использовать каждую букву в строке с заглавной буквы, и это имеет смысл для меня.Проблема, с которой я надеюсь получить помощь, состоит в том, чтобы выяснить, как написать этот код нормально (для цикла, операторов if и т. Д.) Без понимания списка.

Вот код, который я начал с того, что яхочу сломать:

s = input('Please enter a string: ')
answer = ''.join(char.upper() if idx % 2 else char.lower() for idx, char in enumerate(s))
print(answer)

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

s = input('Please enter a string: ')
for idx, char in enumerate(s):
    if idx % 2:
        s = char.upper()
    else:
        s = char.lower()
    answer = ''.join(s)
print(answer)

Если бы я набрал HelloЯ должен получить hElLo, но вместо этого я получу o

Буду признателен за любые советы или советы о том, как действовать здесь.Спасибо!

1 Ответ

2 голосов
/ 20 мая 2019

Технически вы используете выражение генератора , а не список .Но результат в этом случае аналогичен.

Вы читаете ввод в 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.

...