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

Поделиться
HTML-код
  • Опубликовано: 26 сен 2024

Комментарии • 676

  • @t0digital
    @t0digital  3 года назад +39

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

    • @salmanchik1
      @salmanchik1 2 года назад +1

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

    • @indravishnu2387
      @indravishnu2387 Год назад

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

  • @jornand123
    @jornand123 2 года назад +172

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

    • @Pafel0684
      @Pafel0684 2 года назад

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

    • @АнтонДудкевич
      @АнтонДудкевич Год назад +15

      @@Pafel0684 нет )

    • @frand2158
      @frand2158 Год назад

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

    • @ivanivanovich975
      @ivanivanovich975 Год назад +9

      @@frand2158 нет

    • @barbosspirat
      @barbosspirat 11 месяцев назад

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

  • @flashxl555
    @flashxl555 3 года назад +229

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

    • @coppolos
      @coppolos 3 года назад +11

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

    • @СергейДанилов-п6щ
      @СергейДанилов-п6щ 3 года назад +14

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

    • @valarg5756
      @valarg5756 3 года назад +3

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

    • @AJIagguH
      @AJIagguH 3 года назад +1

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

    • @flashxl555
      @flashxl555 3 года назад +5

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

  • @sergepodkolzin1004
    @sergepodkolzin1004 3 года назад +66

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

    • @ЭсканорНаверное
      @ЭсканорНаверное 2 года назад +2

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

    • @doltramir
      @doltramir 2 года назад +3

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

  • @ssatskov
    @ssatskov 3 года назад +58

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

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

  • @astoscope
    @astoscope 3 года назад +101

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

    • @bari_grey_woolf_6988
      @bari_grey_woolf_6988 3 года назад +2

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

    • @pavelgushchin2223
      @pavelgushchin2223 3 года назад +19

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

    • @magomedmagomedov9168
      @magomedmagomedov9168 3 года назад +16

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

    • @reaexp
      @reaexp 2 года назад

      уроки Python бесплатно - ruclips.net/video/TPFQkLlbs4o/видео.html

    • @gauss_gun
      @gauss_gun 2 года назад +3

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

  • @alittlemoron4068
    @alittlemoron4068 3 года назад +34

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

    • @Max-fr3xv
      @Max-fr3xv 3 года назад +4

      +

    • @PythonDevelopment
      @PythonDevelopment 3 года назад +1

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

  • @kryzh_kit
    @kryzh_kit 3 года назад +12

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

  • @ivanivanov-hl7ry
    @ivanivanov-hl7ry 3 года назад +29

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

    • @grieverrr
      @grieverrr 3 года назад +3

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

  • @helish_88
    @helish_88 3 года назад +30

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

  • @hardline_fc
    @hardline_fc 8 месяцев назад +1

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

  • @valarg5756
    @valarg5756 3 года назад +22

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

    • @C0oo1D
      @C0oo1D 3 года назад +2

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

    • @АлексейПротасов-п6э
      @АлексейПротасов-п6э 3 года назад

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

    • @andreiosipov2766
      @andreiosipov2766 3 года назад +2

      @@АлексейПротасов-п6э если у тебя более одного elif, то ты движешься куда-то не туда)

    • @АлексейПротасов-п6э
      @АлексейПротасов-п6э 3 года назад +1

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

    • @andreiosipov2766
      @andreiosipov2766 3 года назад

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

  • @nitproject5193
    @nitproject5193 3 года назад +13

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

    • @t0digital
      @t0digital  3 года назад +6

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

    • @RuslanKovtun
      @RuslanKovtun 3 года назад

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

  • @vladimir_s1961
    @vladimir_s1961 3 года назад +5

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

  • @restless_gypsy
    @restless_gypsy 3 года назад +11

    Очень базовый и очень полезный видос. Спасибо автору, отличный формат, несешь добро людям )

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw 4 месяца назад

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

    • @t0digital
      @t0digital  4 месяца назад +1

      Спасибооо!

  • @CultureofSpeech
    @CultureofSpeech 5 месяцев назад

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

  • @AntThinker
    @AntThinker 3 года назад +12

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

    • @huseeads
      @huseeads 2 года назад

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

  • @t0digital
    @t0digital  3 года назад +43

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

    • @i17talk8
      @i17talk8 3 года назад +2

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

    • @vlightendy2539
      @vlightendy2539 3 года назад +2

      Wow 😍

    • @m_kovalenko
      @m_kovalenko 3 года назад +2

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

    • @sw1881
      @sw1881 3 года назад

      круто все!

    • @t0digital
      @t0digital  3 года назад +3

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

  • @voronovmaksim88
    @voronovmaksim88 Месяц назад +1

    11:30 Сеты это все же не массивы , а множества.
    Спасибо за видео.

  • @codelearner1713
    @codelearner1713 3 года назад +6

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

  • @bernardsoul8936
    @bernardsoul8936 Год назад +1

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

  • @alexandertomilov6165
    @alexandertomilov6165 3 года назад +2

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

    • @t0digital
      @t0digital  3 года назад +1

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

  • @igorratnik2357
    @igorratnik2357 2 года назад +1

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

  • @АнтонСеменюта-ч2п
    @АнтонСеменюта-ч2п 2 года назад +3

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

  • @alexanderkramskoy7701
    @alexanderkramskoy7701 2 года назад +1

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

  • @vitalik100500q
    @vitalik100500q 3 года назад +2

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

  • @vladimirtalpa5390
    @vladimirtalpa5390 3 года назад +2

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

    • @vladimirtalpa5390
      @vladimirtalpa5390 3 года назад

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

  • @ИгорьДорошенко-з6з
    @ИгорьДорошенко-з6з 2 месяца назад +1

    Задача-1. Длина, ширина, высота вводятся через пробел, вычислить объём.
    print(eval(input().strip().replace(' ','*')))
    или так
    print((lambda l, w, h: int(l) * int(w) * int(h))(*input().split()))

  • @cbrnt4157
    @cbrnt4157 2 года назад

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

  • @AlexandrSpb
    @AlexandrSpb 7 месяцев назад

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

  • @alexeisafronov6627
    @alexeisafronov6627 3 года назад +1

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

    • @reaexp
      @reaexp 2 года назад

      уроки Python бесплатно - ruclips.net/video/TPFQkLlbs4o/видео.html

  • @alexbokuto5353
    @alexbokuto5353 2 года назад +1

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

  • @furiousangel256
    @furiousangel256 3 года назад +2

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

  • @knarg4682
    @knarg4682 5 месяцев назад +2

    21:00 функция all умеет удивить. Пустая коллекция -- это False, конечно же. Но не в этом случае. Это прикол из высшей математики, "парадокс одинокого француза": если в комнате нет ни одного человека, то можно утверждать, что ВСЕ люди, находящиеся в комнате -- французы. Или пингвины. Или что угодно. Вот такие грибы. Зачем понадобилось лепить такое в стандартную библиотеку, окутано глубоким хз. Это просто надо запомнить.

    • @Amgarak
      @Amgarak Месяц назад

      И правда, но не логично как-то..

  • @ИванИванов-ж1г1я
    @ИванИванов-ж1г1я 3 года назад

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

  • @clauseclause6640
    @clauseclause6640 3 года назад +2

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

    • @reaexp
      @reaexp 2 года назад

      уроки Python бесплатно - ruclips.net/video/TPFQkLlbs4o/видео.html

  • @noookm
    @noookm 3 года назад +1

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

  • @ONYX_RU
    @ONYX_RU 3 года назад +1

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

  • @SamSafonov
    @SamSafonov 2 года назад

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

  • @zaicevIT
    @zaicevIT Год назад

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

  • @vachapoluk9035
    @vachapoluk9035 3 года назад

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

  • @monkdok
    @monkdok 3 года назад

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

  • @Vipe_team_4365
    @Vipe_team_4365 3 года назад +1

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

  • @C0oo1D
    @C0oo1D 3 года назад

    Сразу зачесалось дополнить))
    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)

  • @IgnatikVodichka
    @IgnatikVodichka 3 года назад +1

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

  • @gatapov
    @gatapov 3 года назад +1

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

  • @Ruslantuber
    @Ruslantuber 3 года назад +1

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

  • @romanrrv
    @romanrrv 3 года назад

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

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

  • @deve1oper
    @deve1oper 2 года назад

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

  • @drdrdr6835
    @drdrdr6835 3 года назад +5

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

  • @mykolakudinov4403
    @mykolakudinov4403 3 года назад +2

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

    • @mykolakudinov4403
      @mykolakudinov4403 3 года назад

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

  • @Aseemxan
    @Aseemxan 3 года назад +16

    Можно мне такого препода в универе?

  • @АндрейРожнов-ш9к
    @АндрейРожнов-ш9к 3 года назад

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

  • @sevashpun
    @sevashpun 3 года назад

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

  • @bulhi
    @bulhi 3 года назад +1

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

    • @bulhi
      @bulhi 3 года назад

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

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

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov 2 года назад

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

  • @ВладимирПортянихин
    @ВладимирПортянихин 3 года назад +4

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

  • @alexandrunknown1456
    @alexandrunknown1456 3 года назад +1

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

  • @АртурЛагунов-ч6ъ
    @АртурЛагунов-ч6ъ 10 месяцев назад

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

  • @alexenderius
    @alexenderius 2 года назад +1

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

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

  • @cryptoworkdonkey
    @cryptoworkdonkey 3 года назад

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

  • @alexsukhykh5666
    @alexsukhykh5666 3 года назад +2

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

  • @daryamachigina157
    @daryamachigina157 2 года назад

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

  • @DmitryKravchyna
    @DmitryKravchyna 2 года назад +1

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

  • @yt222ee
    @yt222ee 3 года назад +1

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

  • @maximshumilo3728
    @maximshumilo3728 3 года назад +1

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

  • @alexpermenev
    @alexpermenev 2 года назад

    Кто-то смотрит и удивляется новым для себя возможностям, а я удивлялся все видео тому как легко ты справляешься с vim и каким образом вообще vim понимает до какого символа тебе нужно выделить текст?????!! Врыв мозга просто…

  • @СамвелПогосян-к1е
    @СамвелПогосян-к1е 3 года назад

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

  • @Michael201078
    @Michael201078 2 года назад +1

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

  • @13danyocean13
    @13danyocean13 3 года назад +1

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

    • @reaexp
      @reaexp 2 года назад

      уроки Python бесплатно - ruclips.net/video/TPFQkLlbs4o/видео.html

  • @АсельАртыкбаева-и1в
    @АсельАртыкбаева-и1в 3 месяца назад

    Благодарю вас!

    • @t0digital
      @t0digital  3 месяца назад

      Спасибооо!

  • @vovchic3593
    @vovchic3593 Год назад

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

  • @nikitainiciative356
    @nikitainiciative356 3 года назад

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

  • @RuslanKovtun
    @RuslanKovtun 3 года назад +1

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

  • @peregudovoleg
    @peregudovoleg 3 года назад +2

    интересно, но не стоит забывать, что пишем 1 раз, а читаем 100:
    Explicit is better than implicit.
    Simple is better than complex.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.

    • @t0digital
      @t0digital  3 года назад

      Ничего из перечисленного этот код не нарушает
      numbers = map(int, strings_iterable)

  • @iamzeus1250
    @iamzeus1250 3 года назад

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

  • @vladimirprin263
    @vladimirprin263 2 года назад

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

  • @knarg4682
    @knarg4682 5 месяцев назад

    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...

  • @Yarikorg
    @Yarikorg 3 года назад

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

  • @goodgriefwhatarelief8899
    @goodgriefwhatarelief8899 3 года назад

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

  • @mrmedbedb1256
    @mrmedbedb1256 2 года назад

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

  • @URich87UA
    @URich87UA 3 года назад

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

  • @ВікторА-к2й
    @ВікторА-к2й 2 года назад

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

  • @ValeriyM_46
    @ValeriyM_46 4 месяца назад

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

  • @gustaugutter9477
    @gustaugutter9477 3 года назад +2

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

  • @СавицкийДмитрий-ц1ь

    Спасибо!

  • @viktorh71
    @viktorh71 2 года назад

    Офигенно!

  • @alexanderizotov3011
    @alexanderizotov3011 3 года назад

    Лучано Ромальо в своей книге "python к вершинам мастерства" писал про то, что вместо функциональщины (map, reduce, lambda-функций) почти всегда можно воспользоваться генератором списка, кортежа или словаря, и это и есть pythonista-style))

    • @alexanderizotov3011
      @alexanderizotov3011 3 года назад

      Досмотрел до 13 минуты уже. Снова ты лезешь в функциональщину (используешь filter), вместо генератора.
      При этом сначала, ты всё таки написал генератор [name for name in names if name.startwith("A")]. Такой пример отработал только потому что функция startwith подразумевает работу со строкой. Тут легко запутаться. В питоне нельзя просто так взять и перебрать список со строками, т.к. обычный цикл начнёт идти по первой строке (т.к. это тоже последовательность) и на ней же и остановится. Я бы рекомендовал перебирать такие списки со строками используя генератор enumerate. Например:
      for index, string in enumerate(list_of_string):
      If ... In string:
      Do_something()
      Или в виде генератора списка:
      [Index, do_something(string) for index, string in enumerate(list_of_string)]
      Последний пример грубый, Яя так не делал давно, но точно знаю, что можно использовать генераторные выражения в list comptehensions))

    • @t0digital
      @t0digital  3 года назад

      Да все используют функциональщину, почти во всех больших взрослых проектах она есть, ибо удобно. А кто не умеет map читать, ну его проблемы, я считаю. Нет ничего нечитаемого в map(str.strip, strings), элементарная конструкция, и если сделать это в comprehension, то код не станет лучше

  • @arsenmagomedov4936
    @arsenmagomedov4936 2 года назад

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

  • @ЭдКалумнуз
    @ЭдКалумнуз 3 года назад

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

    • @kai.hexendorf
      @kai.hexendorf 5 месяцев назад

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

  • @dsidr4859
    @dsidr4859 2 года назад +1

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

  • @AndreySokolovRu
    @AndreySokolovRu 2 года назад

    Пример, когда all() может вас подставить:
    all((
    hasattr(my_object, "some_data"),
    my_object.some_data is not None
    ))
    all() будет проверять все условия, даже если одно из них уже точно ложное, поэтому если у my_object нет атрибута some_data, при проверке второго условия вас будет ждать AttributeError.

  • @nitroflap
    @nitroflap 3 года назад +2

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

    • @t0digital
      @t0digital  3 года назад +9

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

    • @nitroflap
      @nitroflap 3 года назад

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

    • @t0digital
      @t0digital  3 года назад +1

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

    • @ЮрийЧебышев-т1ф
      @ЮрийЧебышев-т1ф 3 года назад +3

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

    • @t0digital
      @t0digital  3 года назад +3

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

  • @Rusia-16
    @Rusia-16 Месяц назад

    Я не понял чем лучше Filter обычного генератора цикла с вложенным логическим оператором? Тоже 1 строка !

  • @Михаил-ю8ы6я
    @Михаил-ю8ы6я 3 года назад +7

    Когда показываешь код на python и рядом с тобой лежит книга по rust

    • @t0digital
      @t0digital  3 года назад +3

      Без палева:)

    • @MrAlexMist
      @MrAlexMist 3 года назад

      Rust писал, вроде, создатель JS ))) Особенно утверждения, проще понятнее лаконичнее

  • @fireboyfamily5179
    @fireboyfamily5179 2 года назад +1

    Че та я нипонил. А куда ж делся z когда считаем объем через reduce? Что за алхимия? Можете подробнее там для особенных...? Как там подразумевается ввод z? Или позволяет ввести не только 3, но и большее количество значений?