ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Python, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ²ΠΎΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ
Python β ΡΡΠΎ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Ρ Π°ΠΊΡΠ΅Π½ΡΠΎΠΌ Π½Π° ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΈ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ. ΠΠ³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ β ΠΎΡ Π²Π°ΡΡΠ²Π°ΡΡΠΈΠ΅ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ², ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΈΠΌΠΏΠΎΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠ΅ΡΠ°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π² ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ°Π»ΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°.
ΠΡΠΎΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Python, Π²ΠΊΠ»ΡΡΠ°Ρ Π³ΡΠ°Π½ΠΈΡΠ½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π½ΡΠ°Π½ΡΡ, Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°, Π²ΡΡ ΠΎΠ΄ΡΡΠΈΠ΅ Π·Π° ΡΠ°ΠΌΠΊΠΈ Π²Π²ΠΎΠ΄Π½ΡΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ². ΠΠ΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π² ΡΡΠ΅Π΄Π΅ VPS Π₯ΠΎΡΡΠΈΠ½Π³Π°, ΡΠΎΠ·Π΄Π°ΡΡΠ΅ Django API ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ΅ Π½Π°Π±ΠΎΡΡ Π΄Π°Π½Π½ΡΡ , ΡΡΠΈ ΠΎΡΠ½ΠΎΠ²Ρ Π»Π΅ΠΆΠ°Ρ Π² ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Python.
ΠΠΎΠΌΠ°Π½Π΄Ρ Π²Π²ΠΎΠ΄Π° ΠΈ Π²ΡΠ²ΠΎΠ΄Π°
Π€ΡΠ½ΠΊΡΠΈΡ `print()`
`print()` ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π² `stdout`. ΠΡ ΠΏΠΎΠ»Π½Π°Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠ°:
β`python
print(*objects, sep=' ', end='n', file=sys.stdout, flush=False)
β`
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²Π°ΠΆΠ½Ρ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅:
- `sep` ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠ±Π΅Π»).
- `end` ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ). Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° `end=''` ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½Π° Π΄Π»Ρ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ° ΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π² ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ.
- `file` ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ Π² Π»ΡΠ±ΠΎΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΡΠΎΠΊ β ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π»ΠΎΠ³ΠΎΠ² Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
- `flush=True` ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π±ΡΡΠ΅Ρ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
β`python
Practical example: progress output without newlines
import time
for i in range(5):
print(f"Processing step {i+1}/5β¦", end='r', flush=True)
time.sleep(0.5)
print("Done. ")
β`
ΠΡΠΈΠ±ΠΊΠ°: ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ `print()` Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½-ΠΊΠΎΠ΄Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π½ΡΠΈΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠΌ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ `logging` β ΠΎΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎΠ²Π½ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΜΠ΅ ΠΌΠ΅ΡΠΊΠΈ ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π±Π΅Π· ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ `stdout`.
Π€ΡΠ½ΠΊΡΠΈΡ `input()`
`input()` ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΈΠ· `stdin`, ΡΠ΄Π°Π»ΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΅Ρ ΠΊΠ°ΠΊ `str`. ΠΡΠ³ΡΠΌΠ΅Π½Ρ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½, Π½ΠΎ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ.
β`python
name = input("Enter your name: ")
print(f"Hello, {name}")
β`
ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π³ΡΠ°Π½ΠΈΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ: `input()` Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. Π Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°Ρ ΠΈΠ»ΠΈ ΡΠΊΡΠΈΠΏΡΠ°Ρ , Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅, Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² `input()` ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ Π·Π°Π²ΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΡΠ΅Π³Π΄Π° Π·Π°ΡΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ ΡΡΠ΅Π΄Ρ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `argparse` / `sys.argv` Π΄Π»Ρ Π½Π΅ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°:
β`python
try:
age = int(input("Enter your age: "))
except ValueError:
print("Invalid input: please enter a whole number.")
β`
ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΠ΅ Π²ΡΠ²ΠΎΠ΄ `input()` Π±Π΅Π· Π±Π»ΠΎΠΊΠ° `try/except` Π² Π»ΡΠ±ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΌ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ, Π²Π²Π΅Π΄ΡΠ½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ.
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΡ ΡΠΈΠΏΠΎΠ²
`type()` ΠΈ `isinstance()`
`type()` Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½-ΠΊΠΎΠ΄Π° `isinstance()` ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ.
β`python
num = 42
print(type(num)) # <class 'int'>
print(isinstance(num, int)) # True
print(isinstance(num, (int, float))) # True β checks multiple types at once
β`
ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ:
| Π‘Π»ΡΡΠ°ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ | Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ |
|---|---|
| Π’ΠΎΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΏΠ° (Π±Π΅Π· ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠ²) | `type(x) is SomeClass` |
| ΠΠΎΠ»ΠΈΠΌΠΎΡΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° / Ρ ΡΡΡΡΠΎΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ | `isinstance(x, SomeClass)` |
| ΠΡΠ»Π°Π΄ΠΊΠ° ΠΈ ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΡ | `type(x)` |
| ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Ρ ΡΡΠΈΠ½ΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ | `hasattr(x, 'method_name')` |
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ²: `int()`, `float()`, `str()`, `bool()`
ΠΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π΄Π»Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ² Python, Π° Π½Π΅ ΠΏΡΠΎΡΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ². ΠΠ½ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ `__init__` ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΈΡΠΎΠΊΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ .
β`python
int() with a base argument β often overlooked
binary_str = "1010"
print(int(binary_str, 2)) # Output: 10 (binary to decimal)
print(int("0xFF", 16)) # Output: 255 (hex to decimal)
bool() truthiness rules
print(bool(0)) # False
print(bool("")) # False
print(bool([])) # False
print(bool("False")) # True β non-empty string is always truthy
β`
ΠΡΠΈΠ±ΠΊΠ°: `bool("False")` Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ `True`, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π½Π΅ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ°. ΠΡΠΎ Π·Π°ΡΡΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π²ΡΠ°ΡΠΏΠ»ΠΎΡ ΠΏΡΠΈ ΡΠ°Π·Π±ΠΎΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
`len()`
`len()` Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ `__len__` ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ. Π Π°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ, ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΡΠ΅ΠΆΠ°ΠΌΠΈ, ΡΠ»ΠΎΠ²Π°ΡΡΠΌΠΈ, ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΠΌΠΈ ΠΈ Π»ΡΠ±ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΌ `__len__`.
β`python
text = "Python"
print(len(text)) # 6
data = {"a": 1, "b": 2}
print(len(data)) # 2 β counts keys, not key-value pairs
β`
ΠΡΠ°Π½ΠΈΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ: `len()` Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ `TypeError`, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `sum(1 for _ in generator)` Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΡΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°, Ρ ΠΎΡΡ ΡΡΠΎ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°Π΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ.
ΠΠΎΠΌΠ°Π½Π΄Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
Π£ΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ: `if`, `elif`, `else`
Python Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΡ, Π° Π½Π΅ ΡΡΡΠΎΠ³ΠΎΠ΅ Π±ΡΠ»Π΅Π²ΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅. ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π»ΠΎΠΆΠ½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ:
- ΠΠΎΠΆΠ½ΡΠ΅: `None`, `0`, `0.0`, `""`, `[]`, `{}`, `set()`, `False`
- ΠΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΡΠΈΠ½Π½ΡΠΌ
β`python
user_input = ""
if user_input:
print("Input received.")
else:
print("No input provided.") # This branch executes
β`
Π’Π΅ΡΠ½Π°ΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅):
β`python
status = "adult" if age >= 18 else "minor"
β`
Π‘ΡΡΡΠΊΡΡΡΠ½ΠΎΠ΅ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ ΠΎΠ±ΡΠ°Π·ΡΠΎΠΌ (Python 3.10+): ΠΠ»Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ `match/case` Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌ, ΡΠ΅ΠΌ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ `elif`:
β`python
command = "start"
match command:
case "start":
print("Starting serviceβ¦")
case "stop":
print("Stopping serviceβ¦")
case _:
print("Unknown command.")
β`
Π¦ΠΈΠΊΠ»Ρ: `for` ΠΈ `while`
Π¦ΠΈΠΊΠ»Ρ `for` ΠΈΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΏΠΎ Π»ΡΠ±ΠΎΠΌΡ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ `range()` Π»Π΅Π½ΠΈΠ²ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π°ΠΆΠ΅ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ².
β`python
range(start, stop, step)
for i in range(0, 10, 2):
print(i) # 0, 2, 4, 6, 8
β`
`enumerate()` β ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ `range(len(iterable))`:
β`python
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")
β`
Π¦ΠΈΠΊΠ»Ρ `while` ΡΡΠ΅Π±ΡΡΡ ΡΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ. ΠΡΠ΅Π³Π΄Π° ΡΠ±Π΅ΠΆΠ΄Π°ΠΉΡΠ΅ΡΡ, ΡΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΡΠΈΠΊΠ»Π° ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ `False`, ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ `break`:
β`python
attempts = 0
max_attempts = 3
while attempts < max_attempts:
response = input("Enter password: ")
if response == "secret":
print("Access granted.")
break
attempts += 1
else:
The 'else' clause on a while loop executes if the condition
becomes False without hitting 'break' β a rarely used but powerful feature
print("Too many failed attempts.")
β`
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΠΊΠ»ΠΎΠΌ:
- `break` β Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠΈΠΊΠ»
- `continue` β ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΡΡΠ°ΡΠΎΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ
- `pass` β ΠΏΡΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ Π² ΠΏΡΡΡΡΡ Π±Π»ΠΎΠΊΠ°Ρ
ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
Π§Π΅ΡΡΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Python ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ Python
| Π‘ΡΡΡΠΊΡΡΡΠ° | Π£ΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½Π°Ρ | ΠΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ | ΠΡΠ±Π»ΠΈΠΊΠ°ΡΡ | ΠΠ»ΡΡ-ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ | ΠΡΠ΅ΠΌΡ ΠΏΠΎΠΈΡΠΊΠ° |
|---|---|---|---|---|---|
| `list` | ΠΠ° | ΠΠ° | ΠΠ° | ΠΠ΅Ρ | O(n) |
| `tuple` | ΠΠ° | ΠΠ΅Ρ | ΠΠ° | ΠΠ΅Ρ | O(n) |
| `dict` | ΠΠ° (3.7+) | ΠΠ° | ΠΠ»ΡΡΠΈ: ΠΠ΅Ρ | ΠΠ° | O(1) Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ |
| `set` | ΠΠ΅Ρ | ΠΠ° | ΠΠ΅Ρ | ΠΠ΅Ρ | O(1) Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ |
| `frozenset` | ΠΠ΅Ρ | ΠΠ΅Ρ | ΠΠ΅Ρ | ΠΠ΅Ρ | O(1) Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ |
Π‘ΠΏΠΈΡΠΊΠΈ
Π‘ΠΏΠΈΡΠΊΠΈ β ΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ. ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°ΜΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ:
β`python
fruits = ["apple", "banana", "cherry"]
fruits.append("orange") # O(1) amortized β adds to end
fruits.insert(1, "mango") # O(n) β shifts elements right
fruits.remove("banana") # O(n) β searches then removes
popped = fruits.pop() # O(1) β removes from end
popped_idx = fruits.pop(0) # O(n) β removes from beginning, avoid in hot loops
List comprehension β faster than equivalent for loop
squares = [x**2 for x in range(10)]
β`
ΠΡΠΈΠ±ΠΊΠ°: ΠΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ `list.insert(0, item)` ΠΈΠ»ΠΈ `list.pop(0)` β ΡΡΠΎ O(n) Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ. ΠΠ»Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `collections.deque`, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ O(1) Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΎΠ±ΠΎΠΈΡ ΠΊΠΎΠ½ΡΠΎΠ².
Π‘Π»ΠΎΠ²Π°ΡΠΈ
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Python 3.7, ΡΠ»ΠΎΠ²Π°ΡΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΊΠ°ΠΊ ΡΠ·ΡΠΊΠΎΠ²ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡ (Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π΄Π΅ΡΠ°Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ).
β`python
person = {"name": "Alice", "age": 30, "role": "engineer"}
Safe key access β avoids KeyError
city = person.get("city", "Unknown") # Returns "Unknown" if key absent
Iterating
for key, value in person.items():
print(f"{key}: {value}")
Dictionary comprehension
squared = {x: x**2 for x in range(5)}
Merging dicts (Python 3.9+)
defaults = {"timeout": 30, "retries": 3}
config = {"timeout": 60}
merged = defaults | config # config values override defaults
β`
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π²Π½ΡΡΡΠ΅Π½Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΠΈ ΡΠΎ ΡΡΠ΅Π΄Π½Π΅ΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡ O(1) β Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΊΠΈ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ.
β`python
unique_ids = {101, 202, 303, 101} # Duplicate 101 is silently dropped
print(unique_ids) # {101, 202, 303}
Set operations β extremely useful for data deduplication
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b) # Intersection: {3, 4}
print(a | b) # Union: {1, 2, 3, 4, 5, 6}
print(a β b) # Difference: {1, 2}
print(a ^ b) # Symmetric difference: {1, 2, 5, 6}
β`
Π€ΡΠ½ΠΊΡΠΈΠΈ: `def`, `return` ΠΈ `lambda`
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `def`
β`python
def calculate_discount(price, discount=0.10):
"""
Returns the discounted price.
Args:
price (float): Original price.
discount (float): Discount rate as a decimal. Default is 10%.
Returns:
float: Price after discount.
"""
return price * (1 β discount)
print(calculate_discount(100)) # 90.0
print(calculate_discount(100, 0.25)) # 75.0
β`
`*args` ΠΈ `kwargs` ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²:
β`python
def log_event(event_type, *messages, **metadata):
print(f"[{event_type}]", " | ".join(messages))
for key, value in metadata.items():
print(f" {key}: {value}")
log_event("ERROR", "Connection failed", "Retryingβ¦", host="db01", port=5432)
β`
ΠΡΠΈΠ±ΠΊΠ° β ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ (ΡΠΏΠΈΡΠΎΠΊ, ΡΠ»ΠΎΠ²Π°ΡΡ) Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ½ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π½Π΅ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅:
β`python
WRONG β the list persists between calls
def add_item(item, items=[]):
items.append(item)
return items
CORRECT
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
β`
ΠΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ½ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ `sorted()`, `map()` ΠΈ `filter()`.
β`python
Sorting a list of dicts by a specific key
users = [{"name": "Charlie", "age": 25}, {"name": "Alice", "age": 30}]
sorted_users = sorted(users, key=lambda u: u["age"])
filter() with lambda
even_numbers = list(filter(lambda x: x % 2 == 0, range(10)))
[0, 2, 4, 6, 8]
map() with lambda
doubled = list(map(lambda x: x * 2, [1, 2, 3]))
[2, 4, 6]
β`
ΠΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ lambda: ΠΡΠ»ΠΈ ΡΠ΅Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠΎΠΊΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `def`. PEP 8 ΡΠ²Π½ΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ Π»ΡΠΌΠ±Π΄Ρ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ β Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ `def`.
Π Π°Π±ΠΎΡΠ° Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ
`open()`, `read()`, `write()` ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ `with`
Π€ΡΠ½ΠΊΡΠΈΡ `open()` Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡ ΠΏΠΎΠ»Π½Π°Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠ° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ `mode` ΠΈ `encoding`:
β`python
Always specify encoding explicitly β avoids platform-dependent behavior
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
β`
Π Π΅ΠΆΠΈΠΌΡ ΡΠ°ΠΉΠ»ΠΎΠ²:
| Π Π΅ΠΆΠΈΠΌ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| `"r"` | Π§ΡΠ΅Π½ΠΈΠ΅ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ). ΠΡΠ·ΡΠ²Π°Π΅Ρ `FileNotFoundError`, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ. |
| `"w"` | ΠΠ°ΠΏΠΈΡΡ. Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΡΡΠ΅ΠΊΠ°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅. |
| `"a"` | ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅. Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ», Π΅ΡΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π² ΠΊΠΎΠ½Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ. |
| `"x"` | ΠΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅. ΠΡΠ·ΡΠ²Π°Π΅Ρ `FileExistsError`, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. |
| `"b"` | ΠΠ²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ (ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ: `"rb"`, `"wb"`). |
| `"+"` | Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ (ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ: `"r+"`, `"w+"`). |
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ:
β`python
Read entire file into memory β fine for small files
with open("config.txt", "r", encoding="utf-8") as f:
content = f.read()
Read line by line β memory-efficient for large files (logs, datasets)
with open("server.log", "r", encoding="utf-8") as f:
for line in f:
process(line.strip())
Read all lines into a list
with open("hosts.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
β`
ΠΠΎΡΠ΅ΠΌΡ `with` ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅: ΠΠΏΠ΅ΡΠ°ΡΠΎΡ `with` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (`__enter__` / `__exit__`), ΡΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ°. Π ΡΡΠ½ΠΎΠΉ Π²ΡΠ·ΠΎΠ² `f.close()` Π½Π΅Π½Π°Π΄ΡΠΆΠ΅Π½ β Π΅ΡΠ»ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π΄ΠΎ `close()`, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° ΡΡΠ΅ΠΊΠ°Π΅Ρ.
ΠΡΠΈΠ±ΠΊΠ°: ΠΡΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ `"w"` Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΡΡΠ΅ΠΊΠ°Π΅Ρ Π΅Π³ΠΎ Π΄ΠΎ Π½ΡΠ»Ρ Π±Π°ΠΉΡ, Π΅ΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅. ΠΡΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΆΠ΅ ΠΏΠΎΡΠ΅ΡΡΠ½ΠΎ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ΅ΠΆΠΈΠΌ `"x"` ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°ΠΉΡΠ΅:
β`python
import os
import tempfile
with tempfile.NamedTemporaryFile("w", delete=False, encoding="utf-8") as tmp:
tmp.write(new_content)
tmp_path = tmp.name
os.replace(tmp_path, "config.txt") # Atomic on POSIX systems
β`
ΠΠΌΠΏΠΎΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
`import`, `from β¦ import` ΠΈ `as`
Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Python β ΠΎΠ΄Π½Π° ΠΈΠ· Π΅Ρ Π³Π»Π°Π²Π½ΡΡ ΡΠΈΠ»ΡΠ½ΡΡ ΡΡΠΎΡΠΎΠ½. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡ, ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
β`python
import math
print(math.sqrt(144)) # 12.0
print(math.ceil(4.2)) # 5
print(math.floor(4.9)) # 4
Import specific names into the current namespace
from os.path import join, exists, dirname
Alias long module names
import numpy as np
import pandas as pd
β`
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ Python:
| ΠΠΎΠ΄ΡΠ»Ρ | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ |
|---|---|
| `os` / `pathlib` | ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ, ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΡΡΠΌΠΈ |
| `sys` | Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, `argv`, `stdin`/`stdout`/`stderr` |
| `subprocess` | ΠΠ°ΠΏΡΡΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π½ΠΈΠΌΠΈ |
| `logging` | ΠΡΠΎΠ΄Π°ΠΊΡΠ΅Π½-Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΡΡΠΎΠ²Π½ΡΠΌΠΈ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ |
| `json` | Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ/Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ JSON |
| `re` | Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ |
| `datetime` | ΠΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠ° Π΄Π°Ρ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ |
| `collections` | `deque`, `Counter`, `defaultdict`, `OrderedDict` |
| `itertools` | ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ |
| `functools` | `lru_cache`, `partial`, `reduce` |
| `threading` / `multiprocessing` | ΠΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΠΈ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ |
| `socket` | ΠΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ |
| `hashlib` | ΠΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (SHA-256, MD5 ΠΈ Π΄Ρ.) |
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Python Package Index (PyPI) ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π±ΠΎΠ»Π΅Π΅ 500 000 ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `pip` Π΄Π»Ρ ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π±ΠΎΡΠ°ΠΉΡΠ΅ Π²Π½ΡΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ:
β`bash
Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS
.venvScriptsactivate.bat # Windows
Install packages
pip install requests flask gunicorn
Freeze dependencies for reproducible deployments
pip freeze > requirements.txt
Recreate environment on another machine
pip install -r requirements.txt
β`
ΠΡΠΈΠ±ΠΊΠ°: Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ (Π±Π΅Π· Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ) Π·Π°Π³ΡΡΠ·Π½ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Python ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌΠΈ. ΠΠ° ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½-ΡΠ΅ΡΠ²Π΅ΡΠ΅ VPS Π₯ΠΎΡΡΠΈΠ½Π³Π° Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ.
Π Π°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ Python-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅
ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ Python β ΡΡΠΎ Π»ΠΈΡΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΊΠ°ΡΡΠΈΠ½Ρ. ΠΠ°Π΄ΡΠΆΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ ΠΊΠΎΠ΄Π° Python Π² ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
ΠΡΠΈ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask ΠΈΠ»ΠΈ Django Π½Π° VPS Ρ cPanel ΠΈΠ»ΠΈ Π½Π° ΡΠΈΡΡΠΎΠΌ Linux VPS ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ:
- WSGI-ΡΠ΅ΡΠ²Π΅Ρ (Gunicorn, uWSGI) Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ Python-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠ±ΡΠ°ΡΠ½ΡΠΉ ΠΏΡΠΎΠΊΡΠΈ (Nginx, Apache) Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ SSL-ΡΠ΅ΡΠΌΠΈΠ½Π°ΡΠΈΠΈ ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²
- ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (systemd, Supervisor) Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΠ΅Π² ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΎΠΊ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² (Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ Π°ΡΠ΄ΠΊΠΎΠ΄ΠΈΡΡΠΉΡΠ΅ ΡΡΡΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅)
β`bash
Example: running a Flask app with Gunicorn
gunicorn βworkers 4 βbind 0.0.0.0:8000 wsgi:app
Example: systemd service unit for auto-restart
/etc/systemd/system/myapp.service
[Unit]
Description=My Python App
After=network.target
[Service]
User=deploy
WorkingDirectory=/var/www/myapp
ExecStart=/var/www/myapp/.venv/bin/gunicorn βworkers 4 βbind 0.0.0.0:8000 wsgi:app
Restart=always
[Install]
WantedBy=multi-user.target
β`
ΠΠ»Ρ ΡΠ΅ΡΡΡΡΠΎΡΠΌΠΊΠΈΡ ΡΠ°Π±ΠΎΡΠΈΡ Π½Π°Π³ΡΡΠ·ΠΎΠΊ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ , GPU Π₯ΠΎΡΡΠΈΠ½Π³ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ CUDA, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ NumPy, TensorFlow ΠΈ PyTorch.
ΠΡΠ»ΠΈ Π²Π°ΡΠ΅ Python-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΠΈΡΡΠΌΠ° ΠΈΠ»ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ ΡΠ°ΡΡΡΠ»ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° Email Π₯ΠΎΡΡΠΈΠ½Π³Π° ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π°Π΄ΡΠΆΠ½ΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΡ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ SPF/DKIM Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ `sendmail`.
ΠΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ»ΡΡΠ΅Π²ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΎΠ²
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠΎ ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΊΠΎΠ΄Π°:
- ΠΠ²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄: ΠΠ°ΠΌΠ΅Π½ΠΈΡΠ΅ `print()` ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ `logging` Π² Π»ΡΠ±ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π±Π΅Π· ΠΏΡΠΈΡΠΌΠΎΡΡΠ°. ΠΡΠ΅Π³Π΄Π° ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΠΉΡΠ΅ `input()` Π² `try/except ValueError`.
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΏΠΎΠ²: ΠΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ `isinstance()` Π²ΠΌΠ΅ΡΡΠΎ `type()` Π΄Π»Ρ Π»ΠΎΠ³ΠΈΠΊΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ `bool("False")` β ΡΡΠΎ `True`.
- Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ : ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `dict` ΠΈΠ»ΠΈ `set` Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° O(1). ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `collections.deque` Π²ΠΌΠ΅ΡΡΠΎ `list`, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡΠΆΠ½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
- Π€ΡΠ½ΠΊΡΠΈΠΈ: ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ Π²ΡΠ΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
- Π Π°Π±ΠΎΡΠ° Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ: ΠΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `with open(β¦)` ΠΈ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΠΉΡΠ΅ `encoding="utf-8"`. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ².
- ΠΠΎΠ΄ΡΠ»ΠΈ: ΠΡΠ΅Π³Π΄Π° ΡΠ°Π±ΠΎΡΠ°ΠΉΡΠ΅ Π²Π½ΡΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. Π€ΠΈΠΊΡΠΈΡΡΠΉΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `pip freeze > requirements.txt`.
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠΌ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠ»Π°ΡΠ·ΡΠ»Ρ `else` Π² ΡΠΈΠΊΠ»Π°Ρ `for`/`while` Π΄Π»Ρ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠΈΠΊΠ»Π°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `match/case` (Python 3.10+) Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ.
- Π Π°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ WSGI-ΡΠ΅ΡΠ²Π΅Ρ, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ². ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°ΠΉΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Flask Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅.
Π§Π°ΡΡΠΎ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ
Π ΡΡΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ `print()` ΠΈ `logging` Π² Python?
`print()` Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π½Π°ΠΏΡΡΠΌΡΡ Π² `stdout` Π±Π΅Π· ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ΄ΡΠ»Ρ `logging` ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎΠ²Π½ΠΈ ΡΠ΅ΡΡΡΠ·Π½ΠΎΡΡΠΈ (`DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`), Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΜΠ΅ ΠΌΠ΅ΡΠΊΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΌΠ΅ΡΡΠ° Π²ΡΠ²ΠΎΠ΄Π°. ΠΠ»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ°, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ, `logging` β ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ.
ΠΠΎΡΠ΅ΠΌΡ `input()` Π² Python Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ?
`input()` ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ Π±Π°ΠΉΡΡ ΠΈΠ· `stdin` ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ ΠΈΡ ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡ. Python Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π½Π°ΡΡ, Π½Π°ΠΌΠ΅ΡΠ΅Π½ Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π²Π΅ΡΡΠΈ ΡΠΈΡΠ»ΠΎ, Π΄Π°ΡΡ ΠΈΠ»ΠΈ ΡΡΡΠΎΠΊΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠΈΠΉ ΡΠΈΠΏ (`str`) ΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡΡΠ΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π²ΡΠ½ΡΠΆΠ΄Π°Π΅Ρ ΠΊ ΡΠ²Π½ΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ, ΡΡΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅ Π½Π΅ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ².
Π ΡΡΠΌ ΡΠ°Π·Π½ΠΈΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ `list` ΠΈ `set` ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΠΈ?
ΠΡΠΎΠ²Π΅ΡΠΊΠ° `x in my_list` β ΡΡΠΎ O(n): Python ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΡΠΎΠ²Π΅ΡΠΊΠ° `x in my_set` β ΡΡΠΎ O(1) Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ»Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π΄Π΅ΡΡΡΠΊΠ°ΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π³Π΄Π΅ Π²Ρ ΡΠ°ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΠ΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΡ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² `set` ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΠ³Π΄Π° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `lambda` Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ `def`?
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ `lambda` ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΊΠΎΡΠΎΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, `sorted()`, `map()`, `filter()`). ΠΡΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈΠ»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `def`. ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ `lambda` ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ²Π½ΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ PEP 8.
ΠΠ°ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Python-ΡΠΊΡΠΈΠΏΡ Π½Π° Linux-ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ?
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π΄ΡΠΆΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ β ΡΡΠΎ ΡΠ½ΠΈΡ-ΡΠ΅ΡΠ²ΠΈΡ `systemd` Ρ `Restart=always` ΠΈ `WantedBy=multi-user.target`. ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠΊΡΠΈΠΏΡ Π² `crontab` Ρ ΠΏΠΎΠΌΠΎΡΡΡ `@reboot /path/to/venv/bin/python /path/to/script.py`. ΠΠΎΠ΄Ρ ΠΎΠ΄ `systemd` ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· `journalctl`, ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°.
Π½Π° Π²ΡΠ΅Ρ
Ρ
ΠΎΡΡΠΈΠ½Π³ΠΎΠ²ΡΡ
ΡΡΠ»ΡΠ³Π°Ρ