12 красивых ОДНОСТРОЧНЫХ конструкций на Python - сделай свой код конфеткой!

Поділитися
Вставка
  • Опубліковано 22 тра 2024
  • Мой курс «Хардкорная веб-разработка» - course.to.digital
    Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
    Telegram: t0digital.t.me
    Сказать спасибо за это видео можно здесь - boosty.to/digitalize.team
    Python - язык лаконичный, его любят за выразительность и читаемый код. Изучи эти 12 однострочных конструкций Python и применяй их в своих проектах, сделай код конфеткой!
    PDF шпаргалка, которую можно распечатать и держать перед глазами: to.digital/s/12-python-onelin... - цветная версия
    to.digital/s/12-python-onelin... - чёрно-белая версия
    0:00 - Введение
    0:54 - 1. Распаковка
    3:00 - 2. map вместо цикла
    5:20 - 3. reduce вместо цикла
    8:58 - 4. Comprehensions вместо цикла
    11:34 - 5. filter вместо цикла или comprehensions
    14:36 - 6. Быстрое копирование списка
    17:07 - 7. Обратить список
    18:03 - 8. in вместо if
    19:55 - 9. all вместо сложного if
    21:53 - 10. any вместо сложного if
    22:37 - 11. Тернарный оператор вместо многострочного кода
    24:20 - 12. Конфигурирование
    /****************** about ******************/
    Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
    - Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
    - Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
    Если у вас есть проект на разработку, пишите нам на hi@digitalize.team.
    С другими предложениями, а также если вам нужна одна или несколько индивидуальных консультаций/уроков по разработке (3000 руб/час), пишите мне на alexey@salesbeat.pro.
    Telegram канал - t.me/t0digital
    ВК - digitalize.team
    RuTube - rutube.ru/channel/24802975/ab...
    Дзен - dzen.ru/id/6235d32cb64df01e6e...

КОМЕНТАРІ • 664

  • @t0digital
    @t0digital  2 роки тому +39

    Подготовили PDF шпаргалку, которую можно распечатать и держать перед глазами, чтобы быстрее всё запомнить:
    to.digital/s/12-python-oneliners.pdf - цветная версия
    to.digital/s/12-python-oneliners-wb.pdf - чёрно-белая версия
    Мой курс «Хардкорная веб-разработка» - course.to.digital
    Вжух!

    • @salmanchik1
      @salmanchik1 Рік тому +1

      19:28 Чувак, ударение в слове красивее поставил слегка неправильно. А так очень познавательный выпуск.

    • @indravishnu2387
      @indravishnu2387 Рік тому

      Красавчик ! но шпаргалка в формате txt честно не хватает )) !!!!

  • @jornand123
    @jornand123 2 роки тому +148

    Относительно .split есть неточность: split() и split(" ") - не одно и то же. split() для разделения использует не только пробел, но и все whitespace символы, например, таб, а также последовательность таких символов рассматривается как один - сплитятся слова независимо от кол-ва пробелов между ними. split(" ") сплитит строго по одиночным пробелам

    • @Pafel0684
      @Pafel0684 Рік тому

      Результат то одинаковый?

    • @user-dd1di2fv6i
      @user-dd1di2fv6i Рік тому +9

      @@Pafel0684 нет )

    • @frand2158
      @frand2158 Рік тому

      Насчёт множественных пробелов: split(' ') делает также

    • @ivanivanovich975
      @ivanivanovich975 Рік тому +6

      @@frand2158 нет

    • @barbosspirat
      @barbosspirat 6 місяців тому

      ​@@Pafel0684пример: "товар\tяблоко".split() = [товар, яблоко] та же строчка только теперь с split(" "), мы получим [товар\tяблоко]

  • @flashxl555
    @flashxl555 2 роки тому +221

    Нужно добавить, что копирование
    вида L2 = L[:] является поверхностным копированием, а не полным. Это значит, что если есть вложенные в список структуры, например: ещё один список или словарь - то могу возникнуть проблемы. В таких случаях нужно использовать функцию deepcopy из модуля copy.

    • @coppolos
      @coppolos 2 роки тому +11

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

    • @user-om9sf3fi6u
      @user-om9sf3fi6u 2 роки тому +13

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

    • @valarg5756
      @valarg5756 2 роки тому +3

      Полностью согласен, тоже смотрел об этом подумал

    • @AJIagguH
      @AJIagguH 2 роки тому +1

      а если вызвать метод copy() ?

    • @flashxl555
      @flashxl555 2 роки тому +5

      @@AJIagguH Если взять L.copy() - это будет эквивалентно L[:]

  • @sergepodkolzin1004
    @sergepodkolzin1004 2 роки тому +59

    Не, ну когда reduce добавили с лямбдой, уже усложнено для восприятия, лучше отдельной строкой это делать. Явное лучше неявного или как там в дзене...

    • @user-sl5lc8xx4q
      @user-sl5lc8xx4q 2 роки тому +1

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

    • @doltramir
      @doltramir Рік тому +3

      Вместо лямбды с reduce:
      from math import prod
      volume = prod(map(int, input().strip().split()))

  • @ssatskov
    @ssatskov 2 роки тому +55

    Крутое видео, подача как всегда на уровне!
    НО
    Думаю, нужно было бы добавить про:
    1. * в разделе про распаковку
    2. copy, deepcopy
    3. прекрасное нововведение py3.8 - walrus operator
    4. _ в роли улучшения читаемости кода, когда значение не нужно, т.е.:
    for _ in range(10):
    pass
    5. _ в роли разделителя для больших чисел:
    for _ in range(1_000_000):
    pass
    *ну а вообще в таких случаях лучше писать 10**6
    Спасибо за то, что ты делаешь
    Один из немногих качественных каналов в ру сегменте

    • @SemyonKalyakulin
      @SemyonKalyakulin 2 роки тому +1

      py - python ?:)

    • @nataliepodgainova6582
      @nataliepodgainova6582 Рік тому

      Спасибо мне было очень полезно, 3-5 вообще не знала

    • @shadowraze6928
      @shadowraze6928 6 місяців тому

      еще можна 10e6, число после `e` - количество нулей

  • @kryzh_kit
    @kryzh_kit 2 роки тому +12

    Хоть и всё изложенное использую, но с удовольствием посмотрел ролик, подача шикарная!)

  • @alittlemoron4068
    @alittlemoron4068 2 роки тому +33

    16:56 только что проверил данный код. На самом деле, это обычный аналог copy.copy функции, которая копирует не объект полностью, а лишь его структуру. Т.е. в случае, если ваш список будет многоуровневым (список в списке), то при изменении внутреннего списка, эти изменения отразятся и на скопированном списке.
    Так что если нужно железобетонно скопировать список как полностью новый объект, то лучше воспользоваться функцией из модуля copy deepcopy.

    • @Max-fr3xv
      @Max-fr3xv 2 роки тому +4

      +

    • @PythonDevelopment
      @PythonDevelopment 2 роки тому +1

      Ну это понятно и так. Не зря же deepcopy придумали. А срезы как быстрый и элегантный способ работы со списками, кортежами.

  • @helish_88
    @helish_88 2 роки тому +30

    только сейчас понял как работает map, про reduce не знал, спс за видео, как всегда топ

  • @ivanivanov-hl7ry
    @ivanivanov-hl7ry 2 роки тому +27

    Первый пример:
    А можно ведь и без .strip() обойтись, так как без параметров он убирает только whitespaces, а .split() по умолчанию с краёв их тоже уберёт. Т.е. для решения этой же задачи можно просто input().split()

    • @grieverrr
      @grieverrr 2 роки тому +2

      эта история работает только пробельного разделителя, если ты сплитнешь по запятой строку вида a = ", asd , ggg, rrrr , f, j" то пробелы с краев никуда не денутся. поэтому лучше сразу привыкать всегда делать стрип после сплита.

  • @alexanderkramskoy7701
    @alexanderkramskoy7701 Рік тому +1

    Очень доходчиво и познавательно! Спасибо!

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw 22 дні тому

    Алексей, спасибо! Долго держал видео в закладках. В итоге, когда сейчас посмотрел, то всё уже знаю. Но, подача, как всегда, отличная. Спасибо ещё раз! Ждём новых подобных видео!

  • @bernardsoul8936
    @bernardsoul8936 Рік тому +1

    Очень полезное, а главное понятное видео, спасибо большое!

  • @user-ey4qp4mq4q
    @user-ey4qp4mq4q 2 роки тому

    Коротко, ясно, без воды 👍

  • @vachapoluk9035
    @vachapoluk9035 2 роки тому

    Очень спасибо за формат таких видео!!

  • @astoscope
    @astoscope 2 роки тому +97

    Так то можно и целиком модули/скрипты/программы упихивать в одну строку, но имхо, читаемость кода значительно выше в большинстве случаев, когда кодер не поленился и написал в несколько строк каждое действие пошагово, а не запихнул миллион действий в одну строку, действия в которой выполняются теперь и не слева направо и не справа налево, а в порядке, индивидуальном для каждого случая.
    Что такое x * y * z понятно сразу, а редьюс от принципиально неименуемой функции и мапа с данными, которые хз какие они там придут вообще - это нифига без пузыря и не разберешься, нафига оно нужно тут

    • @bari_grey_woolf_6988
      @bari_grey_woolf_6988 2 роки тому +2

      пиши машинный код, будет понятно

    • @pavelgushchin2223
      @pavelgushchin2223 2 роки тому +19

      @HoroscopeVideo - Гороскоп на сегодня Единственный здравый комментарий. Без мата на его редьюс невозможно смотреть

    • @magomedmagomedov9168
      @magomedmagomedov9168 2 роки тому +16

      Ну когда переменных 2-3 то конечно лучше не использовать reduce, но если их 30-40, то reduce смотрится уже привлекательнее

    • @reaexp
      @reaexp 2 роки тому

      уроки Python бесплатно - ua-cam.com/video/TPFQkLlbs4o/v-deo.html

    • @gauss_gun
      @gauss_gun Рік тому +3

      Так цель видео в первую очередь обучить этим фичам, а не научить пихать всё в одну строку. Всегда полезно знать, как можно сделать, чтобы применить часть знаний в нужном месте правильно.

  • @cbrnt4157
    @cbrnt4157 2 роки тому

    Декларативный способ подстановки функции супер! Решил проблему, над который давно думал. Спасибо, Алексей!

  • @igorratnik2357
    @igorratnik2357 2 роки тому +1

    Спасибо Добрый человек. На степике прохожу 2 курс по пайтон поколение питон для продвинутых, на будущее присматриваю, чем продолжить. Увидел ваш курс. Добавил в закладочки. По строчным выражениям очень удобная штука, особенно циклы в них, в том числе вложенные.

  • @romanrrv
    @romanrrv 2 роки тому

    Спасибо! Классный туториал получился!

  • @noookm
    @noookm 2 роки тому +1

    Очень круто, очень полезно. Спасибо 👍 большое

  • @gatapov
    @gatapov 2 роки тому +1

    Очень хорошая и понятная подача материала, спасибо! Можете сделать видео о Django signals?

  • @alexbokuto5353
    @alexbokuto5353 2 роки тому +1

    Спасибо! Очень полезно и понятно!

  • @user-sn1qp2xq8l
    @user-sn1qp2xq8l 2 роки тому

    Cпасибо! Очень полезно и наглядно!

  • @user-if1dj7fy2y
    @user-if1dj7fy2y Місяць тому

    Чудесно звучит🎉❤ а Когда же будет продолжение этой темы разговора😊

  • @zaicevIT
    @zaicevIT Рік тому

    Огромное спасибо за работу, очень полезный видос🤝

  • @vitalik100500q
    @vitalik100500q 2 роки тому +2

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

  • @alexeisafronov6627
    @alexeisafronov6627 2 роки тому +1

    Классный урок!
    Круто было бы послушать про протоколы!

    • @reaexp
      @reaexp 2 роки тому

      уроки Python бесплатно - ua-cam.com/video/TPFQkLlbs4o/v-deo.html

  • @Dmitriy777JF
    @Dmitriy777JF 2 роки тому

    Спасибо за конфигурационный словарь!

  • @nitproject5193
    @nitproject5193 2 роки тому +13

    8:20 попався джсер)

    • @t0digital
      @t0digital  2 роки тому +6

      да вот задолбали они, не могли хотя бы синтаксис комментариев во всех ЯП сделать однородным:)

    • @RuslanKovtun
      @RuslanKovtun 2 роки тому

      @@t0digital так в питоне комменты как в bash, он ведь с ним конкурировал изначально.

  • @yariktyrykin3393
    @yariktyrykin3393 2 роки тому +1

    Возможно стоило также рассказать помимо словарей конфигурации и о существовании ConfigParser'а, все-таки сохранять конфиги нужно также и в моменты "простаивания" программного продукта

  • @SamSafonov
    @SamSafonov Рік тому

    Алексей, спасибо за видео!

  • @AlexandrSpb
    @AlexandrSpb 3 місяці тому

    Очень полезное видео, спасибо!

  • @Ruslantuber
    @Ruslantuber 2 роки тому +1

    Супер полезно! №8 и №11 сразу забрал в свой скрипт. Знал, что как-то лаконичнее можно, но не знал как.

  • @sevashpun
    @sevashpun 2 роки тому

    Отличный урок! Респект!

  • @daryamachigina157
    @daryamachigina157 Рік тому

    Как вы красиво все объясняете 😌😃

  • @IgnatikVodichka
    @IgnatikVodichka 2 роки тому +1

    Крутая рубрика. Оч крутая. Такого бы по чаще.

  • @Hardy_21
    @Hardy_21 4 місяці тому

    Братан как же приятно тебя слушать, очень позитивный чувак. За пять лет от галер до крупных банков ни одного хорошего человека на сеньере не встретил. 90 процентов это пассивно-агрессивные, злые, но трусливые шавки нолайферы, которые в технологиях сами еле-еле разбираются. Братан, есть у тебя команда? Я бы с удовольствием поработал с тобой.

  • @URich87UA
    @URich87UA 2 роки тому

    супер, спасибо) очень познавательно)

  • @alexandertomilov6165
    @alexandertomilov6165 2 роки тому +2

    💯 ТОП!🔥 Сделай пожалуйста PDF: было/ стало, чтобы все могли скачать и было всегда перед глазами.

    • @t0digital
      @t0digital  2 роки тому +1

      Отличная мысль, сделаем!

  • @codelearner1713
    @codelearner1713 2 роки тому +6

    Видео хорошее, но важно помнить, что коротко, не всегда красиво и читаем. И автор говорит об этом. Не забывайте про pep8

  • @andruhaz
    @andruhaz 2 роки тому

    Отличное видео, можно сделать серию таких?

  • @MrPavelFrolov
    @MrPavelFrolov 2 роки тому

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

  • @alexandrunknown1456
    @alexandrunknown1456 2 роки тому +1

    Вот таких видосов бы больше

  • @michaelhin2290
    @michaelhin2290 2 роки тому

    Спасибо большое, отличное видео!
    Если бы ещё по golang'у кто-то такое снимал

  • @Michael201078
    @Michael201078 2 роки тому +1

    Мегаполезная подборка. Огромнейшее спасибо!

  • @vladimir_s1961
    @vladimir_s1961 2 роки тому +5

    Из серии "хозяйке на заметку" - просто, легко, красиво. Приятно слушать человека, который знает, о чем говорит. Спасибо!

  • @iamzeus1250
    @iamzeus1250 2 роки тому

    Спасибо большое!

  • @nikitainiciative356
    @nikitainiciative356 2 роки тому

    крутое видео, классно понимать, что о мапе я узнал раньше (вчера)

  • @C0oo1D
    @C0oo1D 2 роки тому

    Сразу зачесалось дополнить))
    3. читаемее mul вместо lambda, вообще лямбды стараюсь использовать по минимуму:
    from operator import mul
    volume = reduce(mul, map(int, input().strip().split())
    5. Вот функциональная часть в питоне порой подбешивает.. Хотел бы я написать вот так, но не выйдет:
    tuple(filter(str.startswith('A'), names))
    Нужно дополнительно усложнять т.к. по простому объект не передать, а магию передачи уже забыл (есть что-то встроенное, но с ним выглядит насколько я помню хуже чем с лямбдой), потому часто проще и читаемее использовать comprehensions.
    12. Смело как то) Я бы сделал так:
    def fallback(user, request):
    print(f'Not exists group provided: {user.group}') # logging.error is better
    group_to_process_method.get(user.group, fallback)(user, request)

  • @AntThinker
    @AntThinker 2 роки тому +12

    16:20 Кажется мне, что list(numbers) более читаемо, чем нецелево использованный слайс. И с разворотом то же самое -- есть reversed(). А вообще норм!

    • @huseeads
      @huseeads 2 роки тому

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

  • @vladimirtalpa5390
    @vladimirtalpa5390 2 роки тому +2

    Смотрю уже в середине ролика и думаю, надо бы написать, чтобы снял про замену if_else на dict_get - а в конце финальный аккорд как раз об этом. Молодец! Крутой мануал для джунов - ведь на собесех постоянно спрашивают об этих фишках.
    Такой же ролик стоит снять про:
    @staticmethod
    @classmethod
    @dataclass
    про использование абстрактных классов
    про синглтоны
    про конечные автоматы или машины состояний

    • @vladimirtalpa5390
      @vladimirtalpa5390 2 роки тому

      а ещё очень крутая штука это @context. Ее как раз используют в машине состояний , но и не только

  • @cryptoworkdonkey
    @cryptoworkdonkey 2 роки тому

    Спасибо за хаки. Компрехеншны удобны. К обработке текста нужно привыкнуть.
    Например в R фильтрация идёт грепом:
    names = c('Хри', 'Аде', 'Тэя', 'Сте', 'Арх')
    grep("^А", names, value = TRUE)
    или конвейером:
    names %>% grep ("^А", ., value = TRUE)
    И в ифчиках/фильтрах есть булевый grepl(). Вот прям оч удобно.

  • @deve1oper
    @deve1oper Рік тому

    Ну довольно простые приемы, все их я уже знал, кроме последнего, но там можно логически додуматься, хорошо зная питон, однако материал клевый, подача супер, все быстро, наглядно, с объяснениями, супер!

  • @sergv4782
    @sergv4782 2 роки тому

    Спасибо, полезно)

  • @user-hj6oh4bw3n
    @user-hj6oh4bw3n 2 роки тому +2

    Вместо последнего пункта напрашивается создать Интерфейс Group, от которого будут наследоваться AdminGroup, ManagerGroup и т.д. Они будут по разному определять метод process_request.Тогда вместо стринга можно в конструктор User передать Request через интерфейс

  • @clauseclause6640
    @clauseclause6640 2 роки тому +2

    Сразу лайк =) ну и...
    вкусовщина конечно, но вместо lambda x, y: x * y можно использовать operator.mul
    а по последнему имхо наглядней Enum ну и можно через f-строку красиво сделать, например если это методы класса - getattr(self, f"process_{user.group}_request")(user, request)

    • @reaexp
      @reaexp 2 роки тому

      уроки Python бесплатно - ua-cam.com/video/TPFQkLlbs4o/v-deo.html

  • @Yarikorg
    @Yarikorg 2 роки тому

    Хорошее видео, спасибо.
    Так глядишь, мне Пайтон зайдет и начну его использовать.
    Много от Перл там вижу. Не знаю что раньше появилось.

  • @goodgriefwhatarelief8899
    @goodgriefwhatarelief8899 2 роки тому

    Очень круто, спасибо

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov Рік тому

    Алексей, благодарю += 1000 !!

  • @vladimirprin263
    @vladimirprin263 Рік тому

    многое знал, но пару фишек утащу, спасибо)

  • @eugene1079
    @eugene1079 2 роки тому

    Спасибо, видео "пушка". А что за книга была на столе в этом видео?

  • @maximshumilo3728
    @maximshumilo3728 2 роки тому +1

    Все супер, в эффективности и читаемости не везде конечно соглашусь, но в целом большинство «приемчиков» достаточно хорошо упрощают читаемость кода.
    А будут ли какие-то более продвинутые темы?

  • @rinaatt
    @rinaatt Рік тому

    Недавно вывел для себя такой однострочник.
    Допустим есть такая структура:
    dataset = [{'a': 1, 'b': 2}, {'a': 11, 'b': 12}, {'a': 21, 'b': 22}, {'a': 31, 'b': 32}]
    и например нужно взять `b`, где `a` == 21:
    b = next(item['b'] for item in dataset if item['a'] == 21)

  • @Namynnuz
    @Namynnuz Рік тому

    Лямбды выглядят чуждо для семантики языка. В шарпее с LINQ с этим всем гораздо лучше:
    6:58 int volume(string input) => input.Split(' ').Select(int.Parse).Aggregate((a, b) => a * b);
    12:34 List filter(string[] input, string prefix) => input.Where(o => o.StartsWith(prefix)).ToList();
    В случае с in это .Contains(), аналогичные .All() и .Any() так же имеются.
    При том, что это всё просто extension methods по IEnumerable.

  • @ONYX_RU
    @ONYX_RU 2 роки тому +1

    Я заговнокодил первый вариант без дополнительных библиотек и чисто в одну строку)):
    for num in [input().split() for x in range(1)]:print(int(num[0])*int(num[1])*int(num[2]))

  • @valarg5756
    @valarg5756 2 роки тому +22

    В последнем примере с условиями думал нововведение switch и case сейчас покажешь,ан нет, на деле другое исполнение донес :) спасибо, не знал

    • @C0oo1D
      @C0oo1D 2 роки тому +2

      Он же вроде в 3.10, а тут 3.9 =)

    • @user-ot5iy5es4l
      @user-ot5iy5es4l 2 роки тому

      вообще не вижу какой то пользы от match,
      передаёшь функции объект, а далее кейсы перехватывают.Всё то же самое можно реализовать условиями.

    • @andreiosipov2766
      @andreiosipov2766 2 роки тому +2

      @@user-ot5iy5es4l если у тебя более одного elif, то ты движешься куда-то не туда)

    • @user-ot5iy5es4l
      @user-ot5iy5es4l 2 роки тому +1

      @@andreiosipov2766 это откуда ты такое взял что elif нельзя употреблять более раза?другое дело если else более раза

    • @andreiosipov2766
      @andreiosipov2766 2 роки тому

      @@user-ot5iy5es4l ты профессиональный разработчик? Работаешь с другими людьми, проходишь код-ревью?

  • @user-tl8gn9yg1b
    @user-tl8gn9yg1b 2 роки тому +4

    24:20 - гораздо эффективнее в таких случаях прибегнуть к полиморфизму.
    Спасибо за видео!

  • @user-bv4mh7xb2p
    @user-bv4mh7xb2p 2 роки тому

    print('Василий' if 'Василий' in ('Христофор','Василий') else '')
    Таким образом можно сократить условие и вывод до одной строчки.Блок else в данном случае обязательный (тут он просто выведет пустую строку если нашего имени не обнаружилось в кортеже)

  • @alexsukhykh5666
    @alexsukhykh5666 2 роки тому +2

    Спасибо за all, any. ))

  • @hinomuratomisaburo4901
    @hinomuratomisaburo4901 2 роки тому

    ого крутой контент ! класс

  • @amigo4884
    @amigo4884 2 роки тому

    Привет! Большое спасибо за видео. Не так давно ты говорил, что там, где требуется быстродействие код пишется на Go или на C/C++. У меня вопрос: чистый C жив в веб-разработке?

    • @t0digital
      @t0digital  2 роки тому +1

      Привет! Не могу сказать про C/С++, так как не слежу за ними. Думаю, что какие-то хардкорные вещи под нагрузку пишутся на С или C++, но в будущем Rust их вытеснит в таких нишах.

    • @SantaCluster
      @SantaCluster 2 роки тому

      интересно, а вытеснит ли Rust парочку C/C++ совсем? (для новых проектов, исключая имеющееся наследие)

  • @furiousangel256
    @furiousangel256 2 роки тому +1

    Такой код выглядит приятно для глаза и экономит место. Вот только читабельным он является только для того, кто знает эти фишки. Например, если бы я до этого видел увидел конструкцию [::-1] я бы во-первых не понял, что тут вообще происходит, а во-вторых засомневался бы - работает ли оно вообще? Спасибо за интересные фишки конечно, но я лучше потрачу 2-3 строчки кода и опишу последовательность действий в явном виде. Надеюсь мой неведомый потомок скажет мне спасибо :-)

  • @user-ir2qw1nt8z
    @user-ir2qw1nt8z 2 роки тому

    Интересное видео, особенно для того, кто только знакомится с python

  • @mykolakudinov4403
    @mykolakudinov4403 2 роки тому +2

    Конфигурационный словарь нужно будет согласовывать со списком типов пользователя. Этот вопрос будет решён если вместо строки использовать dataclass(name: str + process_request: Callable) как аргумент __init__ . В таком случае мы можем спрятать вызов process_request с user как аргумент внутри функции класса User.

    • @mykolakudinov4403
      @mykolakudinov4403 2 роки тому

      Опять таки знаю об этом я только благодаря твои предыдущим роликам

  • @user-bi8ed5gs1r
    @user-bi8ed5gs1r Рік тому

    Спасибо!

  • @user-fd7ce2em5y
    @user-fd7ce2em5y Рік тому +7

    Видос супер. Бомбезные штуки показаны. Даже знаю где можно в моих проектах это могло бы заменить мой говнокод. Я в python новичок и выглядит всё это очень понятно и внятно, во многом благодаря подаче автора. Выражаю большую благодарность за столь мощный подход к созданию контента.

    • @pythonofsky4545
      @pythonofsky4545 Рік тому +1

      Думаешь, если ты пишешь по другому, например, перебор в цикле вместо in то твой код уже говнокод? Эти фишки только для профи, которые фигачат на питоне по 8 часов в день и так забадываются, что быстреев одну строку написать, чем цикл или функции расписывать. А на самом деле классический вид и работает быстрее, и читается лучше. Сам иногда грешу всякими тернарниками и лямбдами, а потом мой код никто понять не может... ))

    • @user-fd7ce2em5y
      @user-fd7ce2em5y Рік тому

      @@pythonofsky4545 нет, думаю если ты не знаешь синтаксические и общепринятые конструкции, то собираешь велосипед, у которого и педали крутить сложно и руль фиг пойми как работает и колёса в разные стороны крутятся. Ясно правило "Нормально делай - нормально будет", но иногда из-за не знания особенностей различных инструментов лепишь фиг пойми какую чушь. И я тоже за понятный код, но в некоторых моментах всё-таки стоит использовать лаконичные подходы, которые и читаются просто, если знать язык, и не загромождают код ненужной белибердой.

  • @RuslanKovtun
    @RuslanKovtun 2 роки тому +1

    6:30 - `from operators import mul` и не надо лямбду писать, ну или `int.__mul__` но это больше текста и читабельность падает.

  • @user-so6rz7bz1m
    @user-so6rz7bz1m 6 місяців тому

    map принимает последовательность вторым аргументом, это ведь несовсем правда, map iterable принимает, это более широкий интерфейс, а sequence это более узкий интерфейс, он iterable (__iter__), sized(__len__) и container(__in__), iterable это может быть и генератор и сопрограмма (Coroutine)
    это я не поумничать пишу просто мне кажется важным различать ту самую утиную типизацию, где какой минимальный интерфейс необходим, ну и это помогает точно хинты писать, где что надо
    за материал, большое спасибо, очень полезно

  • @user-qt4gz1dl6w
    @user-qt4gz1dl6w 2 роки тому

    Было бы круто если ты бы сделал обзор всей библиотеки functools, там же не один метод reduce?

  • @viktorh71
    @viktorh71 Рік тому

    Офигенно!

  • @Darqsatyricon
    @Darqsatyricon 2 роки тому +1

    Интересно псмотреть на покрытие юнит тестами при любви к однострочкам... И что-нибудь услышать про maintainability кода где в одну строку выполняется сразу несколько операций. Ты, наверное, сознательно опустил процесс валидации инпута в первом примере и любой еррор хендлинг. Вобщем, чёт я ожидал большего. Больше выглядит как студенческий код для фриланса нежели продакшн код с какого то нормального проекта или энтерпрайза.

    • @t0digital
      @t0digital  2 роки тому

      Вот это - нечитаемо:
      numbers = map(int, input().split())
      А вот так - песня:
      input_string = input()
      input_word = input.split()
      first_word = input_elements[0]
      second_word = input_elements[1]
      first_number = int(first_word)
      second_number = int(second_word)
      numbers = (first_number, second_number)
      Ну ок:)

  • @user-iu6xg8wo8l
    @user-iu6xg8wo8l 2 роки тому

    Думал, что все уже знаю, но узнал про any и all только сейчас, спасибо за видос

    • @kai.hexendorf
      @kai.hexendorf Місяць тому

      Так в нормальных языках люди смотрят в спецификацию коллекции и обнаруживают у неё все необходимые функциональные методы filter, map, all, every... А в python перевернули всё с ног на голову, и поэтому чтобы узнать о существовании глобальных методов all, any, должно снизойти свыше.

  • @t0digital
    @t0digital  2 роки тому +43

    Вопрос не по теме - а как вам картинка:)?

    • @i17talk8
      @i17talk8 2 роки тому +2

      и звук ничо. Новая камера?

    • @vlightendy2539
      @vlightendy2539 2 роки тому +2

      Wow 😍

    • @m_kovalenko
      @m_kovalenko 2 роки тому +2

      Пожалуйста, делай отступы когда показываешь IDE. Из-за элементов интерфейса ютуба не видно код

    • @sw1881
      @sw1881 2 роки тому

      круто все!

    • @t0digital
      @t0digital  2 роки тому +3

      @@m_kovalenko отступы от краёв экрана, чтобы код не прилипал к краям экрана?

  • @vol1ura
    @vol1ura 2 роки тому

    На Ruby это можно записать ещё короче )) и даже импорт делать не придётся. Например,
    volume = gets.strip.split.map(&:to_i).reduce(&:*)
    А последний пример, который здесь показан и занимает 5 строчек (ну или 2 но очень длинные), можно записать
    self.send "process_#{user.group}_request".to_sym user request

    • @palyaros02
      @palyaros02 Рік тому

      последний пример тоже можно оптимизировать разными способами до состояния одной короткой строчки. Например, использовать eval, магические методы или сделать декоратор. Автор просто не стал идти в такие дебри.

  • @user-oe5ok3sj4q
    @user-oe5ok3sj4q Рік тому

    К сплиту лепить стрип не надо, т.к. сплит уже убрал лишние пробелы. Такая конструкция может применяться в случае если мы в сплит передаем аргумент с конкретным разделителем.
    Срезы не изменяют список, т.е. конструкция список[::-1] просто возвращает список в обратном порядке, список при этом остался в первоначальном варианте. Для того чтобы развернуть список используется reverse().

  • @molodoi_d
    @molodoi_d 2 роки тому

    Мне кажется, в последнем примере удобнее использовать метод get, для обработки случаев выхода за границы ключей за счёт дефолтного значения

  • @gustaugutter9477
    @gustaugutter9477 2 роки тому +2

    *тидимс*
    И вот я оставил комментарий в поддержку отличного контента)

  • @drdrdr6835
    @drdrdr6835 2 роки тому +5

    То чувство что сначала сам решал задание а потом смотрел пример, почти все аналогично сделал🤔

  • @13danyocean13
    @13danyocean13 2 роки тому +1

    О теме с конфигурацией: кроме простой и pythonic конструкции мы также получим сложность O(1), вместо O(n)(при реализации c кучей elif).

    • @reaexp
      @reaexp 2 роки тому

      уроки Python бесплатно - ua-cam.com/video/TPFQkLlbs4o/v-deo.html

  • @Monte_Cristo_R
    @Monte_Cristo_R 2 роки тому +1

    Подскажите , почему цену на курс подняли с 20 до 30 ? Посчитали что цена низкая(конечно это дело автора , и я не с целью упрекнуть , но просто интересно откуда такое ценообразование и повышение на 1/3)? Получается примерно те первые 250-300 человек кто приобрёл курс успели и им повезло ? И значит ли это что в будущем цена ещё вырасти может и на сколько ?

  • @DmitryKravchyna
    @DmitryKravchyna 2 роки тому +1

    Первая задача в одну строку))
    print(*[x * y * z for x, y, z in [map(int, input().split())]])

  • @serhiiriznychenko4108
    @serhiiriznychenko4108 2 роки тому

    Если кому интересно, вот как первая функция будет выглядеть на языке scala:
    input.trim.split(" ").map(_.toInt).product

  • @mrmedbedb1256
    @mrmedbedb1256 Рік тому

    list comps, dict comp, gen exp это убойные инструменты питониста.
    В сочетании с тернарным оператором вообще на глушняк :)

  • @daniilpopkov4176
    @daniilpopkov4176 2 роки тому +1

    По поводу пункта 6, будьте внимательны, это поверхностное копирование.
    Если вам нужно полное используйте deepcopy

  • @user-di7gx3rc2q
    @user-di7gx3rc2q 2 роки тому

    Про all есть нюанс. В случае перечисления через and проверка остановится, как только встретит первый False. В случае с all будут проверены все элементы. То есть перечисление через and хоть и не такое красивое, но более эффективное.

    • @andrew_z.
      @andrew_z. 2 роки тому +1

      тут дело не в all.
      all тоже не будет все элементы проверять, если это не нужно:
      all((print(i) or i

  • @bulhi
    @bulhi 2 роки тому +1

    Знаешь, спасибо тебе
    Когда-то давно я просто смотрел твои видосы, ничего не понимал
    Потом через время начал учиться жабускрипт, и спустя пол года устроился
    Сейчас, спустя 8 месяцев работы, являюсь мидл фулстак разрабом, с зп в 200 рублей
    Недавно увидел первый лям, и задумался с чего все начиналось и твой видос с реки попал, и все сошлось
    Спасибо!!

    • @bulhi
      @bulhi 2 роки тому

      Update: плюс ко всему мне 19)

  • @alexenderius
    @alexenderius Рік тому +1

    Предостережение автору. Упрощая, слово group произносится как /груп/. Если произносить /гроуп/, получается слово grope с совсем другим значением, возможно нежелательным в образовательном видео

  • @mrpisarik
    @mrpisarik 2 роки тому

    07:44 вместо лямбды можно передать operator.mul, где operator - это стандартный пакет в питоне

  • @vovchic3593
    @vovchic3593 Рік тому

    С объёмом можно вообще так написать
    print(*[x*y*z for x, y, z in [map(int, input().split())]])

  • @nitroflap
    @nitroflap 2 роки тому +2

    Большинство я уже знаю, но все таки, довольно много интересного узнал. Классно! А все таки... когда будет Go...?

    • @t0digital
      @t0digital  2 роки тому +9

      Возможно будет раст вместо го:)

    • @nitroflap
      @nitroflap 2 роки тому

      @@t0digital А почему? Гошка же лучше для веба :O

    • @t0digital
      @t0digital  2 роки тому +1

      Пока не сложил для себя однозначного мнения по этому поводу. Go проще, это факт, но простота это не всегда лучше

    • @user-lh6ou6de6l
      @user-lh6ou6de6l 2 роки тому +3

      @@t0digital вау раст! Слышал много хорошего, было бы интересно

    • @t0digital
      @t0digital  2 роки тому +3

      вот и мне интересно, изучаю

  • @0range2un
    @0range2un 2 роки тому

    Крутяк, спасибо, собрание классных фишек в одном видео с простыми примерами.
    Я бы еще добавил насчет генераторов:
    my_list = (x for x in range(30000000))
    my_list1 = [x for x in range(30000000)]
    Теперь, если обходить в цикле первую конструкцию, затраты по памяти составят 17 Мб, а если вторую, то больше 1 Гб

    • @WorldCount
      @WorldCount 2 роки тому

      А если обходить итератор?

    • @user-zk3uo3ti6f
      @user-zk3uo3ti6f 2 роки тому

      Так он сказал в видео, что кортежи эффективнее по памяти и нужно их использовать, везде где не требуется, дальнейшее изменение данных

    • @Max-fr3xv
      @Max-fr3xv 2 роки тому +1

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

    • @Max-fr3xv
      @Max-fr3xv 2 роки тому +1

      если попробовать обратиться к генератору и сказать ему допустим my_list[5], то он выбросит ошибку, так как генератор не знает, какое число там будет, до данного числа нужно итерироваться. А в случае my_list1[5] будет выдано число

    • @Max-fr3xv
      @Max-fr3xv 2 роки тому +1

      мои познания могут быть не совершенны, так что сорян если что :)