#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 disputandum3. Я буду изучать это подробнее, еще раз спасибо!