Len в python: Python 3 — Строковая функция len()

Содержание

Функция len() в Python, считает количество элементов.

Возвращает количество элементов в последовательности.

Синтаксис:
Параметры:
  • s — последовательность или коллекция.
Возвращаемое значение:
Описание:

Функция len() возвращает длину (количество элементов) в объекте.

Аргумент может быть последовательностью, такой как строка, байты, кортеж, список или диапазон или коллекцией (такой как словарь, множество или неизменяемое множество).

Когда объект является строкой, функция len() возвращает количество символов в строке.

Пользовательские типы данных могут определять метод __len__(), значение из которого, будет возвращено при вызове функции len().

Примеры подсчета количества элементов в последовательности.
# подсчет элементов списка
>>> mylist = ['apple', 'banana', 'cherry']
>>> len(x)
# 3

# подсчет символов в строке
>>> string = 'Hello'
>>> len(string)
# 5

# подсчет количества ключей словаря
>>> d = {'a': 1, 'b': 1, 'c': 1, 'd': 1}
>>> keys = list(d)
>>> len(keys)
# 4

Подсчет количества цифр в числе (длина числа)

Для того, чтобы посчитать количество цифр в числе необходимо сначала перевести число float или int в любую последовательность, например в строку, а затем к последовательности применить функцию len(), что бы получить количество элементов.

Для получения строкового представления объектов float и int, применим к ним функцию str.

Пример получения длины целого числа:

# получение длины целого числа 
>>> x = 1235412687
>>> str_x = str(x)
>>> str_x
# '1235412687'
>>> num_x = len(str_x)
>>> num_x
# 10

Так как вещественные числа в Python имеют запятую, то количество цифр в числе float будет на 1 меньше, а именно len(str(float)) - 1.

Пример получения длины вещественного числа:

# получение длины вещественного числа 
>>> x = 0.1230541287
# запишем преобразования короче
>>> num_x = len(str(x)) - 1
>>> num_x
# 11

Что бы получить количество уникальных цифр в числе, необходимо строковое представление числа преобразовать в множество set, т.к. множество представляет собой последовательность неповторяющихся элементов.

Пример подсчета уникальных цифр в числах float и int:

# получение кол-ва уникальных цифр целого числа 
>>> x = 1235412687
# получаем строковое представление 
>>> str_x = str(x)
# получаем множество уникальных цифр числа
>>> set_x = set(str_x)
# {'1', '5', '7', '8', '6', '2', '4', '3'}

# считаем кол-во уникальных цифр
>>> num_x = len(set_x)
>>> num_x
# 8

# для получения кол-ва уникальных цифр 
# числа `float` сделаем запись короче 
>>> x = 0.1230541287
# количество уникальных цифр числа `float`
# будет на 1 меньше, т.к. число имеет разделитель
>>> num_x = len(set(str(x))) - 1
# 8

Ошибка object of type ‘NoneType’ has no len() при установке pyjnius — python

Использую win8
Дополнительно установил jre и в системных параметрах установил

SET VS90COMNTOOLS=%VS100COMNTOOLS%
SET JDK_HOME=<path to the JDK installation directory>
SET JAVA_HOME=%JDK_HOME%
SET PATH=%JDK_HOME%\jre\bin\server;%PATH%

Сейчас получаю вот такое предупреждение

C:\Windows\System32>pip install pyjnius
Downloading/unpacking pyjnius
  Running setup.py (path:c:\users\alexk\appdata\local\temp\pip_build_AlexK\pyjni
us\setup.py) egg_info for package pyjnius

    warning: no files found matching '*COPYING'
Installing collected packages: pyjnius
  Running setup.py install for pyjnius
    skipping 'jnius\jnius.c' Cython extension (up-to-date)
    building 'jnius' extension
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "c:\users\alexk\appdata\local\temp\pip_build_AlexK\pyjnius\setup.py",
 line 154, in <module>
        'Topic :: Software Development :: Libraries :: Application Frameworks'])

      File "C:\Python27\lib\distutils\core.py", line 151, in setup
        dist.run_commands()
      File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands
        self.run_command(cmd)
      File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
        cmd_obj.run()
      File "build\bdist.win32\egg\setuptools\command\install.py", line 61, in ru
n
      File "C:\Python27\lib\distutils\command\install.py", line 563, in run
        self.run_command('build')
      File "C:\Python27\lib\distutils\cmd.py", line 326, in run_command
        self.distribution.run_command(command)
      File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
        cmd_obj.run()
      File "C:\Python27\lib\distutils\command\build.py", line 127, in run
        self.run_command(cmd_name)
      File "C:\Python27\lib\distutils\cmd.py", line 326, in run_command
        self.distribution.run_command(command)
      File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
        cmd_obj.run()
      File "C:\Python27\lib\site-packages\Cython\Distutils\build_ext.py", line 1
63, in run
        _build_ext.build_ext.run(self)
      File "C:\Python27\lib\distutils\command\build_ext.py", line 337, in run
        self.build_extensions()
      File "C:\Python27\lib\site-packages\Cython\Distutils\build_ext.py", line 1
71, in build_extensions
        self.build_extension(ext)
      File "C:\Python27\lib\distutils\command\build_ext.py", line 496, in build_
extension
        depends=ext.depends)
      File "C:\Python27\lib\distutils\msvc9compiler.py", line 473, in compile
        self.initialize()
      File "C:\Python27\lib\distutils\msvc9compiler.py", line 383, in initialize

        vc_env = query_vcvarsall(VERSION, plat_spec)
      File "C:\Python27\lib\distutils\msvc9compiler.py", line 299, in query_vcva
rsall
        raise ValueError(str(list(result.keys())))
    ValueError: [u'path']
    Complete output from command C:\Python27\python.exe -c "import setuptools, t
okenize;__file__='c:\\users\\alexk\\appdata\\local\\temp\\pip_build_AlexK\\pyjni
us\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().repl
ace('\r\n', '\n'), __file__, 'exec'))" install --record c:\users\alexk\appdata\l
ocal\temp\pip-4yd70b-record\install-record.txt --single-version-externally-manag
ed --compile:
    running install

running build

running build_py

creating build

creating build\lib.win32-2.7

creating build\lib.win32-2.7\jnius

copying jnius\reflect.py -> build\lib.win32-2.7\jnius

copying jnius\__init__.py -> build\lib.win32-2.7\jnius

running build_ext

skipping 'jnius\jnius.c' Cython extension (up-to-date)

building 'jnius' extension

Traceback (most recent call last):

  File "<string>", line 1, in <module>

  File "c:\users\alexk\appdata\local\temp\pip_build_AlexK\pyjnius\setup.py", lin
e 154, in <module>

    'Topic :: Software Development :: Libraries :: Application Frameworks'])

  File "C:\Python27\lib\distutils\core.py", line 151, in setup

    dist.run_commands()

  File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands

    self.run_command(cmd)

  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command

    cmd_obj.run()

  File "build\bdist.win32\egg\setuptools\command\install.py", line 61, in run

  File "C:\Python27\lib\distutils\command\install.py", line 563, in run

    self.run_command('build')

  File "C:\Python27\lib\distutils\cmd.py", line 326, in run_command

    self.distribution.run_command(command)

  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command

    cmd_obj.run()

  File "C:\Python27\lib\distutils\command\build.py", line 127, in run

    self.run_command(cmd_name)

  File "C:\Python27\lib\distutils\cmd.py", line 326, in run_command

    self.distribution.run_command(command)

  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command

    cmd_obj.run()

  File "C:\Python27\lib\site-packages\Cython\Distutils\build_ext.py", line 163,
in run

    _build_ext.build_ext.run(self)

  File "C:\Python27\lib\distutils\command\build_ext.py", line 337, in run

    self.build_extensions()

  File "C:\Python27\lib\site-packages\Cython\Distutils\build_ext.py", line 171,
in build_extensions

    self.build_extension(ext)

  File "C:\Python27\lib\distutils\command\build_ext.py", line 496, in build_exte
nsion

    depends=ext.depends)

  File "C:\Python27\lib\distutils\msvc9compiler.py", line 473, in compile

    self.initialize()

  File "C:\Python27\lib\distutils\msvc9compiler.py", line 383, in initialize

    vc_env = query_vcvarsall(VERSION, plat_spec)

  File "C:\Python27\lib\distutils\msvc9compiler.py", line 299, in query_vcvarsal
l

    raise ValueError(str(list(result.keys())))

ValueError: [u'path']

Аналогично, если C:\Windows\System32>pip install jnius

Может есть подробная инструкция ?

Мир Python: функционалим по-маленьку — Продвинутый Python

Продвинутый Python

Введение

Существует несколько парадигм в программировании, например, ООП, функциональная, императивная, логическая, да много их. Мы будем говорить про функциональное программирование.

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

Сегодня познакомимся с простыми элементами, а сложные конструкции будут в других уроках.

Теория в теории

Как и в разговоре об ООП, так и о функциональном программировании, мы стараемся избегать определений. Все-таки четкое определение дать тяжело, поэтому здесь четкого определения не будет. Однако! Хотелки для функционального языка выделим:

  • Функции высшего порядка
  • Чистые функции
  • Неизменяемые данные

Это не полный список, но даже этого хватает чтобы сделать «красиво». Если читателю хочется больше, то вот расширенный список:

  • Функции высшего порядка
  • Чистые функции
  • Неизменяемые данные
  • Замыкания
  • Ленивость
  • Хвостовая рекурсия
  • Алгебраические типы данных
  • Pattern matching

Постепенно рассмотрим все эти моменты и как использовать в Python.

А сегодня кратко, что есть что в первом списке.

Чистые функции

Чистые функции не производят никаких наблюдаемых побочных эффектов, только возвращают результат. Не меняют глобальных переменных, ничего никуда не посылают и не печатают, не трогают объектов, и так далее. Принимают данные, что-то вычисляют, учитывая только аргументы, и возвращают новые данные.

Плюсы:

  • Легче читать и понимать код
  • Легче тестировать (не надо создавать «условий»)
  • Надежнее, потому что не зависят от «погоды» и состояния окружения, только от аргументов
  • Можно запускать параллельно, можно кешировать результат

Неизменяемые данные

Неизменяемые (иммутабельные) структуры данных — это коллекции, которые нельзя изменить. Примерно как числа. Число просто есть, его нельзя поменять. Также и неизменяемый массив — он такой, каким его создали, и всегда таким будет. Если нужно добавить элемент — придется создать новый массив.

Преимущества неизменяемых структур:

  • Безопасно разделять ссылку между потоками
  • Легко тестировать
  • Легко отследить жизненный цикл (соответствует data flow)

theory-source

Функции высшего порядка

Функцию, принимающую другую функцию в качестве аргумента и/или возвращающую другую функцию, называют функцией высшего порядка:


def f(x):
    return x + 3

def g(function, x):
    return function(x) * function(x)

print(g(f, 7))

Рассмотрели теорию, начнем переходить к практике, от простого к сложному.

Списковые включения или генератор списка

Рассмотрим одну конструкцию языка, которая поможет сократить количество строк кода. Не редко уровень программиста на Python можно определить с помощью этой конструкции.

Пример кода:


for x in xrange(5, 10):
    if x % 2 == 0:
        x =* 2
    else:
        x += 1

Цикл с условием, подобные встречаются не редко. А теперь попробуем эти 5 строк превратить в одну:

>>> [x * 2 if x % 2 == 0 else x + 1 for x in xrange(5, 10)]
[6, 12, 8, 16, 10]

Недурно, 5 строк или 1. Причем выразительность повысилась и такой код проще понимать — один комментарий можно на всякий случай добавить.

В общем виде эта конструкция такова:

[stmt for var in iterable if predicate] 

Стоит понимать, что если код совсем не читаем, то лучше отказаться от такой конструкции.

Анонимные функции или lambda

Продолжаем сокращать количества кода.

Функция:

def calc(x, y):
    return x**2 + y**2

Функция короткая, а как минимум 2 строки потратили. Можно ли сократить такие маленькие функции? А может не оформлять в виде функций? Ведь, не всегда хочется плодить лишние функции в модуле. А если функция занимает одну строчку, то и подавно. Поэтому в языках программирования встречаются анонимные функции, которые не имеют названия.

Анонимные функции в Python реализуются с помощью лямбда-исчисления и выглядят как лямбда-выражения:

>>> lambda x, y: x**2 + y**2
<function <lambda> at 0x7fb6e34ce5f0>

Для программиста это такие же функции и с ними можно также работать.

Чтобы обращаться к анонимным функциям несколько раз, присваиваем переменной и пользуемся на здоровье.

Пример:

>>> (lambda x, y: x**2 + y**2)(1, 4)
17
>>>
>>> func = lambda x, y: x**2 + y**2
>>> func(1, 4)
17

Лямбда-функции могут выступать в качестве аргумента. Даже для других лямбд:

multiplier = lambda n: lambda k: n*k

Использование lambda

Функции без названия научились создавать, а где использовать сейчас узнаем. Стандартная библиотека предоставляет несколько функций, которые могут принимать в качестве аргумента функцию — map(), filter(), reduce(), apply().

map()

Функция map() обрабатывает одну или несколько последовательностей с помощью заданной функции.


>>> list1 = [7, 2, 3, 10, 12]
>>> list2 = [-1, 1, -5, 4, 6]
>>> list(map(lambda x, y: x*y, list1, list2))
[-7, 2, -15, 40, 72]

Мы уже познакомились с генератором списков, давайте им воспользуемся, если длина список одинаковая:

>>> [x*y for x, y in zip(list1, list2)]
[-7, 2, -15, 40, 72]

Итак, заметно, что использование списковых включений короче, но лямбды более гибкие. Пойдем дальше.

filter()

Функция filter() позволяет фильтровать значения последовательности. В результирующем списке только те значения, для которых значение функции для элемента истинно:

>>> numbers = [10, 4, 2, -1, 6]
>>> list(filter(lambda x: x < 5, numbers))     # В результат попадают только те элементы x, для которых x < 5 истинно
[4, 2, -1]

То же самое с помощью списковых выражений:

>>> numbers = [10, 4, 2, -1, 6]
>>> [x for x in numbers if x < 5]
[4, 2, -1]

reduce()

Для организации цепочечных вычислений в списке можно использовать функцию reduce(). Например, произведение элементов списка может быть вычислено так (Python 2):

>>> numbers = [2, 3, 4, 5, 6]
>>> reduce(lambda res, x: res*x, numbers, 1)
720

Вычисления происходят в следующем порядке:

((((1*2)*3)*4)*5)*6

Цепочка вызовов связывается с помощью промежуточного результата (res). Если список пустой, просто используется третий параметр (в случае произведения нуля множителей это 1):

>>> reduce(lambda res, x: res*x, [], 1)
1

Разумеется, промежуточный результат необязательно число. Это может быть любой другой тип данных, в том числе и список. Следующий пример показывает реверс списка:

>>> reduce(lambda res, x: [x]+res, [1, 2, 3, 4], [])
[4, 3, 2, 1]

Для наиболее распространенных операций в Python есть встроенные функции:

>>> numbers = [1, 2, 3, 4, 5]
>>> sum(numbers)
15
>>> list(reversed(numbers))
[5, 4, 3, 2, 1]

В Python 3 встроенной функции reduce() нет, но её можно найти в модуле functools.

apply()

Функция для применения другой функции к позиционным и именованным аргументам, заданным списком и словарем соответственно (Python 2):

>>> def f(x, y, z, a=None, b=None):
...     print x, y, z, a, b
...
>>> apply(f, [1, 2, 3], {'a': 4, 'b': 5})
1 2 3 4 5

В Python 3 вместо функции apply() следует использовать специальный синтаксис:

>>> def f(x, y, z, a=None, b=None):
...     print(x, y, z, a, b)
...
>>> f(*[1, 2, 3], **{'a': 4, 'b': 5})
1 2 3 4 5

На этой встроенной функции закончим обзор стандартной библиотеки и перейдем к последнему на сегодня функциональному подходу.

Замыкания

Функции, определяемые внутри других функций, представляют собой замыкания. Зачем это нужно? Рассмотрим пример, который объяснит:

Код (вымышленный):


def processing(element, type_filter, all_data_size):
    filters = Filter(all_data_size, type_filter).get_all()
    for filt in filters:
        element = filt.filter(element)

def main():

    data = DataStorage().get_all_data()

    for x in data:
        processing(x, 'all', len(data))

Что можно в коде заметить: в этом коде переменные, которые живут по сути постоянно (т.е. одинаковые), но при этом мы загружаем или инициализируем по несколько раз. В итоге приходит понимание, что инициализация переменной занимает львиную долю времени в этом процессе, бывает что даже загрузка переменных в scope уменьшает производительность. Чтобы уменьшить накладные расходы необходимо использовать замыкания.

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

Научимся оформлять замыкания:

def multiplier(n):
    "multiplier(n) возвращает функцию, умножающую на n" 
    def mul(k): 
        return n*k 
     return mul 
     # того же эффекта можно добиться выражением 
     # multiplier = lambda n: lambda k: n*k 

mul2 = multiplier(2) # mul2 - функция, умножающая на 2, например, 
mul2(5) == 10

Заключение

В уроке мы рассмотрели базовые понятия ФП, а также составили список механизмов, которые будут рассмотрены в следующих уроках. Поговорили о способах уменьшения количества кода, таких как cписковые включения (генератор списка), lamda функции и их использовании и на последок было несколько слов про замыкания и для чего они нужны.


Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Python len ()

Синтаксис len () :

лен (с) 

len () Параметры

s — последовательность (строка, байты, кортеж, список или диапазон) или коллекция (словарь, набор или замороженный набор)


Возвращаемое значение из len ()

Функция len () возвращает количество элементов объекта.

Отказ передать аргумент или передать недопустимый аргумент вызовет исключение TypeError .


Пример 1. Как len () работает с кортежами, списками и диапазоном?

  testList = []
print (testList, 'длина', len (testList))

testList = [1, 2, 3]
print (testList, 'длина', len (testList))

testTuple = (1, 2, 3)
print (testTuple, 'длина', len (testTuple))

testRange = диапазон (1, 10)
print ('Длина', testRange, 'is', len (testRange))  

Выход

  [] длина 0
[1, 2, 3] длина 3
(1, 2, 3) длина 3
Длина диапазона (1, 10) - 9  

Посетите эти страницы, чтобы узнать больше о:


Пример 2: Как len () работает со строками и байтами?

  testString = ''
print ('Длина', testString, 'is', len (testString))

testString = 'Python'
print ('Длина', testString, 'is', len (testString))

# байтовый объект
testByte = b'Python '
print ('Длина', testByte, 'is', len (testByte))

testList = [1, 2, 3]

# преобразование в объект байтов
testByte = байты (testList)
print ('Длина', testByte, 'is', len (testByte))  

Выход

  Длина 0
Длина Python 6
Длина b'Python - 6
Длина b '\ x01 \ x02 \ x03' составляет 3  

Посетите эти страницы, чтобы узнать больше о:


Пример 3: Как len () работает со словарями и наборами?

  testSet = {1, 2, 3}
print (testSet, 'длина', len (testSet))

# Пустой набор
testSet = set ()
print (testSet, 'длина', len (testSet))

testDict = {1: 'один', 2: 'два'}
print (testDict, 'длина', len (testDict))

testDict = {}
print (testDict, 'длина', len (testDict))

testSet = {1, 2}
# frozenSet
frozenTestSet = frozenset (testSet)
print (frozenTestSet, 'длина', len (frozenTestSet))  

Выход

  {1, 2, 3} длина 3
set () длина 0
{1: 'one', 2: 'two'} длина 2
{} длина 0
длина замораживания ({1, 2}) 2  

Посетите эти страницы, чтобы узнать больше о:


Внутри len () вызывает метод объекта __len__ .Вы можете думать о len () как о

def len (s):
    вернуть s .__ len __ () 

Итак, объекту можно присвоить произвольную длину (при необходимости)

Пример 4: Как len () работает с пользовательскими объектами?

  класс Сессия:
    def __init __ (self, number = 0):
      self.number = число
    
    def __len __ (сам):
      вернуть self.number


# длина по умолчанию 0
s1 = Сессия ()
печать (len (s1))

# задаем нестандартную длину
s2 = Сессия (6)
печать (len (s2))  

Выход

  0
6  

Длина строки Python | Метод len () Пример

len () — это встроенная функция в Python.Вы можете использовать len (), чтобы получить длину данной строки, массива, списка, кортежа, словаря и т. Д.

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

Синтаксис:

len (значение)
 

Параметры:

Значение : заданное значение, длину которого вы хотите.

Возвращаемое значение

Возвращает целочисленное значение i.е. длина данной строки, массива, списка или коллекций.

Различные типы возвращаемых значений:

Строки:

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

Пусто:

Пусто — это второй обратный вызов, который содержит ноль символов, но всегда имеет значение «Нет».

Коллекций:

Встроенная функция len возвращает количество элементов в коллекции.

TypeError:

Функция Len зависит от типа переданной ей переменной. Non-Type не имеет встроенной поддержки.

Словарь:

Для словаря каждая пара считается одной единицей. Однако значения и ключи не являются независимыми.

Пример 1: Как найти длину данной строки?

# тестирование len ()
str1 = "Добро пожаловать в Guru99 Python Tutorials"
print ("Длина строки:", len (str1))
 

Выход:

Длина строки: 35
 

Пример 2: Как узнать длину списка в Python?

# чтобы найти длину списка

list1 = ["Тим", "Чарли", "Тиффани", "Роберт"]

print ("Длина списка", len (list1))
 

Выход:

Длина списка 4
 

Пример 3: Как найти длину кортежа в Python

# чтобы найти длину кортежа

Tup = ('янв', 'фев', 'март')

print ("Длина кортежа равна", len (Tup))
 

Выход:

Длина кортежа - 3
 

Пример 4: Как найти длину словаря в Python?

# чтобы найти длину словаря

Dict = {'Тим': 18, 'Чарли': 12, 'Тиффани': 22, 'Роберт': 25}

print ("Длина словаря составляет", len (Dict))
 

Выход:

Длина словаря 4
 

Пример 5: Как найти длину массива в Python

# найти длину массива

arr1 = ['Тим', 'Чарли', 'Тиффани', 'Роберт']

print ("Длина массива равна", len (arr1))
 

Выход:

Длина массива 4
 

Описание:

  • len () — это встроенная функция в Python.Вы можете использовать len (), чтобы получить длину заданной строки, массива, списка, кортежа, словаря и т. Д.
  • Значение: заданное значение, длину которого вы хотите.
  • Возвращаемое значение Возвращает целочисленное значение, то есть длину данной строки, или массива, или списка, или коллекций.

Функция Python len () — ThePythonGuru.com

  1. Дом
  2. Встроенные функции Python
  3. Функция Python len ()

(Спонсоры) Начните изучать Python с помощью DataCamp’s бесплатный вводный курс по Python.Изучите науку о данных, выполняя интерактивные задания по кодированию и просматривая видео опытных инструкторов. Начинай сейчас!