[Из песочницы] Аналоги в Python и JavaScript. Часть первая
Привет, Хабр! Представляю вашему вниманию перевод статьи «Equivalents in Python and JavaScript. Part 1».
Несмотря на то что Python и Javascript довольно сильно отличаются, существует много схожего, о чем должен знать любой фулстек разработчик. В этой серии из 4-х статей мы увидим что есть общего в обоих языках, и рассмотрим ряд известных проблем, а также способы их решения.
Это не справочник, здесь не будет базовой информация о типах переменных, if-ах и циклах.
Но мы рассмотрим более сложные структуры данных и операции с ними используя Python и Javascript.
Также я проиллюстрирую это примерами из практики.
Эта серия будет интересна бэкендерам, использующим Django, Flask или любой другой Python-фреймворк, которые хотят получше узнать о современном Javascript’е. С другой стороны, эти статьи будут полезны фронтендерам, которые желают лучше понять как работает бэкенд, или даже написать свой сайт на Django.
Приведение к типу
Начнем с приведения строки к целому. В Питоне все просто и прямолинейно:
number = int(text)
Но в JS вы должны объяснить к какой системе вы собираетесь приводить — к десятеричной, восьмеричной, шестнадцатеричной или двоичной:
number = parseInt(text, 10);
Для использования обычной десятеричной системы мы передаем 10 в виде второго аргумента функции parseInt (). 8 для восьмеричной, 16 для шестнадцатеричной или 2 — для двоичной. В случае если второй параметр опущен, число начинается с нуля и вы используете устаревший браузер, строка с текстом будет воспринята как восьмеричная система:
parseInt('012') == 10 // в некоторых старых браузерах
parseInt('012', 10) == 12
Условное присваивание
Хотя для этого Python и JS используют различный синтаксис, данная операция популярна в обоих языках. Популярна она потому, что в одном выражении можно присвоить различные значения как для True-, так и для False-случая.
Начиная с Python 2.7 условное присваивание выглядит так:
value = 'YES' if positive == True else 'NO'
В JavaScript условное присваивание производится с использованием тернарного оператора ?
, также как в C, C++, C#, Java, Ruby, PHP, Perl, Swift, and ActionScript:
value = positive === true? 'YES': 'NO';
Доступ к свойству объекта по имени свойства
Обычный способ доступа к свойству объекта и в Python и в JS одинаковый:
obj.color = 'YELLOW'
А как быть если название свойства заключено в строчную переменную? К примеру, название свойства может быть получено из списка свойств или название свойства составлено из двух строковых переменных: "title" + land_code
.
В Питоне для этого существуют функции getattr()
и setattr()
:
attribute = 'color'
value = getattr(obj, attribute, 'GREEN')
setattr(obj, attribute, value)
В JS вы можете обращаться с объектом как со словарем и передавать имя свойства в квадратных скобках:
attribute = 'color';
value = obj[attribute] || 'GREEN';
obj[attribute] = value;
Чтобы получить значение по умолчанию в случае если свойства с таким именем не существует, в Питоне у функции getattr()
есть для этого третий параметр. В JS, если запрашиваемое свойство отсутствует, функция вернет undefined
. Его можно сравнить оператором OR
со значением по дефолту — это стандартная практика в JS — такой способ можно встретить во многих фреймворках и библиотеках.
Доступ к словарю по ключу
Схоже с вышеизложенным. Ключ стандартно указывается в квадратных скобках в обоих языках:
dictionary = {}
dictionary['color'] = 'YELLOW'
Для доступа по ключу в Питоне используется стандартный синтаксис с квадратными скобками, однако в случае если такой ключ отсутствует это вызовет исключение с ошибкой KeyError
.
Более гибким является метод get()
который вернет None
в случае отсутствия ключа. Также можно передать значение которое будет возвращено в случае отсутствия ключа:
key = 'color'
value = dictionary.get(key, 'GREEN')
В JS вы можете проделать такой же трюк как со свойством объекта — OR
со значением по дефолту:
key = 'color';
value = dictionary[key] || 'GREEN';
Срезы: списки и строки
У Питона есть оператор [:]
получения части списка, кортежа или схожих структур. Пример с объектом типа Django QuerySets
:
items = [1, 2, 3, 4, 5]
first_two = items[:2] # [1, 2]
last_two = items[-2:] # [4, 5]
middle_three = items[1:4] # [2, 3, 4]
У JS есть метод slice()
с тем же эффектом:
items = [1, 2, 3, 4, 5];
first_two = items.slice(0, 2); // [1, 2]
last_two = items.slice(-2); // [4, 5]
middle_three = items.slice(1, 4); // [2, 3, 4]
Но не путайте с методом splice()
который изменяет исходный массив!
В Питоне оператор [:]
также применим и к строкам:
text = 'ABCDE'
first_two = text[:2] # 'AB'
last_two = text[-2:] # 'DE'
middle_three = text[1:4] # 'BCD'
В JS у строк также есть метод slice()
:
text = 'ABCDE';
first_two = text.slice(0, 2); // 'AB'
last_two = text.slice(-2); // 'DE'
middle_three = text.slice(1, 4); // 'BCD'
Операции со списками
В программировании часто приходится собирать и анализировать последовательность элементов. В Питоне для этого обычно используют списки, а в Javascript — массивы. У них схожий синтаксис и операции, но различаются методы добавления и удаления элементов.
Соединяем два списка, добавляем один элемент в конец, добавляем один элемент в начало, получаем и удаляем элемент в начале, получаем и удаляем элемент с конца и удаляем конкретный элемент по индексу.
Python:
items1 = ['A']
items2 = ['B']
items = items1 + items2 # items == ['A', 'B']
items.append('C') # ['A', 'B', 'C']
items.insert(0, 'D') # ['D', 'A', 'B', 'C']
first = items.pop(0) # ['A', 'B', 'C']
last = items.pop() # ['A', 'B']
items.delete(0) # ['B']
То же в Javascript:
items1 = ['A'];
items2 = ['B'];
items = items1.concat(items2); // items === ['A', 'B']
items.push('C'); // ['A', 'B', 'C']
items.unshift('D'); // ['D', 'A', 'B', 'C']
first = items.shift(); // ['A', 'B', 'C']
last = items.pop(); // ['A', 'B']
items.splice(0, 1); // ['B']
Соединяем наборы строк
Соединить набор строковых элементов в единую строку используя пробел, запятую или перевод строки в виде соединительного символа.
В Питоне для этого служит строковый метод join()
который принимает в виде аргумента список или кортеж. Для непосвященного (в синтаксис Питона) может показаться странным начинать выражение с разделителя, но, после регулярного применения вы привыкнете к такой форме записи:
items = ['A', 'B', 'C']
text = ', '.join(items) # 'A, B, C'
В JS у массивов есть метод join()
с разделителем в виде аргумента:
items = ['A', 'B', 'C'];
text = items.join(', '); // 'A, B, C'
Подытожим
- Списки (lists) и кортежи (tuples) в Python соответствуют массивам (arrays) в Javascript.
- Словари (dictionaries) в Python соответствуют объектам (objects) в Javascript.
- Строки в Питоне похожи на строки в Javascript.
- Приводить строку к числу в Javascript нужно с осторожностью, помня о системах счисления.
- Однострочные условные выражения существуют в ооих языках.
- Объединение последовательностей строк (
' '.join
) в Питоне обескураживает непосвященного в синтаксис, но к нему быстро привыкаешь.
В следующей серии мы посмотрим на создание и парсинг JSON, регулярные выражения и работу с ошибками и исключениями!