При изучении нового языка программирования одним из основных моментов является его чувствительность к регистру. Python не является исключением: он регистрозависим, и это следует учитывать.
Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по Python.
Да, язык Python чувствителен к регистру
Прежде всего, давайте уточним, что такое чувствительность к регистру. Это различение строчных и прописных букв. Это может быть особенностью не только языка программирования, но и любой компьютерной программы.
Самый короткий ответ на вопрос о чувствительности к регистру в Python — да. Это язык, чувствительный к регистру, как и многие другие популярные языки программирования, такие как Java, C++ и JavaScript. Чувствительность к регистру в Python увеличивает количество идентификаторов или символов, которые можно использовать.
В этой статье мы рассмотрим различные аспекты использования Python в качестве языка, чувствительного к регистру.
Имена в Python с учетом регистра
Наиболее распространенным примером чувствительности к регистру в Python являются имена переменных. username
, UserName
и userName
являются тремя разными переменными, и использование одного варианта вместо другого приведет к ошибке. То же правило распространяется и на имена функций.
>>> user_name = 'User1' >>> print(User_name)
Приведенный выше код вызывает ошибку из-за несоответствия заглавных и строчных букв в именах переменных:
Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'User_name' is not defined
Правильное использование имен переменных с учетом регистра:
>>> user_name = 'User2' >>> print(user_name) User2
Чтобы избежать проблем с чувствительными к регистру именами функций и переменных, используйте имена в нижнем регистре с подчеркиванием между словами для удобочитаемости (например, user_name
), как указано в официальной документации Python.
Имена констант в Python являются исключением из этих соглашений об именовании. Они часто пишутся в верхнем регистре, чтобы можно было легко отличить константу от переменной.
С классами дело обстоит иначе — их имена обычно пишутся в регистре Pascal, то есть каждое слово начинается с заглавной буквы. В именах классов не должно быть подчеркиваний: например, AppFactory
.
Язык Python был разработан как хорошо читаемый, и важно поддерживать его в таком состоянии. Чтобы избежать путаницы в коде, последовательно придерживайтесь соглашения об именах и избегайте имен, которые трудно отличить друг от друга (например, заглавная буква ‘I
‘ и строчная ‘l
‘). Используйте описательные имена, но при этом делайте их как можно более короткими.
Регистр ключевых слов Python
Ключевые слова — это еще одна важная часть синтаксиса Python. Они тоже регистрозависимы. Напомним, что ключевые слова в Python — это специальные слова, которые имеют определенное значение для интерпретатора. Их использование ограничено; их нельзя использовать в качестве имен переменных или функций.
for i in range(1, 10): if i == 5: continue print(i)
Как видно из приведенного примера кода, большинство ключевых слов Python пишутся в нижнем (строчном) регистре. К распространенным ключевым словам относятся, среди прочих, def
, import
, is
, not
, return
, и with
.
Есть и исключения, но их всего три. Это True
, False
и None
.
Даже самые незначительные изменения регистра в ключевых словах Python приводят к ошибке:
>>> For i in range(1, 10): File "<stdin>", line 1 For i in range(1, 10): ^ SyntaxError: invalid syntax
Можно ли сделать Python нечувствительным к регистру?
Бывают случаи, когда проще было бы не учитывать регистр строк. Представьте себе ситуацию, когда покупатели ищут определенный товар в интернет-магазине. Допустим, они интересуются финским дизайном и ищут вазу Алвара Аалто. Что они набирают в строке поиска? Возможно: «ваза Алвара Аалто», но, скорее всего, «ваза алвара аалто». В любом случае они должны получить одни и те же результаты поиска.
В Python при сравнении строк нам необходимо учитывать чувствительность к регистру. Но не волнуйтесь! Python имеет полезные встроенные методы, облегчающие жизнь программиста. Есть они и для сравнений без учета регистра.
Подход № 1: строковый метод lower()
Это наиболее популярный подход к сравнению строк без учета регистра в Python. Метод lower()
преобразует все символы в строке в нижний регистр, что облегчает сравнение двух строк. В примере показано, как это работает:
english_eels = 'My Hovercraft Is Full of Eels' other_english_eels = 'My HoVeRcRaFt Is FuLl Of EeLs' if english_eels.lower() == other_english_eels.lower(): print('Identical strings:') print('1.', english_eels.lower()) print('2.', other_english_eels.lower()) else: print('Strings not identical')
Вывод:
Identical strings: 1. my hovercraft is full of eels 2. my hovercraft is full of eels
Подход № 2: строковый метод upper()
Этот метод используется так же, как и lower()
, но меняет все символы в строке на заглавные. Посмотрите на пример кода:
polish_eels = 'Mój poduszkowiec jest pełen węgorzy' other_polish_eels = 'MóJ pOdUsZkOwIeC jEsT pEłEn WęGoRzY' if polish_eels.upper() == other_polish_eels.upper(): print('Identical strings:') print('1.', polish_eels.upper()) print('2.', other_polish_eels.upper()) else: print('Strings not identical')
Вывод:
Identical strings: 1. MÓJ PODUSZKOWIEC JEST PEŁEN WĘGORZY 2. MÓJ PODUSZKOWIEC JEST PEŁEN WĘGORZY
Подход № 3: строковый метод casefold()
Использование метода casefold()
является самым сильным и агрессивным подходом к свертыванию регистров в Python. Он похож на lower()
, но в нем удаляются все различия регистра в строках. Это более эффективный способ сравнения без учета регистра в Python.
german_eels = 'Mein Luftkißenfahrzeug ist voller Aale' other_german_eels = 'MeIn LuFtKißEnFaHrZeUg IsT vOlLeR AaLe' if german_eels.casefold () == other_german_eels.casefold (): print('Identical strings:') print('1.', german_eels.casefold()) print('2.', other_german_eels.casefold()) else: print('Strings not identical')
Вывод:
Identical strings: 1. mein luftkissenfahrzeug ist voller aale 2. mein luftkissenfahrzeug ist voller aale
Как видно из кода примера, метод casefold()
не только изменил все символы на строчные, но и изменил строчную букву ‘ß
‘ на ‘ss
‘.
Итоги
Теперь вы знакомы с наиболее важными аспектами регистрочувствительности Python. Также вы познакомились с некоторыми хорошими практиками нейминга с учетом регистра и узнали, как игнорировать регистр при сравнении строк.
Перевод статьи «Is Python Case-Sensitive?».