Базовые знания Python

Приложение 1 к видеоурокам — синтаксис Python: https://singtown.com/learn/50061/

Преимущества использования Python

OpenMV поддерживает Python для дополнительной разработки. Это даёт несколько преимуществ:

  • Легко начать работу
  • Не нужно заботиться о выделении и освобождении памяти
  • Существует множество библиотек MicroPython, которые можно использовать напрямую (несовместимы с модулями Python для ПК)
  • Команда разработчиков написала различные алгоритмы и модули, которые можно вызывать в OpenMV

Python — очень распространённый язык, который широко применяется в обработке изображений, машинном обучении и сетевом программировании. При этом Python — очень простой в использовании язык. Если у вас есть опыт программирования на других языках (например, C, C++, Java), вам будет проще начать.

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 — это объект, и с этим объектом можно выполнять операции, такие как включение, выключение и проверка значения.

Модуль

Использование модулей

results matching ""

    No results matching ""