Python для начинающих любителей микроконтроллеров

Последнее время есть много вопросов по поводу популярности языков программирования, какой выбрать для начала, какой больше всего подойдет. Единственно верного ответа в данном вопросе не существует, но если вы остановились на том, что хотите освоить мир микроконтроллеров, то перед нами стоит выбор из трех языков - Javascript, C++ и Python. Язык Javascript подойдет для работы с Iskra JS, C++ для работы с Ардуино, а Python можно применять и для Ардуино и для Raspberry Pi.

Одним из первых уроков по Python у нас был урок Управления Arduino с помощью оболочки Python. Но, конечно, лучше было начать с основ изучения языка Python. Исправляем данную оплошность и сегодня остановимся на основах Питона, так называют этот язык в среде разработчиков. Мы изучим основные понятия языка программирования Python, отличного инструмента для программирования Raspberry Pi и многого другого. Познакомим вас с основами Питона, чтобы вы могли быстро начать писать код для своих проектов.

Переменные в Python

Python является свободно типизированным языком, и поэтому вам не нужно объявлять переменные с фиксированным типом, и они также могут изменить свой тип в любое время. Кроме того, python не поддерживает использование модификаторов доступа. Объявление переменной простое и выглядит так:

VariableName = value

Вот несколько примеров:

patientAge = 24
accepted = true
surname = "Lobowski"

Python не имеет традиционных статических переменных, как, например, Java. Вместо этого он создает копию этой переменной для самого класса и по одной для каждого созданного объекта.

Еще раз, Питон - это язык с динамической типизацией. Это означает, что вам не нужно определять тип переменной при компиляции вашей программы - фактически синтаксис даже не позволяет добавлять тип к определению переменной.

Тип определяется тем, что вы назначаете переменной. Поэтому переменная может начинаться как строка, а затем стать целым числом в любой момент времени:

Хотя это звучит хорошо, особенно для начинающих, желательно не смешивать типы данных. Это может привести к множеству ошибок во время выполнения и к нестабильной работе программы.

Тем не менее, вы всегда можете вызвать type(variableName), чтобы проверить тип переменной:

 

Методы и объявления функций

Объявления методов и функций тоже довольно просты. Вам не нужно указывать тип возврата или модификатор доступа для функции. Может быть предоставлен необязательный список параметров.

Каждая запись в этом списке состоит из имени параметра и необязательного значения по умолчанию, разделенных запятыми:

def functionName([param1[, param2[, (...)]]]):
    # Your code
    [return value]

Как видите, необязательный оператор return может быть добавлен, а тип возвращаемого значения определяется возвращаемым значением. Если вы хотите объявить статическую функцию, используйте аннотацию "@staticmethod". Вот некоторые примеры:

# If you don’t supply a default value for each variable
# write the variables with the default value at the end
# of the list
def add(one, two=10):
    return one + two

@staticmethod
def initialize():
    # Do something

Очевидно, что статические методы должны быть объявлены внутри класса (приведенный выше фрагмент кода является просто примером для объявления метода).

Коллекции в Python

Python не реализует массивы так, как это делают другие языки, такие как C и Java. Вместо этого используются списки с переменной длиной и смешанными типами данных. Тем не менее, вы можете определить массивоподобные структуры для числовых типов данных:

import array as python_array

a = python_array.array('d', [1, 24.0, 3.14])

К элементам можно получить доступ, используя их индекс:

print(a[0])
print(a[1])

a[0] = 2222

Просто помните, что индексы начинаются с нуля. Вы можете использовать len(), чтобы получить длину массива:

print(len(a)) # вывести длину массива

Как упоминалось выше, массивы в Python отличаются от других языков. Массивы Python не имеют фиксированной длины. Вы всегда можете динамически удалять и добавлять элементы:

# Add three elements to the end of the array
# Добавление элементов в конец массива
a.append(10)
a.append(20)
a.append(30)

# Remove the first three element
# Удаляем первые три элемента
a.pop(0)

Полный список функций смотрите в официальной документации Python.

Массив, упомянутый выше, представляет собой оптимизированную специальную форму списка, которая принимает только числовые значения того же типа. Поэтому список может использоваться точно так же, как массив, но вы не ограничены использованием одного типа данных:

li = ["Apple", 2.0, 3.14, "Banana", "Pear", [1, 2, 3, 4, 5]]

Как видите, "li" может содержать что угодно в любое время. Все остальные функции, упомянутые выше, работают точно так же, как и для массивов.

Другой тип коллекции - это кортеж. В отличие от элементов в списке, элементы в кортеже не могут быть изменены при инициализации:

# Note the round brackets instead of the square ones
# Обратите внимание на круглые скобки вместо квадратных
tu = (1, 2, 3, "cat", "dog", "parrot")

Операции вставки, обновления и удаления не будут работать, но элементы по-прежнему будут доступны с помощью их индекса.

Следующая важная структура данных - это множество. Элементы, содержащиеся в нем, не могут быть проиндексированы, как раньше, но вы всегда можете добавить новые элементы и удалить существующие из него. Вы также можете проверить, является ли значение элементом множества:

s = {"pie", "bread", "steak"}

print(s.pop())

s.add(30)

print(len(s))

s.pop()

print(len(s))

Функция pop() здесь не принимает никаких параметров и возвращает удаленный элемент. Вы можете вставить новые элементы с помощью метода add(). Опять же, полный список функций смотрите в официальной документации.

Последняя структура данных - это словарь. Эта коллекция связывает два значения вместе в отношении ключ-значение, где на каждое значение можно ссылаться, используя уникальный ключ:

telephone_book = {
	"Peter":9238172,
	"Laura":1119823,
	"Mark":9952174,
	"Liz":8009822
}

print("Laura\'s phone number is:")
print(telephone_book["Laura"])

Значения могут быть изменены таким же образом, и len() даст вам длину структуры. Вы можете добавлять элементы, используя новый ключ в качестве индекса и присваивая ему значение:

telephone_book["Ben"] = 5557281

print("Ben\'s phone number is:")
print(telephone_book["Ben"])

Вы можете использовать pop() вместе с ключом, чтобы удалить объект, как со списками.

Условие if (если) и циклы

Условие if довольно простое, прямолинейное и делает именно то, что вы ожидаете и скорее всего о чем подумали:

a = 20

if a > 100:
	print("a greater than 100") # здесь условие - a больше 100
elif a >= 50:
	print("a is between 50 and 100") # условие - a между 500 и 100
else:
	print("a is less than 50") # условие - a меньше 50

print(a)

Вы можете определить столько ветвей elif, сколько захотите, но они, как и все остальные в конце, совершенно необязательны.

Циклы for могут использоваться для быстрой итерации набора значений, которые могут быть сохранены в любой из структур, рассмотренных выше. Для этого вы можете использовать следующий синтаксис:

for x in any_collection:
    # Do something with x

Но они также могут быть использованы традиционным способом с начальным и конечным значениями и инкрементом (англ. - приращение):

for i in range(0, 100, 1)

Цикл выше начинается с нуля и считается до 99, увеличивая «i» на единицу с каждым шагом. Начальное значение и значение приращения являются необязательными. По умолчанию диапазон начинается с нуля и увеличивается на единицу. Python также позволяет использовать ключевое слово else в сочетании с циклом for:

for i in range(0,100,1):
	print(i)
else:
	print("Loop done!")

Код внутри блока else будет выполнен после завершения цикла.

Последней важной структурой является цикл while, который будет выполняться, пока выполняется определенное условие:

i = 0

while i < 100:
	print(i)
	i = i + 1
else:
	print("Loop done!")

Этот цикл while будет делать то же самое, что и цикл for выше. Два важных ключевых слова, которые можно использовать внутри циклов, это break и continue. Break выйдет из цикла, а continue пропустит код, следующий за ним, и начнет со следующей итерации цикла.

Python и парадигмы программирования

Другая особенность Python заключается в том, что язык не следует одной парадигме программирования, в отличие, например, от Java, которая строго объектно-ориентирована, или C, что является обязательным условием. Вам решать, будете ли вы придерживаться стиля функциональной, императивной, объектно-ориентированной или процедурной парадигмы программирования. У каждого стиля есть свои плюсы и минусы.

В то время как функциональное программирование является хорошей парадигмой для параллельной обработки и лямбда-исчисления, императивное программирование лучше для манипулирования структурами данных. Тем не менее, Python лучше всего использовать в качестве процедурного языка программирования, особенно потому, что скрытие данных не поддерживается Python, хотя это очень важная концепция объектно-ориентированного программирования.

Поэтому, если вы хотите написать объектно-ориентированное программное обеспечение, вы можете вместо этого взглянуть на Java или C++. Haskell - популярная альтернатива для функционального программирования.

Форматирование кода

В отличие от других языков, Python не использует скобки для структур и блоков. Вместо этого используются уровни отступов:

def add(one, two):
 res = one

 # The for-loop is only used as an example
 # Цикл for используется только в качестве примера
 # for another indentation level
 # для другого уровня отступа
 for x in range(two):
   res += 1

 return res

if __name__ == '__main__':
 result = add(12, 28)
 print(result)

Один важный совет: не смешивайте табуляции и пробелы в своем коде! Определитесь с одним из них. Многие IDE позволят вам сделать это (или они преобразуют ваш код в один стиль, обычно с табуляцией), но интерпретатор Python на Raspberry Pi или другой встроенной системе может не принять ваш код и выдавать зашифрованные сообщения об ошибках. Избавьте себя от неприятностей!

Магические методы

Python позволяет вам определять методы для основных операций для пользовательских типов данных. Следовательно, вы можете использовать стандартные операции (+, -, *, / и т.д.) для своих собственных классов.

Например, если вы напишете класс, который хранит длину вместе с единицей (см, м, дюйм и т.д.), вы можете определить метод __add(self, other)__ в своем коде и обработать нечисловую информацию вместе с номером и правильно добавить две разные длины (то есть дюймы и метры).

Вы также можете определить магические методы для сравнения, которые позволят вам напрямую сравнивать два объекта, используя операторы <,>, == и т.д. вместо необходимости вызывать метод.

Магические методы также используются для определения конструктора в классе, и они имеют много других применений. Полный список смотрите в официальной документации Python.

Ардуино+