рдЕрд▓реНрдкрд╛рдЗрди рдХрдВрдкрд╛рдЗрд▓ рдбреЙрдХрд░ рдкрд╛рдпрдердирд╕рд╛рдареА 50 рдкрдЯ рд╣рд│реВрд╡рд╛рд░ рдмрдирд╡рддреЛ рдЖрдгрд┐ рдкреНрд░рддрд┐рдорд╛ 2 рдкрдЯ рдЬрдб рдЖрд╣реЗрдд

рдЕрд▓реНрдкрд╛рдЗрди рдХрдВрдкрд╛рдЗрд▓ рдбреЙрдХрд░ рдкрд╛рдпрдердирд╕рд╛рдареА 50 рдкрдЯ рд╣рд│реВрд╡рд╛рд░ рдмрдирд╡рддреЛ рдЖрдгрд┐ рдкреНрд░рддрд┐рдорд╛ 2 рдкрдЯ рдЬрдб рдЖрд╣реЗрдд

рдбреЙрдХрд░рд╕рд╛рдареА рдмреЗрд╕ рдЗрдореЗрдЬ рдореНрд╣рдгреВрди рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕рдЪреА рдЕрдиреЗрдХрджрд╛ рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реА рдЬрд╛рддреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рддреЗ рдХреА рдЕрд▓реНрдкрд╛рдЗрди рд╡рд╛рдкрд░рд▓реНрдпрд╛рдиреЗ рддреБрдордЪреА рдмрд┐рд▓реНрдб рд▓рд╣рд╛рди рд╣реЛрдИрд▓ рдЖрдгрд┐ рддреБрдордЪреА рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд▓рдж рд╣реЛрдИрд▓.

рдкрд░рдВрддреБ рдЬрд░ рддреБрдореНрд╣реА рдкрд╛рдпрдерди рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рд╡рд╛рдкрд░рдд рдЕрд╕рд╛рд▓ рддрд░ рддреЗ:

  • рддреБрдордЪреЗ рдмрд┐рд▓реНрдб рдЦреВрдк рд╣рд│реВ рдХрд░рддреЗ
  • рддреБрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдорд╛ рдореЛрдареНрдпрд╛ рдмрдирд╡рддреЗ
  • рдЖрдкрд▓рд╛ рд╡реЗрд│ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡рдгреЗ
  • рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рдпрд╛рдореБрд│реЗ рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рддреНрд░реБрдЯреА рдпреЗрдК рд╢рдХрддрд╛рдд


рдЕрд▓реНрдкрд╛рдЗрдирдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ рддреЗ рдкрд╛рд╣реВрдпрд╛, рдкрд░рдВрддреБ рддрд░реАрд╣реА рдЖрдкрдг рддреЗ рдкрд╛рдпрдердирд╕рд╣ рдХрд╛ рд╡рд╛рдкрд░реВ рдирдпреЗ.

рд▓реЛрдХ рдЕрд▓реНрдкрд╛рдЗрдирдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд╛ рдХрд░рддрд╛рдд?

рдЪрд▓рд╛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░реВ рдХреА рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди gcc рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдмрд┐рд▓реНрдб рдЧрддреА рдЖрдгрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдорд╛ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рд╡рд┐ рдЙрдмрдВрдЯреВ 18.04 рдЪреА рддреБрд▓рдирд╛ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗ.

рдкреНрд░рдердо, рджреЛрди рдкреНрд░рддрд┐рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░реВрдпрд╛:

$ docker pull --quiet ubuntu:18.04
docker.io/library/ubuntu:18.04
$ docker pull --quiet alpine
docker.io/library/alpine:latest
$ docker image ls ubuntu:18.04
REPOSITORY          TAG        IMAGE ID         SIZE
ubuntu              18.04      ccc6e87d482b     64.2MB
$ docker image ls alpine
REPOSITORY          TAG        IMAGE ID         SIZE
alpine              latest     e7d92cdc71fe     5.59MB

рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рдЕрд▓реНрдкрд╛рдЗрдирдЪреА рдореВрд│ рдкреНрд░рддрд┐рдорд╛ рдЦреВрдкрдЪ рд▓рд╣рд╛рди рдЖрд╣реЗ. рдЪрд▓рд╛ рдЖрддрд╛ gcc рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ рдЖрдгрд┐ рдЙрдмрдВрдЯреВрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛:

FROM ubuntu:18.04
RUN apt-get update && 
    apt-get install --no-install-recommends -y gcc && 
    apt-get clean && rm -rf /var/lib/apt/lists/*

рдкрд░рд┐рдкреВрд░реНрдг рдбреЙрдХрд░рдлрд╛рдЗрд▓ рд▓рд┐рд╣рд┐рдгреЗ рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╡реНрдпрд╛рдкреНрддреАрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЖрд╣реЗ.

рдЪрд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реАрдЪрд╛ рд╡реЗрдЧ рдореЛрдЬреВрдпрд╛:

$ time docker build -t ubuntu-gcc -f Dockerfile.ubuntu --quiet .
sha256:b6a3ee33acb83148cd273b0098f4c7eed01a82f47eeb8f5bec775c26d4fe4aae

real    0m29.251s
user    0m0.032s
sys     0m0.026s
$ docker image ls ubuntu-gcc
REPOSITORY   TAG      IMAGE ID      CREATED         SIZE
ubuntu-gcc   latest   b6a3ee33acb8  9 seconds ago   150MB

рдЖрдореНрд╣реА рдЕрд▓реНрдкрд╛рдЗрди (рдбреЙрдХрд░рдлрд╛рдЗрд▓) рд╕рд╛рдареА рддреЗрдЪ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рддреЛ:

FROM alpine
RUN apk add --update gcc

рдЖрдореНрд╣реА рдПрдХрддреНрд░ рдХрд░рддреЛ, рдЕрд╕реЗрдВрдмреНрд▓реАрдЪреА рд╡реЗрд│ рдЖрдгрд┐ рдЖрдХрд╛рд░ рдкрд╣рд╛:

$ time docker build -t alpine-gcc -f Dockerfile.alpine --quiet .
sha256:efd626923c1478ccde67db28911ef90799710e5b8125cf4ebb2b2ca200ae1ac3

real    0m15.461s
user    0m0.026s
sys     0m0.024s
$ docker image ls alpine-gcc
REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
alpine-gcc   latest   efd626923c14   7 seconds ago   105MB

рд╡рдЪрди рджрд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдорд╛ рдЬрд▓рдж рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛ рд▓рд╣рд╛рди рдЕрд╕рддрд╛рдд: 15 рдРрд╡рдЬреА 30 рд╕реЗрдХрдВрдж рдЖрдгрд┐ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдЖрдХрд╛рд░ 105MB рд╡рд┐рд░реБрджреНрдз 150MB рдЖрд╣реЗ. рд╣реЗ рдЦреВрдкрдЪ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ!

рдкрд░рдВрддреБ рдЬрд░ рдЖрдкрдг рдкрд╛рдпрдерди рдНрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрд╡рд┐рдЪ рдХреЗрд▓реЗ рддрд░ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЗрддрдХреЗ рдЧреБрд▓рд╛рдмреА рдирд╛рд╣реА.

рдкрд╛рдпрдерди рдкреНрд░рддрд┐рдорд╛

рдкрд╛рдпрдерди рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЕрдиреЗрдХрджрд╛ рдкрд╛рдВрдбрд╛ рдЖрдгрд┐ рдореЕрдЯрдкреНрд▓реЙрдЯрд▓рд┐рдм рд╡рд╛рдкрд░рддрд╛рдд. рдореНрд╣рдгреВрди, рдпрд╛ рдбреЙрдХрд░рдлрд╛рдЗрд▓рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдЕрдзрд┐рдХреГрдд рдбреЗрдмрд┐рдпрди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдорд╛ рдШреЗрдгреЗ рд╣рд╛ рдПрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗ:

FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas

рдЪрд▓рд╛ рддреЗ рдЧреЛрд│рд╛ рдХрд░реВрдпрд╛:

$ docker build -f Dockerfile.slim -t python-matpan.
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM python:3.8-slim
 ---> 036ea1506a85
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas
 ---> Running in 13739b2a0917
Collecting matplotlib
  Downloading matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl (13.1 MB)
Collecting pandas
  Downloading pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4 MB)
...
Successfully built b98b5dc06690
Successfully tagged python-matpan:latest

real    0m30.297s
user    0m0.043s
sys     0m0.020s

рдЖрдореНрд╣рд╛рд▓рд╛ 363MB рдЖрдХрд╛рд░рд╛рдЪреА рдкреНрд░рддрд┐рдорд╛ рдорд┐рд│рддреЗ.
рдЖрдореНрд╣реА рдЕрд▓реНрдкрд╛рдЗрди рд╕рд╣ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░реВ? рдЪрд▓рд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ:

FROM python:3.8-alpine
RUN pip install --no-cache-dir matplotlib pandas

$ docker build -t python-matpan-alpine -f Dockerfile.alpine .                                 
Sending build context to Docker daemon  3.072kB                                               
Step 1/2 : FROM python:3.8-alpine                                                             
 ---> a0ee0c90a0db                                                                            
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas                                                  
 ---> Running in 6740adad3729                                                                 
Collecting matplotlib                                                                         
  Downloading matplotlib-3.1.2.tar.gz (40.9 MB)                                               
    ERROR: Command errored out with exit status 1:                                            
     command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/
tmp/pip-install-a3olrixa/matplotlib/setup.py'"'"'; __file__='"'"'/tmp/pip-install-a3olrixa/matplotlib/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-a3olrixa/matplotlib/pip-egg-info                              

...
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
The command '/bin/sh -c pip install matplotlib pandas' returned a non-zero code: 1

рдХрд╛рдп рдЪрд╛рд▓рд▓рдп?

рдЕрд▓реНрдкрд╛рдЗрди рдЪрд╛рдХрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА

рддреБрдореНрд╣реА рдбреЗрдмрд┐рдпрдирд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдмрд┐рд▓реНрдб рдкрд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕реЗрд▓ рдХреА рддреЗ matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ.whl.

рд╣реЗ рдЪрд╛рдХрд╛рд╕рд╛рдареА рдмрд╛рдпрдирд░реА рдЖрд╣реЗ. рдЕрд▓реНрдкрд╛рдЗрди рд╕реНрд░реЛрдд `matplotlib-3.1.2.tar рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ.gz` рдХрд╛рд░рдг рддреЗ рдорд╛рдирдХрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА рд╡рд┐рджрд░реНрдн.

рдХрд╛? рдмрд╣реБрддреЗрдХ Linux рд╡рд┐рддрд░рдгреЗ C рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреА GNU рдЖрд╡реГрддреНрддреА (glibc) рд╡рд╛рдкрд░рддрд╛рдд, рдЬреА рдХрд┐рдВрдмрд╣реБрдирд╛ рдкрд╛рдпрдердирд╕рд╣ C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ. рдкрдг рдЕрд▓реНрдкрд╛рдЗрди `musl` рд╡рд╛рдкрд░рддреЗ, рдЖрдгрд┐ рддреНрдпрд╛ рдмрд╛рдпрдирд░реА `glibc` рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреНрдпрд╛рдВрдирд╛ рдкрд░реНрдпрд╛рдп рдирд╛рд╣реА.

рдореНрд╣рдгреВрди, рддреБрдореНрд╣реА рдЕрд▓реНрдкрд╛рдЗрди рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ Python рдкреЕрдХреЗрдЬрдордзреНрдпреЗ C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓.

рдЕрд░реЗ, рд╣реЛрдп, рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╢рд╛ рд╕рд░реНрд╡ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдЪреА рдпрд╛рджреА рд╢реЛрдзрд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЬреНрдпрд╛рдВрдирд╛ рд╕реНрд╡рддрдГ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдорд┐рд│рддреЗ:

FROM python:3.8-alpine
RUN apk --update add gcc build-base freetype-dev libpng-dev openblas-dev
RUN pip install --no-cache-dir matplotlib pandas

рдЖрдгрд┐ рдмрд╛рдВрдзрд╛рдпрд▓рд╛ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ...

... 25 рдорд┐рдирд┐рдЯреЗ 57 рд╕реЗрдХрдВрдж! рдЖрдгрд┐ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдЖрдХрд╛рд░ 851MB рдЖрд╣реЗ.

рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрд╛рд╕реНрдд рд╡реЗрд│ рд▓рд╛рдЧрддреЛ, рддреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдиреЗ рдореЛрдареНрдпрд╛ рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддрд░реАрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡ рдЕрд╡рд▓рдВрдмрди рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ. рдЖрдкрдг рдЕрд░реНрдерд╛рддрдЪ рд╡рд╛рдкрд░реВрди рдЕрд╕реЗрдВрдмрд▓реА рдЖрдХрд╛рд░ рдХрдореА рдХрд░реВ рд╢рдХрддрд╛ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдкрд░рдВрддреБ рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЖрдгрдЦреА рдХрд╛рдо рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдПрд╡рдвреЗрдЪ рдирд╛рд╣реА!

рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рдЕрд▓реНрдкрд╛рдЗрдирдореБрд│реЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдмрдЧ рд╣реЛрдК рд╢рдХрддрд╛рдд

  • рд╕рд┐рджреНрдзрд╛рдВрддрддрдГ, musl glibc рд╢реА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдлрд░рдХ рдЕрдиреЗрдХ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВ рд╢рдХрддрд╛рдд. рдЖрдгрд┐ рдЬрд░ рддреЗ рдЕрд╕рддреАрд▓ рддрд░ рддреЗ рдХрджрд╛рдЪрд┐рдд рдЕрдкреНрд░рд┐рдп рдЕрд╕рддреАрд▓. рдпреЗрдереЗ рдХрд╛рд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡реВ рд╢рдХрддрд╛рдд:
  • рдЕрд▓реНрдкрд╛рдЗрдирдордзреНрдпреЗ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рд▓рд╣рд╛рди рдереНрд░реЗрдб рд╕реНрдЯреЕрдХ рдЖрдХрд╛рд░ рдЕрд╕рддреЛ, рдЬреНрдпрд╛рдореБрд│реЗ рд╣реЛрдК рд╢рдХрддреЗ рдкрд╛рдпрдердирдордзреАрд▓ рддреНрд░реБрдЯреА
  • рдХрд╛рд╣реА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдЕрд╕реЗ рдЖрдврд│рд▓реЗ рдЖрд╣реЗ Python рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣рд│реВ рдЖрд╣реЗрдд рдореБрд╕рд▓ рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдореБрд│реЗ (glibc рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│реА).
  • рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдкреИрдХреА рдПрдХ рддрд╛рд░реАрдЦ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рддрд╛рдирд╛ рддреНрд░реБрдЯреА рдЖрдврд│рд▓реА

рдпрд╛ рдЪреБрдХрд╛ рдирдХреНрдХреАрдЪ рд╕реБрдзрд╛рд░рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, рдкрдг рдЕрдЬреВрди рдХрд┐рддреА рдЕрд╕рддреАрд▓ рдХреЛрдгрд╛рд╕ рдард╛рдКрдХ.

Python рд╕рд╛рдареА рдЕрд▓реНрдкрд╛рдЗрди рдкреНрд░рддрд┐рдорд╛ рд╡рд╛рдкрд░реВ рдирдХрд╛

рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдореЛрдареНрдпрд╛ рдЖрдгрд┐ рд▓рд╛рдВрдмрд▓рдЪрдХ рдмрд┐рд▓реНрдбрдЪрд╛ рддреНрд░рд╛рд╕ рдШреНрдпрд╛рдпрдЪрд╛ рдирд╕реЗрд▓, рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЖрдгрд┐ рд╕рдВрднрд╛рд╡реНрдп рддреНрд░реБрдЯреАрдВрдЪрд╛ рд╢реЛрдз рдШреНрдпрд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓, рддрд░ рдмреЗрд╕ рдЗрдореЗрдЬ рдореНрд╣рдгреВрди рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рд╡рд╛рдкрд░реВ рдирдХрд╛. рдЪрд╛рдВрдЧрд▓реА рдмреЗрд╕ рдЗрдореЗрдЬ рдирд┐рд╡рдбрдгреЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛