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

แชร์
ฝัง
  • เผยแพร่เมื่อ 31 พ.ค. 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...

ความคิดเห็น • 668

  • @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 ปีที่แล้ว +153

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

    • @Pafel0684
      @Pafel0684 ปีที่แล้ว

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

    • @user-dd1di2fv6i
      @user-dd1di2fv6i ปีที่แล้ว +10

      @@Pafel0684 нет )

    • @frand2158
      @frand2158 ปีที่แล้ว

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

    • @ivanivanovich975
      @ivanivanovich975 ปีที่แล้ว +7

      @@frand2158 нет

    • @barbosspirat
      @barbosspirat 7 หลายเดือนก่อน

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

  • @flashxl555
    @flashxl555 2 ปีที่แล้ว +224

    Нужно добавить, что копирование
    вида 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 ปีที่แล้ว +60

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

    • @user-sl5lc8xx4q
      @user-sl5lc8xx4q 2 ปีที่แล้ว +1

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

    • @doltramir
      @doltramir 2 ปีที่แล้ว +3

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

  • @Hardy_21
    @Hardy_21 4 หลายเดือนก่อน +1

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

  • @alittlemoron4068
    @alittlemoron4068 2 ปีที่แล้ว +33

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

    • @Max-fr3xv
      @Max-fr3xv 2 ปีที่แล้ว +4

      +

    • @PythonDevelopment
      @PythonDevelopment 2 ปีที่แล้ว +1

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

  • @ssatskov
    @ssatskov 2 ปีที่แล้ว +57

    Крутое видео, подача как всегда на уровне!
    НО
    Думаю, нужно было бы добавить про:
    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` - количество нулей

  • @astoscope
    @astoscope 2 ปีที่แล้ว +99

    Так то можно и целиком модули/скрипты/программы упихивать в одну строку, но имхо, читаемость кода значительно выше в большинстве случаев, когда кодер не поленился и написал в несколько строк каждое действие пошагово, а не запихнул миллион действий в одну строку, действия в которой выполняются теперь и не слева направо и не справа налево, а в порядке, индивидуальном для каждого случая.
    Что такое 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 бесплатно - th-cam.com/video/TPFQkLlbs4o/w-d-xo.html

    • @gauss_gun
      @gauss_gun 2 ปีที่แล้ว +3

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

  • @ivanivanov-hl7ry
    @ivanivanov-hl7ry 2 ปีที่แล้ว +28

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

    • @grieverrr
      @grieverrr 2 ปีที่แล้ว +2

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

  • @kryzh_kit
    @kryzh_kit 2 ปีที่แล้ว +12

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

  • @helish_88
    @helish_88 2 ปีที่แล้ว +30

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

  • @vachapoluk9035
    @vachapoluk9035 2 ปีที่แล้ว

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

  • @user-ey4qp4mq4q
    @user-ey4qp4mq4q 2 ปีที่แล้ว

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

  • @cbrnt4157
    @cbrnt4157 2 ปีที่แล้ว

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

  • @alexanderkramskoy7701
    @alexanderkramskoy7701 ปีที่แล้ว +1

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

  • @bernardsoul8936
    @bernardsoul8936 ปีที่แล้ว +1

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

  • @romanrrv
    @romanrrv 2 ปีที่แล้ว

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

  • @igorratnik2357
    @igorratnik2357 2 ปีที่แล้ว +1

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

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw หลายเดือนก่อน

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

    • @t0digital
      @t0digital  หลายเดือนก่อน +1

      Спасибооо!

  • @zaicevIT
    @zaicevIT ปีที่แล้ว

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

  • @noookm
    @noookm 2 ปีที่แล้ว +1

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

  • @Dmitriy777JF
    @Dmitriy777JF 2 ปีที่แล้ว

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

  • @user-sn1qp2xq8l
    @user-sn1qp2xq8l 2 ปีที่แล้ว

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

  • @user-if1dj7fy2y
    @user-if1dj7fy2y หลายเดือนก่อน

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

  • @alexbokuto5353
    @alexbokuto5353 2 ปีที่แล้ว +1

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

  • @SamSafonov
    @SamSafonov ปีที่แล้ว

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

  • @AlexandrSpb
    @AlexandrSpb 3 หลายเดือนก่อน

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

  • @gatapov
    @gatapov 2 ปีที่แล้ว +1

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

  • @vitalik100500q
    @vitalik100500q 2 ปีที่แล้ว +2

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

  • @sevashpun
    @sevashpun 2 ปีที่แล้ว

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

  • @yariktyrykin3393
    @yariktyrykin3393 2 ปีที่แล้ว +1

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

  • @IgnatikVodichka
    @IgnatikVodichka 2 ปีที่แล้ว +1

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

  • @AntThinker
    @AntThinker 2 ปีที่แล้ว +12

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

    • @huseeads
      @huseeads 2 ปีที่แล้ว

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

  • @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)

  • @alexeisafronov6627
    @alexeisafronov6627 2 ปีที่แล้ว +1

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

    • @reaexp
      @reaexp 2 ปีที่แล้ว

      уроки Python бесплатно - th-cam.com/video/TPFQkLlbs4o/w-d-xo.html

  • @Ruslantuber
    @Ruslantuber 2 ปีที่แล้ว +1

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

  • @daryamachigina157
    @daryamachigina157 ปีที่แล้ว

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

  • @vladimir_s1961
    @vladimir_s1961 2 ปีที่แล้ว +5

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

  • @URich87UA
    @URich87UA 2 ปีที่แล้ว

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

  • @nitproject5193
    @nitproject5193 2 ปีที่แล้ว +13

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

    • @t0digital
      @t0digital  2 ปีที่แล้ว +6

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

    • @RuslanKovtun
      @RuslanKovtun 2 ปีที่แล้ว

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

  • @codelearner1713
    @codelearner1713 2 ปีที่แล้ว +6

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

  • @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]))

  • @user-hj6oh4bw3n
    @user-hj6oh4bw3n 2 ปีที่แล้ว +2

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

  • @vladimirtalpa5390
    @vladimirtalpa5390 2 ปีที่แล้ว +2

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

    • @vladimirtalpa5390
      @vladimirtalpa5390 2 ปีที่แล้ว

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

  • @vladimirprin263
    @vladimirprin263 ปีที่แล้ว

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

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov ปีที่แล้ว

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

  • @alexandrunknown1456
    @alexandrunknown1456 2 ปีที่แล้ว +1

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

  • @alexandertomilov6165
    @alexandertomilov6165 2 ปีที่แล้ว +2

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

    • @t0digital
      @t0digital  2 ปีที่แล้ว +1

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

  • @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)

  • @michaelhin2290
    @michaelhin2290 2 ปีที่แล้ว

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

  • @eugene1079
    @eugene1079 2 ปีที่แล้ว

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

  • @iamzeus1250
    @iamzeus1250 2 ปีที่แล้ว

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

  • @andruhaz
    @andruhaz 2 ปีที่แล้ว

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

  • @Michael201078
    @Michael201078 2 ปีที่แล้ว +1

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

  • @MrPavelFrolov
    @MrPavelFrolov 2 ปีที่แล้ว

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

  • @deve1oper
    @deve1oper ปีที่แล้ว

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

  • @cryptoworkdonkey
    @cryptoworkdonkey 2 ปีที่แล้ว

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

  • @sergv4782
    @sergv4782 2 ปีที่แล้ว

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

  • @goodgriefwhatarelief8899
    @goodgriefwhatarelief8899 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 ты профессиональный разработчик? Работаешь с другими людьми, проходишь код-ревью?

  • @Namynnuz
    @Namynnuz 2 ปีที่แล้ว

    Лямбды выглядят чуждо для семантики языка. В шарпее с 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.

  • @user-so6rz7bz1m
    @user-so6rz7bz1m 6 หลายเดือนก่อน

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

  • @Yarikorg
    @Yarikorg 2 ปีที่แล้ว

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

  • @maximshumilo3728
    @maximshumilo3728 2 ปีที่แล้ว +1

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

  • @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 бесплатно - th-cam.com/video/TPFQkLlbs4o/w-d-xo.html

  • @furiousangel256
    @furiousangel256 2 ปีที่แล้ว +1

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

  • @VikMoc
    @VikMoc 2 ปีที่แล้ว

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

  • @viktorh71
    @viktorh71 ปีที่แล้ว

    Офигенно!

  • @user-bi8ed5gs1r
    @user-bi8ed5gs1r ปีที่แล้ว

    Спасибо!

  • @mykolakudinov4403
    @mykolakudinov4403 2 ปีที่แล้ว +2

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

    • @mykolakudinov4403
      @mykolakudinov4403 2 ปีที่แล้ว

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

  • @ValeriyM_46
    @ValeriyM_46 6 วันที่ผ่านมา

    это было афуенно!

  • @user-fd7ce2em5y
    @user-fd7ce2em5y 2 ปีที่แล้ว +7

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

    • @pythonofsky4545
      @pythonofsky4545 ปีที่แล้ว +1

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

    • @user-fd7ce2em5y
      @user-fd7ce2em5y ปีที่แล้ว

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

  • @user-iu6xg8wo8l
    @user-iu6xg8wo8l 2 ปีที่แล้ว

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

    • @kai.hexendorf
      @kai.hexendorf หลายเดือนก่อน

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

  • @knarg4682
    @knarg4682 หลายเดือนก่อน

    22:40 тернарный оператор? Наш ответ Чемберлену: logical machine :)
    'abcd' and [] or 'YES' -- что вернёт? Правильно, 'YES'.
    Объясняю. Эти два оператора работают не как такие же команды в бинарной логике, они ничего не "сравнивают" и возвращают ни фига не только True или False, а что душа пожелает, включая запуск команды/выражения на выполнение. Это логические коммутаторы. Принцип работы у обоих одинаковый: они оценивают с точки зрения булевой логики то, что находится у них в левом плече (слева от оператора). Если там триггерное значение -- переключаются на правое плечо, если нет -- возвращают то, что в левом. В обоих случаях именно в том виде, в каком это там находится, никаких изменений.
    Для or триггером является False. То есть само False, ноль, пустая коллекция, пустая строка, None, незапустившийся диапазон range.
    0 or True -> True
    0 or False -> False
    {} or 3 -> 3
    range(0) or ""' -> ""
    False or 0 -> 0
    () or print('abcd') ->>> 'abcd'
    Для and триггером является True, принцип работы тот же самый.
    Если переключения не произошло, то какая бы долгая и громоздкая операция ни была задана в правом плече -- она не запустится. Чередуя andи or, можно создавать довольно сложные и длинные цепочки, всё это добро работает по "ленивому" алгоритму, то есть как только переключения не произошло, выбрасывается содержимое левого плеча несработавшего оператора и на этом цепочка прерывается.
    Возвращаясь к первому примеру: 'abcd' -- это True. Получив его в левом плече, and переключается и передаёт дальше по цепочке пустой список, то есть False. Что является триггером для оператора or. Который поэтому тоже переключается и выдаёт содержимое своего правого плеча, строку 'YES'.
    print(3 + 2) or print('abcd') or print('end') -- запустятся все три принта. Потому что print -- это процедура, она отправила данные в файл "стандартный поток вывода" и вернула None, то есть False, что переключает следующий or, a там опять print...

  • @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)
      Ну ок:)

  • @amigo4884
    @amigo4884 2 ปีที่แล้ว

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

    • @t0digital
      @t0digital  2 ปีที่แล้ว +1

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

    • @SantaCluster
      @SantaCluster 2 ปีที่แล้ว

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

  • @hinomuratomisaburo4901
    @hinomuratomisaburo4901 2 ปีที่แล้ว

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

  • @user-gb4cl5jv8l
    @user-gb4cl5jv8l 2 ปีที่แล้ว

    Спасибо за ролик. В №12 что будет если группы пользователя нету в словаре?

  • @user-bv4mh7xb2p
    @user-bv4mh7xb2p 2 ปีที่แล้ว

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

  • @alexenderius
    @alexenderius 2 ปีที่แล้ว +1

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

  • @bulhi
    @bulhi 2 ปีที่แล้ว +1

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

    • @bulhi
      @bulhi 2 ปีที่แล้ว

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

  • @alexsukhykh5666
    @alexsukhykh5666 2 ปีที่แล้ว +2

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

  • @Monte_Cristo_R
    @Monte_Cristo_R 2 ปีที่แล้ว +1

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

  • @itkrasnodar956
    @itkrasnodar956 2 ปีที่แล้ว

    17:34 ПОДСКАЖИТЕ, а чем плохи методы list.copy() и list.reverse() для копирования списка и переворачивания?

    • @t0digital
      @t0digital  2 ปีที่แล้ว +1

      ничем не плохи

    • @itkrasnodar956
      @itkrasnodar956 2 ปีที่แล้ว

      @@t0digital Спасибо за ответ, а в производительности работы программы, как считаете, какой метод будет лучше?

    • @t0digital
      @t0digital  2 ปีที่แล้ว

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

  • @DmitryKravchyna
    @DmitryKravchyna 2 ปีที่แล้ว +1

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

  • @vovchic3593
    @vovchic3593 ปีที่แล้ว

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

  • @user-tl8gn9yg1b
    @user-tl8gn9yg1b 2 ปีที่แล้ว +4

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

  • @RuslanKovtun
    @RuslanKovtun 2 ปีที่แล้ว +1

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

  • @user-qt4gz1dl6w
    @user-qt4gz1dl6w 2 ปีที่แล้ว

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

  • @drdrdr6835
    @drdrdr6835 2 ปีที่แล้ว +5

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

  • @user-ir4vd5yk4x
    @user-ir4vd5yk4x 2 ปีที่แล้ว

    Топовый видос спасибо

  • @arsenmagomedov4936
    @arsenmagomedov4936 2 ปีที่แล้ว

    тиринс, спасибо за материал)

  • @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 отступы от краёв экрана, чтобы код не прилипал к краям экрана?

  • @gustaugutter9477
    @gustaugutter9477 2 ปีที่แล้ว +2

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

  • @hunya_k
    @hunya_k 2 ปีที่แล้ว

    А можно ли в первом случае сделать массив? Чтобы в неограниченные количестве «переменных» вписывать значения после сплита

    • @t0digital
      @t0digital  2 ปีที่แล้ว +1

      вот так можно:
      some_tuple = input().strip().split()
      в some_tuple будет tuple=кортеж, не list. В видео/PDF там же распаковка кортежа просто показана в левой части.
      Если нужен именно list, то кортеж надо преобразовать явно в list:
      some_list = list(input().strip().split())

    • @hunya_k
      @hunya_k 2 ปีที่แล้ว

      @@t0digital спасибо! Ваше видео вдохновило переписать код)
      (специально видео не искала, в рекомендациях попалось)

  • @user-oe5ok3sj4q
    @user-oe5ok3sj4q ปีที่แล้ว

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

  • @mrmedbedb1256
    @mrmedbedb1256 ปีที่แล้ว

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

  • @Ibrahimib382
    @Ibrahimib382 10 หลายเดือนก่อน

    Шикарно

  • @sergiyr9152
    @sergiyr9152 2 ปีที่แล้ว

    полезное видео!