Перейти к основному содержимому

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

Концепции - переменные, условия, циклы, функции - вы уже знаете
Здесь только то, как это выглядит именно в Python, и что в нём непривычно по сравнению с языками, на которых писали раньше

Теория​

Переменные и типы​

Тип не объявляется - определяется значением, и может смениться при переприсваивании:

name = 'Аня' # str
age = 20 # int
height = 172.5 # float
is_student = True # bool
nothing = None # аналог null

x = 5
x = 'пять' # валидно - тип переменной не зафиксирован

Приведение типов - явное преобразование через int(), str(), float(), bool():

int('42') # 42
str(5) # '5'
float('3.14') # 3.14

Truthiness
0, '', None и пустые коллекции ([], {}) считаются ложными в условиях, всё остальное - истинным:

bool(0), bool(''), bool(None), bool([])
# (False, False, False, False)

Операторы​

+ - * / // % ** - обычная арифметика плюс // (целочисленное деление) и % (остаток):

7 / 2 # 3.5 - / всегда float
7 // 2 # 3
7 % 2 # 1
2 ** 10 # 1024

Сравнение - как обычно (== != < > <= >=)
Логика - словами, не символами: and, or, not (вместо && || !)

Вывод, ввод​

print() - вывод текста в консоль
Строки шаблонизируются через - f-строки

print(f'Привет, {name}! Тебе {age} лет.')

input() - ввод текста от юзера
Можно передать текст-приглашение
Всегда возвращает str

age = int(input('Введи возраст: '))

Условия и циклы​

elif, не else if
Границы блока - отступ (4 пробела или табуляция), не скобки

if score >= 90:
grade = 'A'
elif score >= 75:
grade = 'B'
else:
grade = 'F'

for - цикл по последовательности
range генерирует последовательность чисел; обычного цикла по типу i = 0; i < n; i++ в python нет
while - цикл по условию
break/continue - как обычно

for i in range(5): # 0..4
if i == 3:
continue
print(i)

n = 3
while n > 0:
n -= 1 # нет ++/--

match/case​

Аналог switch в других языках, но умеет сопоставлять не только значения, а структуру (паттерны)
Появился в Python 3.10

match command:
case 'start':
run()
case 'stop' | 'halt': # несколько вариантов в одном case
stop()
case _: # аналог default - подходит под всё
print('неизвестная команда')

Функции​

Задаём через def
Без return функция вернёт None:

def greet(name, greeting='Привет'):
return f'{greeting}, {name}!'

Значение по умолчанию (greeting='Привет') задаётся один раз - в определении функции
При вызове такой параметр можно не передавать

Именованные аргументы - фича вызова, не определения: значение передаётся по имени параметра, а не по позиции
В большинстве других языков такого нет - там аргументы позиционные

greet('Аня') # только обязательный, по позиции
greet('Боря', greeting='Хай') # name - позиционно, greeting - по имени
greet(greeting='Йо', name='Вика') # оба по имени - порядок не важен

Особенно полезно у функций с несколькими опциональными параметрами - не нужно помнить порядок и видно, что чему передаётся, прямо в вызове:

def create_user(name, age=18, is_admin=False): ...

create_user('Дима', is_admin=True) # age пропущен, is_admin - по имени, ничего не перепутано

Проверь себя​

1. Как задать значение по умолчанию для параметра функции?

def f(x=10): ... - если не передать x, будет использовано 10

2. Чем / отличается от //?

/ - всегда float
// - целочисленное деление (отбрасывает дробную часть)

3. input() вернул '25'. Как получить из этого int?

int(input(...)) - input() всегда отдаёт str, преобразование нужно делать явно

4. Что определяет границы блока в Python?

Отступ (обычно 4 пробела), а не {}
Неправильный отступ - IndentationError

5. Чем case _ отличается от остальных веток в match?

Это wildcard - подходит под любое значение, аналог default в switch
Обычно ставится последней веткой

6. greet('Аня', greeting='Хай') и greet(greeting='Хай', name='Аня') - оба вызова верны?

Да
Именованные аргументы можно передавать в любом порядке - главное не перепутать имена

Дополнительно​