Базовые знания Python
Приложение 1 к видеоурокам — синтаксис Python: https://singtown.com/learn/50061/
Преимущества использования Python
OpenMV поддерживает Python для дополнительной разработки. Это даёт несколько преимуществ:
- Легко начать работу
- Не нужно заботиться о выделении и освобождении памяти
- Существует множество библиотек MicroPython, которые можно использовать напрямую (несовместимы с модулями Python для ПК)
- Команда разработчиков написала различные алгоритмы и модули, которые можно вызывать в OpenMV
Python — очень распространённый язык, который широко применяется в обработке изображений, машинном обучении и сетевом программировании. При этом Python — очень простой в использовании язык. Если у вас есть опыт программирования на других языках (например, C, C++, Java), вам будет проще начать.
Если у вас уже есть опыт программирования на C/C++/Java (или любом другом языке), рекомендуем\ учебник по Python Ляо Сюэфэна
Если у вас ещё нет опыта программирования, рекомендуем\ Learn Python the hard way
REPL и последовательный порт
В IDE OpenMV встроен помощник по работе с последовательным портом для подключения к OpenMV, а также к другим устройствам с последовательным портом, таким как Arduino, pyboard, esp8266.
Сначала отключите OpenMV от IDE, иначе последовательный порт будет конфликтовать!
В OpenMV откройте Tools → Open Terminal → New Terminal




Введите в терминале
print("hello OpenMV!")
Появится
hello OpenMV!
Синтаксис Python
Вывод
Используйте print(), заключив строку в скобки, чтобы вывести указанный текст на экран. Например, чтобы вывести 'hello, world', код будет таким:
print('hello, world')
hello, world
Функция print() также может принимать несколько строк, разделённых запятыми ",", которые затем будут соединены в одну строку для вывода:
print('The quick brown fox', 'jumps over', 'the lazy dog')
The quick brown fox jumps over the lazy dog
print() выводит каждую строку по очереди, и при встрече запятой "," будет выведен пробел, поэтому итоговая строка склеивается так:
The quick brown fox jumps over the lazy dog
print() также может выводить целые числа или результаты вычислений:
print(300)
300
print(100 + 200)
300
Поэтому мы можем красивее вывести результат вычисления 100 + 200:
print('100 + 200 =', 100 + 200)
100 + 200 = 300
Обратите внимание, что для 100 + 200 интерпретатор Python автоматически вычисляет результат 300, но '100 + 200 =' — это строка, а не математическая формула, и Python обрабатывает её как строку.
Переменные
В Python знак равенства = — это оператор присваивания, который позволяет присвоить переменной данные любого типа. Одной и той же переменной можно присваивать значения повторно, и они могут быть разных типов, например:
a = 123 # a — целое число
print(a)
a = 'ABC' # a становится строкой
print(a)
Язык, в котором тип переменной сам по себе не фиксирован, называется динамическим языком, в противоположность ему — статический язык. В статических языках при определении переменной обязательно нужно указать её тип. Если при присваивании тип не совпадает, будет выдана ошибка. Например, Java — статический язык, и оператор присваивания выглядит так (// обозначает комментарий):
int a = 123; // a — переменная целочисленного типа
a = "ABC"; // ошибка: нельзя присвоить строку переменной целочисленного типа
По сравнению со статическими языками динамические языки более гибкие — именно поэтому.
Список
Один из встроенных типов данных Python — список (list). Список — это упорядоченная коллекция, в которую элементы можно добавлять и удалять в любой момент.\ Например, чтобы перечислить имена всех одноклассников в классе, можно представить их в виде списка:
classmates = ['Michael', 'Bob', 'Tracy']
classmates
['Michael', 'Bob', 'Tracy']
Переменная classmates — это список. Используйте функцию len(), чтобы получить количество элементов списка:
len(classmates)
3
Используйте индекс, чтобы обратиться к элементу в каждой позиции списка. Помните, что индексация начинается с 0:
classmates[0]
'Michael'
classmates[1]
'Bob'
classmates[2]
'Tracy'
classmates[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Когда индекс выходит за пределы диапазона, Python выдаёт ошибку IndexError, поэтому убедитесь, что индекс не выходит за границы. Помните, что индекс последнего элемента равен len(classmates) - 1.
Если вы хотите получить последний элемент, вместо вычисления индекса можно использовать -1 в качестве индекса, чтобы получить последний элемент напрямую:
classmates[-1]
'Tracy'
По аналогии можно получить предпоследний и третий с конца элементы:
classmates[-2]
'Bob'
classmates[-3]
'Michael'
classmates[-4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Разумеется, четвёртый с конца элемент выходит за границы списка.
Список — это изменяемый упорядоченный список, поэтому вы можете добавлять элементы в его конец:
classmates.append('Adam')
classmates
['Michael', 'Bob', 'Tracy', 'Adam']
Также можно вставить элемент в указанную позицию, например, по индексу 1:
classmates.insert(1, 'Jack')
classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
Чтобы удалить элемент в конце списка, используйте метод pop():
classmates.pop()
'Adam'
classmates
['Michael', 'Jack', 'Bob', 'Tracy']
Чтобы заменить один элемент другим, можно напрямую присвоить значение соответствующему индексу:
classmates[1] = 'Sarah'
classmates
['Michael', 'Sarah', 'Tracy']
Элементы списка также могут иметь разные типы данных, например:
L = ['Apple', 123, True]
Если у списка нет элементов, это пустой список нулевой длины:
L = []
len(L)
0
Кортеж
Ещё один упорядоченный список называется кортежем (tuple). Кортежи очень похожи на списки, но после инициализации кортеж нельзя изменить. Например, тоже перечислим имена одноклассников:
classmates = ('Michael', 'Bob', 'Tracy')
Теперь кортеж classmates нельзя изменить, у него нет таких методов, как append() и insert(). Остальные способы получения элементов такие же, как у списков. Вы можете обычным образом использовать classmates[0] и classmates[-1], но не можете присвоить значение другому элементу.
В чём смысл неизменяемых кортежей? Поскольку кортежи неизменяемы, код с ними безопаснее. По возможности используйте кортежи вместо списков.
Ловушка кортежей: при определении кортежа его элементы должны быть определены сразу, например:
t = (1, 2)
t
(1, 2)
Однако если определить кортеж только с одним элементом вот так:
t = (1)
t
1
то это не кортеж — t является переменной целого типа со значением 1! Это происходит потому, что круглые скобки () могут обозначать как кортеж, так и обычные скобки в математическом выражении, что создаёт неоднозначность. Поэтому Python в этом случае трактует их как обычные скобки, и результатом закономерно становится 1.
Поэтому при определении кортежа с одним элементом обязательно нужно добавить запятую, чтобы устранить неоднозначность:
t = (1,)
t
(1,)
Python также добавляет запятую при отображении кортежа с одним элементом, чтобы вы не приняли его за скобки в математическом смысле.
Условные выражения
Полная форма оператора if:
if <условие1>:
<действие1>
elif <условие2>:
<действие2>
elif <условие3>:
<действие3>
else:
<действие4>
Например:
age = 20
if age >= 6:
print('teenager')
elif age >= 18:
print('adult')
else:
print('kid')
Циклы
В Python есть два вида циклов. Первый — цикл for...in, который поочерёдно перебирает каждый элемент списка или кортежа. Смотрите пример:
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
Выполнение этого кода поочерёдно выведет каждый элемент names:
Michael
Bob
Tracy
Таким образом, цикл for x in ... подставляет каждый элемент в переменную x, а затем выполняет операторы во вложенном блоке.
Если вы хотите вычислить сумму целых чисел от 1 до 100, писать их все от 1 до 100 довольно неудобно. К счастью, Python предоставляет функцию range(), которая генерирует последовательность целых чисел, которую можно преобразовать в список с помощью функции list(). Например, range(5) генерирует последовательность целых чисел меньше 5, начиная с 0:
list(range(5))
[0, 1, 2, 3, 4]
range(101) может сгенерировать последовательность целых чисел от 0 до 100, и вычисление выглядит так:
sum = 0
for x in range(101):
sum = sum + x
print(sum)
Второй вид цикла — цикл while. Например, если мы хотим вычислить сумму всех нечётных чисел в пределах 100, можно использовать цикл while:
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
===== Преобразование типов данных =====
Среди встроенных функций Python также есть функции преобразования типов данных, например функция int(), которая преобразует другие типы данных в целые числа:
>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False
===== Функции =====
В Python для определения функции нужно последовательно использовать оператор def, имя функции, круглые скобки, параметры в скобках и двоеточие, затем написать тело функции во вложенном блоке и вернуть значение с помощью оператора return.
Сначала напишем функцию для вычисления x2:
def power(x):
return x * x
В функции power(x) параметр x — это позиционный параметр.
При вызове функции power мы обязаны передать один и только один параметр x:
power(5)\ 25\ power(15)\ 225
А что, если мы хотим вычислить x3? Можно определить ещё одну функцию — power3, но что если нужно вычислить x4, x5 и так далее? Нельзя же определить бесконечное количество функций.
Возможно, вы уже подумали, что можно изменить power(x) на power(x, n) для вычисления xn, и сразу это сделаем:
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
С этой изменённой функцией power(x, n) можно вычислить любую степень n:
power(5, 2)\ 25\ power(5, 3)\ 125
Изменённая функция power(x, n) имеет два параметра: x и n. Оба параметра позиционные. При вызове функции два переданных значения присваиваются параметрам x и n в порядке их следования.
Срезы
Взятие части списка или кортежа — очень распространённая операция. Например, есть такой список:
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
Возьмём первые 3 элемента, используя срез в одну строку кода:
L[0:3]\ ['Michael', 'Sarah', 'Tracy']
L[0:3] означает начать с индекса 0 и закончить на индексе 3, не включая сам индекс 3. То есть индексы 0, 1 и 2 — это как раз 3 элемента.
Если первый индекс равен 0, его можно опустить:
L[:3]\ ['Michael', 'Sarah', 'Tracy']
Можно также начать с индекса 1 и взять 2 элемента:
L[1:3]\ ['Sarah', 'Tracy']
Кортеж — это тоже своего рода список, единственное отличие — кортеж неизменяем. Поэтому с кортежами тоже можно выполнять срезы, но результат операции по-прежнему будет кортежем:
(0, 1, 2, 3, 4, 5)[:3]\ (0, 1, 2)
Строку 'xxx' также можно рассматривать как список, каждый элемент которого — это символ. Поэтому со строками также можно выполнять срезы, но результат операции по-прежнему будет строкой:
'ABCDEFG'[:3]\ 'ABC'
Объект
Python — это язык объектно-ориентированного программирования, например, светодиод
from pyb import LED
red_led = LED(1)
red_led.on()
LED — это класс, red_led — это объект, и с этим объектом можно выполнять операции, такие как включение, выключение и проверка значения.