Инструменты пользователя


Основы синтаксиса

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

  • Типы
    • Базовые неизменяемые
      • Числовые
        • Целые (int)
        • Действительные (float)
        • Комплексные (complex)
        • Логический тип (bool)
      • Перечислимые
        • Строки (str)
        • Байтовые строки (bytes)
      • NoneType
    • Базовые изменяемые
      • Перечислимые
        • Списки (list)
        • Cловари (dict)
        • Наборы (set)

Некоторые базовые типы данных

Тип Описание Примечание Пример
int Целое число Длина не ограничена (при выходе за пределы машинного long int включается «длинная» арифметика) 42
float Число с плавающей запятой Машинный double точнее в sys.float_info 3.14159
str Строка Типа «символ» нет, символ — это строка из одного символа
"привет"
bytes Байтовая строка Типа «байт» нет, байт — это байтовая строка из одного символа
b"hell\x00"
bool Логический тип Значения True и False True
NoneType Пустой объект Единственное значение None None

Все эти типы являются неизменяемыми (immutable). С точки зрения памяти новая переменная создается при каждом присваивании.

Присвоение значений и динамическая типизация

Python — язык со строгой динамической типизацией.

Переменные объявляются в момент присвоения значения, а тип переменной определяется по правой части выражения.

# Комментарий: 
a = 5
b = 5.5
c = "привет"
d = b"\x00\x7f\x2e"
e = True
f = None

При повторном присваивании типы не проверяются, а создается новая переменная с тем-же именем.

d = 42 # Успешно: d теперь имеет тип int и значение 42

При выполнении прочих операций типы проверяются

d = a + c # Ошибка: нельзя выполнить + для типов int и str

Строки

s = "привет '!' "
s = 'привет "!" '
s = '''привет
я длинная строка'''
s = 'Строка \nс экранированием\n'
s = r'Строка без \n экранирования'
s = b'Byte String - Only Ascii and \x24'

Распространенные непечатные символы

Символ Значение
\n Новая строка
\t Табуляция
\r Возврат каретки
\u???? Символ Unicode: ???? — код символа (для строк)
\x?? Байт ?? — код байта (для байтовых строк)
\\ Символ \

Проблемы с экранированием возникают при работе с регулярными выражениями и именами папок в Windows:

pth = 'C:\new_files\ret_id' # Ошибка \n и \r недопустимы в имени папки
pth = 'C:\\new_files\\ret_id' # Все хорошо
pth = r'C:\new_files\ret_id' # Все хорошо

Функций, операторы, модули

Функции

Функции вызываются стандартно:

print("Привет!")

Могут принимать:

# Аргументы по порядку
foo(1, 2, "test")

# Аргументы по имени
bar(arg = 2, namedarg = "hello")

Способы передачи аргументов можно смешивать, но аргументы по порядку должны идти в начале

bar(1, 2, arg = 2, namedarg = "hello") # Правильно
bar(arg = 2, namedarg = "hello", 1, 2) # Ошибка

Функция может возвращать одно или несколько значений. Если функция не вернула ни одного значения, то считается, что она вернула None. Если возвращаемое значение не было присвоено переменной, то оно теряется.

loo(24)

x = foo(24)

x,y,t = bar(42)

Функция в Python — переменная специального типа function. Объявление функции можно рассматривать как объявление одноименной переменной:

def foo(x, y):
    return x + y

bar = foo

bar(2, 3) # 5

def comcall(x, y, fun):
    return fun(x, y)

comcall(2, 3, foo) # 5

Некоторые важные встроенные функции

Функция Назначение
len(x) Длина x, например строки, возвращает int
abs(x) Абсолютное значение x
type(x) Тип данных x, возвращает тип
print(x) Печать на экран x, возвращает None
input(x) Ввод пользователя в командной строке, x - строка приглашения, возвращает str

Операторы

Об операторах надо думать, как об упрощенной форме записи вызовов функций:

y = 1+2*3 # тоже, что и y = __add__(1,__mult__(2,3))

Операторы и вызовы функций можно свободно смешивать:

y = 2*len(x)+1

Многие операторы имеют сокращенную форму записи:

y = y + 1
y += 1

Арифметические операторы

Оператор Действие Пример
+
Сложение для числовых типов
2+5
+
Конкатенация для перечислимых типов
"a"+"b"
-
Вычитание
2-5
*
Умножение для числовых типов
2*5
*
Повторение если переменная перечислимого типа умножается на int
"a"*2
**
Возведение в степень
2**5
/
Действительное деление тип результата всегда float
2/5
//
Целочисленное деление
2//5
%
Остаток от деления
2%5
%
Операция подстановки для str
"hello %s" % "world"

Python позволяет смешивать переменные разных числовых типов в одном выражении, при этом тип результата определяется наиболее содержательным типом.

Некоторые логические операторы

Логические операторы возвращают значения типа bool и используются в основном в качестве различных условий.

Оператор Действие Пример
not
Логическое НЕ для bool
not x
and
Логическое И для bool
x and y
or
Логическое ИЛИ для bool
x or y
>, <, >=, <=
Неравенство, возвращает bool
x >= y
==
Равенство, возвращает bool
x == y
is
Тождество, возвращает bool
x is y
in, not in
Содержание, возвращает bool
x in data

Операторы над составными типами

Оператор Действие Пример
[x]
Индексирование переменных перечислимых типов
data[x]
.
Обращение к полю или методу объекта или модуля
data.x, data.foo(2)

Подробнее: https://docs.python.org/3/reference/expressions.html

Модули

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

import math
math.cos(3) # Успешно: вызван метод ''cos'' модуля ''math''
cos(3) # Ошибка: метода ''cos'' неизвестен

from math import cos
cos(3) # Успешно: вызван метод ''cos'' модуля ''math''

import math as m
m.cos(3) # Успешно: вызван метод ''cos'' модуля ''math''

Собственные модули

Аналогично происходит импорт из одного файла в другой: если я хочу вызвать метод foo из файла myfuncs.py, то мне следует воспользоваться одним из следующих вариантов:

import myfuncs
myfuncs.foo()

from myfuncs import foo
foo()

Специальной командой from myfuncs import * можно импортировать все доступные методы из модуля, но это считается плохим стилем.

Приведение типов

Типы автоматически не приводятся. Но типы int, float и bool можно смешивать в арифметических выражениях. Результат будет определяться наиболее ёмким типом (float > int > bool).

Исходный тип — переменная x
Целевой тип int float str bytes bool
int = round(x), math.ceil(x), math.trunc(x) int(x) struct.unpack(fmt,x) int(x)
float float(x) = float(x) struct.unpack(fmt,x) float(x)
str str(x) str(x) = x.decode(encoding) str(x)
bytes struct.pack(fmt,x) struct.pack(fmt,x) x.encode(encoding) = struct.pack(fmt, x)
bool bool(x) bool(x) bool(x) bool(x) =

Используются модули math и struct.

Функции print, input

Важные глобальные функции для работы в консоли:

print() — печатает текст в консоли. Принимает произвольное число аргументов, производного типа, если аргумент не строка, то у него вызывается метод __str__(), а при отсутствии потом __repr__() (есть у всех переменных всех типов). Таким образом print так или иначе выведет на печать переменную любого типа.

a = 25
print("тест:", a , "-", 3.158)

#тест: 25 - 3.158
#

Дополнительные аргументы: sep — разделитель, по умолчанию пробел, end — конец строки, по умолчанию \n.

a = 25
print("тест:", a , "-", 3.158, sep=";", end="\nконец.\n")

#тест:;25;-;3.158
#конец.
#

input — запрашивает ввод пользователя, до нажатия Enter.

x = input('Введите x:')

Эта функция всегда возвращает str, если нужно значение другого типа, нужно выполнить явное приведение:

x = float(input('Введите x:'))