Освой Python играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Python: Общие сведения

Часть примеров применялась для устройства M5Stack Fire, поэтому в коде встречаются специфичные для этого устройства классы. Вам нужно самостоятельно адаптировать примеры под голую плату ESP32 или под другие устройства, которые поддерживают MicroPython или для примеров на чистом Python.

Булевы значения True и False пишутся с большой буквы. Комментарии помечаются символом # вместо привычных //. Точки с запятой не ставятся.

Можно объявить сразу несколько переменных необычным способом.


x, y, z = "Кот", "Кошка", "Котёнок"
print(x)
print(y)
print(z)

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

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


Основная инструкция:
    Вложенный блок инструкций
	
if(5 > 0):
    print("Пять больше нуля")

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


if(5 > 0):print("Пять больше нуля")

Иногда возможно записать несколько инструкций в одной строке, разделяя их точкой с запятой (не рекомендуется).


a = 1; b = 2; print(a, b)

Кроме умножения (*), есть оператор возведения в степень (**).


print(2 ** 3) # 8

Хотя есть и специальный класс math.


pow(2, 3)

// полный вариант
import math
math.pow(8, 2)

Также есть два вида деления. Обычное деление через / или целочисленное деление //. А ещё есть деление по модулю %.


print(5 / 3)  # 1.6666666666666667
print(5 // 3) # 1
print(5 % 3)  # 2

Ветвление if. Не забывайте про двоеточия и отступы. Части elif и else не являются обязательными.


x = 22
if(x > 30):
    print("x больше 0")
elif (x < 11):
    print("4 меньше 11")
else:
    print("Я кот!") 

Цикл for. Он немного отличается от стандартного синтаксиса в других языках (есть похожие аналоги в виде foreach или for (int i : IntArray)).


for i in range(5):
    lcd.print(i)
# 01234

Ещё пример.


for ch in 'hello kitty':
    print(ch * 2, sep='|', end = ' ') 
# hh ee ll ll oo    kk ii tt tt yy

Цикл while.


i = 5
while(i > 0):
  lcd.print(i)
  i -= 1
  
# 54321

Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или while).


for ch in 'hello kitty':
    if ch == 'o':
        continue
    print(ch * 2, end = ' ') 
# hh ee ll ll    kk ii tt tt yy

Оператор break досрочно прерывает цикл.


for ch in 'hello kitty':
    if ch == 'k':
        break
    print(ch + '3', end = ' ')
# h3 e3 l3 l3 o3  3

В Python есть эквивалент тернарного оператора ?:.


[on_true] if [expression] else [on_false]
x, y = 50, 25
small = x if x < y else y

Типы данных

Глядя на код из предыдущих примеров, может сложиться впечатление, что у Питона нет никаких типов, но это не так.

Встроенные типы: str, int, float, complex, list, tuple, range, dict, set, frozenset, bool, bytes, bytearray, memoryview.

Узнать тип данных можно через type().


x = 5
print(type(x))
cat = "Pussy"
print(type(cat))
isCat = True
print(type(isCat))

Тип bytearray - массив байт и в отличии от bytes является изменяемым.

Комплексные числа complex записываются с суффиксом j.


y = 5j

Конвертировать из одного типа в другой можно через соответствующие методы int(), float(), complex().


x = 1    # int
y = 2.8  # float
z = 1j   # complex

#convert from int to float:
a = float(x)

#convert from float to int:
b = int(y)

#convert from int to complex:
c = complex(x)

print(a)
print(b)
print(c)

print(type(a))
print(type(b))
print(type(c))

Тип complex нельзя конвертировать в другие числовые типы.

Случайное число (модуль random)

При помощи модуля randomвыводим на экран случайное число от 0 до 10, используя функцию random.randint() после нажатия кнопки B (для платы M5Stack).


# MicroPython
from m5stack import *
from m5ui import *
from uiflow import *
# import random  - на M5Stack работает без импорта

setScreenColor(0x222222)

label = M5TextBox(128, 95, "", lcd.FONT_DejaVu40,0xFFFFFF, rotate=0)

def buttonB_wasPressed():
  label.setText( str(random.randint(0, 10)))
  pass
btnB.wasPressed(buttonB_wasPressed)

# Python
import random

print(random.randint(0, 10))

Другой вариант.


import random

print(random.randrange(1, 10))

Модуль time

Модуль time содержит функцию sleep(), которая приостанавливает выполнение программы.


time.sleep(2) # пауза на две секунды

Исключения

Существуют готовые системные исключения, а также можно создавать свои собственные.


try:
    k = 1 / 0
except ZeroDivisionError:
    k = 0

print(k)
# 0

В блоке try мы выполняем инструкцию, которая может породить исключение, а в блоке except перехватываем их. При этом перехватываются как само исключение, так и его потомки. Например, перехватывая ArithmeticError, мы также перехватываем FloatingPointError, OverflowError и ZeroDivisionError.

Также есть варианты с несколькими исключениями через else и finally.

Строки документации (docstrings)

Python имеет интересную особенность, называемую строками документации (docstrings). Данный инструмент помогает лучше документировать программу и облегчает её понимание. Обратите внимание, что строку документации можно получить, например, из функции, даже во время выполнения программы.


def printMax(x, y):
  '''Выводит максимальное из двух чисел.
  
Оба значения должны быть целыми числами.'''

  x = int(x) # конвертируем в целые, если возможно
  y = int(y)

  if x > y:
    print(x, 'наибольшее число')
  else:
    print(y, 'наибольшее число')
    
printMax(3, 9)
print(printMax.__doc__)

9 наибольшее число Выводит максимальное из двух чисел. Оба значения должны быть целыми числами.

Строка в первой логической строке функции является строкой документации для этой функции. Строки документации принято записывать в форме многострочной строки, где первая строка начинается с заглавной буквы и заканчивается точкой. Вторая строка оставляется пустой, а подробное описание начинается с третьей. Доступ к строке документации функции можно получить с помощью имени этой функции и __doc__(обратите внимание на двойное подчёркивание с двух сторон).

Если вы пользовались функцией help() в Python, значит вы уже видели строки документации. Эта функция просто-напросто считывает __doc__ соответствующей функции и выводит его на экран. Вы можете проверить её на рассмотренной выше функции: просто включите help(printMax) в текст программы.


help(printMax)

Help on function printMax in module __main__: printMax(x, y) Выводит максимальное из двух чисел. Оба значения должны быть целыми числами.

Строки документации применимы также к модулям и классам.

Узнать версию Python можно через version_info. В обычном виде возвращает кортеж. Первый элемент кортежа содержит старшую версию системы.


import sys

print(sys.version_info)

# sys.version_info(major=3, minor=6, micro=3, releaselevel='final', serial=0)

Если нужно обработать ситуации с неподдерживаемой версией, то пишем условие.


import sys, warnings

if sys.version_info[0] < 3:
    warnings.warn("Требуется версия Python 3.0+", RuntimeWarning)
else:
    print("Можем работать с этой версией")

Как организовать совместный доступ к глобальным переменным для нескольких модулей?

Можно создать отдельный модуль (часто называемый config или cfg). Затем добавьте import config в каждый модуль приложения. При этом модуль становится доступен через глобальное имя. Поскольку существует только один экземпляр модуля, любые изменения, произведённые в модуле отражаются везде. Например:


# файл config.py:

x = 0

# файл mod.py:
import config

config.x = 1

# файл main.py:
import config
import mod

print(config.x)

По тем же соображениям, модули можно использовать как основу для имплементации синглтона.

Реклама