Может кто-нибудь, пожалуйста, разбить этот код и объяснить его?

#python #python-3.x

Вопрос:

Проблема в следующем: учитывая массив чисел, проверьте, являются ли какие-либо числа кодами символов для гласных в нижнем регистре (a, e, i, o, u).

Вот где мне любопытно…

Это:

 def is_vow(inp):
    for key, val in enumerate(inp):
        if chr(val) in 'aeiou':
            inp[key] = chr(val)
    return inp
 

Делает то же самое, что и это: (Это то, что я написал)

 def is_vow(inp):
    lst1 = []
    for vow in inp:
        if vow == 97:
            lst1.append('a')
        elif vow == 101:
            lst1.append('e')
        elif vow == 105:
            lst1.append('i')
        elif vow == 111:
            lst1.append('o')
        elif vow == 117:
            lst1.append('u')
        else:
            lst1.append(vow)
    return lst1
 

Я понимаю, что первое решение будет перечислять через параметр ‘inp’ и проверяет, есть ли символ в ‘aeiou’, я просто не понимаю, как он возвращает правильные значения…

Я просто хочу понять это, чтобы я мог научиться сокращать свой код и не повторяться.

PS — Я все еще новичок в языке Python.

Комментарии:

1. 97 это код ASCII для символа a (такой же, как 65 код ASCII для символа A ). См. Также Статью в Википедии о ASCII , которая для большинства целей заключается в том, как кодируются простые символы (те, которые вы найдете на своей клавиатуре). chr() Метод в python преобразует код ASCII в соответствующий символ, а ord() метод сделает обратное. Например, chr(97) -> 'a' и ord('a') -> 97 .

2. (обратите внимание, что python фактически использует Unicode для кодирования строк, но для всех символов, которые существуют в обеих кодировках, код ASCII совпадает с кодом Unicode)

3. Они не делают то же самое. Первая версия изменяет список ввода на месте, вторая версия создает новый список.

4. Аааа! Хорошо, теперь я это понимаю. Я не был уверен, потому что я получил тот же результат, но я делал дополнительные шаги, которые не были нужны. Спасибо! Также я не знал об этих 2 методах ‘chr ()’ и ‘ord ()’.

Ответ №1:

 inp = [97, 99, ...]
for i, val in enumerate(inp):
 

Пройдите по списку ввода, сохраняя индекс (я переименовал i ).

 if chr(val) in 'aeiou':
 

Проанализируйте число как ascii ( chr() ), а затем посмотрите, является ли оно одним из aeiou . Помните, что строки в python можно повторять. ( chr() здесь есть магия, которую вы, вероятно, не ожидали; попробуйте это в repl).

 inp[i] = chr(val)
 

Замените текущий элемент в исходном списке его эквивалентом ascii. Обратите внимание, что мы вызываем chr дважды! Это было бы более эффективно:

 c = chr(val)
if c in "aeiou":
    inp[i] = c
 

Вы также можете написать это с помощью страшного оператора walrus, но я оставляю это как упражнение для читателя 😉

Комментарии:

1. Спасибо! Это очень помогло! Мне нужно будет изучить оператор ‘walrus’.

2. @michaelcronk посмотрите на PEP . Это позволило бы вам сохранить одну строку здесь (the c=chr(val) ) за счет синтаксиса, который… well, de gustibus non est disputandum

3. Я буду изучать это подробнее, еще раз спасибо!