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

Поділитися
Вставка
  • Опубліковано 21 лис 2024

КОМЕНТАРІ •

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

    Подготовили 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 роки тому +178

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

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

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

    • @АнтонДудкевич
      @АнтонДудкевич 2 роки тому +16

      @@Pafel0684 нет )

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

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

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

      @@frand2158 нет

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

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

  • @flashxl555
    @flashxl555 3 роки тому +232

    Нужно добавить, что копирование
    вида 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 роки тому +67

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

    • @ЭсканорНаверное
      @ЭсканорНаверное 2 роки тому +2

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

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

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

  • @astoscope
    @astoscope 3 роки тому +103

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

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

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

  • @hardline_fc
    @hardline_fc 10 місяців тому +2

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

  • @ssatskov
    @ssatskov 3 роки тому +59

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

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

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

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

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

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

  • @voronovmaksim88
    @voronovmaksim88 3 місяці тому +1

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

  • @alittlemoron4068
    @alittlemoron4068 3 роки тому +35

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

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

      +

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

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

  • @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 не знал, спс за видео, как всегда топ

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

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

    • @t0digital
      @t0digital  6 місяців тому +1

      Спасибооо!

  • @ИгорьДорошенко-з6з
    @ИгорьДорошенко-з6з 4 місяці тому +1

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @restless_gypsy
    @restless_gypsy 3 роки тому +11

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

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

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

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

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

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

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

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

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

  • @CultureofSpeech
    @CultureofSpeech 7 місяців тому

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @ИванИванов-ж1г1я
    @ИванИванов-ж1г1я 3 роки тому

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

  • @Vipe_team_4365
    @Vipe_team_4365 3 роки тому +1

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

  • @АндрейЛарионов-ж3э
    @АндрейЛарионов-ж3э 2 роки тому +7

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

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

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

    • @АндрейЛарионов-ж3э
      @АндрейЛарионов-ж3э 2 роки тому

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

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

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

  • @suspiciousgoose7904
    @suspiciousgoose7904 14 днів тому

    Супер подходы, почти все использую. Спасибо!

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

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

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

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

    Такой код выглядит приятно для глаза и экономит место. Вот только читабельным он является только для того, кто знает эти фишки. Например, если бы я до этого видел увидел конструкцию [::-1] я бы во-первых не понял, что тут вообще происходит, а во-вторых засомневался бы - работает ли оно вообще? Спасибо за интересные фишки конечно, но я лучше потрачу 2-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 бесплатно - ua-cam.com/video/TPFQkLlbs4o/v-deo.html

  • @monkdok
    @monkdok 3 роки тому

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @knarg4682
    @knarg4682 7 місяців тому +2

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

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

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

  • @ВладимирПортянихин

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

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

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

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

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

  • @АртурЛагунов-ч6ъ

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

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

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

  • @СамвелПогосян-к1е
    @СамвелПогосян-к1е 3 роки тому

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

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

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

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

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

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

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

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

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

  • @ЭдКалумнуз
    @ЭдКалумнуз 3 роки тому

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

    • @kai.hexenzorn
      @kai.hexenzorn 7 місяців тому

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

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

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

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

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

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

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

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

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

  • @ИванКулеш-х9и
    @ИванКулеш-х9и 8 днів тому

    Привет из 2024г.
    К обращению списка могу добавить, что нечасто нам нужен отдельный обращенный список. Гораздо чаще нам нужно обрабатывать исходный список с конца. Тут может помочь функция reversed. Она предоставляет итератор, по которому список просматривается с конца, и не копирует исходный итерируемый объект.

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

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

  • @VikMoc
    @VikMoc 3 роки тому

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

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

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

  • @AlexandrSpb
    @AlexandrSpb 9 місяців тому

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

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

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

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

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

  • @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, то код не станет лучше

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

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

  • @КонстантинКомиссаров-ж1э

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

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

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

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

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

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

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

  • @yt222ee
    @yt222ee 3 роки тому +1

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

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

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

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

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

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

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

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

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

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

      Вот это - нечитаемо:
      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)
      Ну ок:)

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov 2 роки тому

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

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

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

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

  • @Anjinink
    @Anjinink 3 роки тому

    Я бы еще добавил return + тернарный оператор, тоже моЩная конструкция

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

      да! И что-то в духе:
      value = variable1 or variable2

  • @АндрейРожнов-ш9к
    @АндрейРожнов-ш9к 3 роки тому

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

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

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

  • @SaVlaGood
    @SaVlaGood 3 роки тому

    Недавно открыл для себя встроенную функцию eval, с помощью которой последний пример можно уместить в одну строчку. Вот пример: eval(f"process_{client.group}_request(user, request)")

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

      eval потенциально небезопасен - он выполняет произвольный код, надо очень сильно подумать, прежде чем использовать его. Того же эффекта можно добиться без eval, если речь о методах внутри класса: getattr(SomeClass, f'process_{user.group}_request')(user, request). Если речь не о методе класса, а именно о функции - можно достать её из locals(), docs.python.org/3/library/functions.html#locals
      Но у такого подхода с составлением строки, содержащей имя метода/функции, есть один минус - IDE не отрефачит такой код, если функция будет переименована

    • @SaVlaGood
      @SaVlaGood 3 роки тому

      @@t0digital Спасибо, раньше об этом как-то не задумывался, но и самой функцией (к счастью) раньше не пользовался.

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

    Здорово? Здорово, дорогие друзья!!!

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

      Таки да!

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

      @@t0digital большое спасибо за контент!) все супер!

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

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

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

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

  • @VadimKochkarev
    @VadimKochkarev 3 роки тому

    В теме про однострочные конструкции еще неплохо было бы упомянуть о "моржовом" присваивании :=
    Тоже интересный "сахар", появившийся только в Python 3.8

    • @daninspace9009
      @daninspace9009 3 роки тому

      Фуфуфу, непитонично

    • @VadimKochkarev
      @VadimKochkarev 3 роки тому

      @@daninspace9009 Упомянутый в видео reduce - гораздо непитоничнее моржа)

    • @daninspace9009
      @daninspace9009 3 роки тому

      @@VadimKochkarev ну смотря как применять)

  • @ВікторА-к2й
    @ВікторА-к2й 2 роки тому

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

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

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

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

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

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

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

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

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

  • @Ькритик
    @Ькритик 3 роки тому

    Прямо Кунг-Фу - Python!!! 😀🤸‍♂️👍

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

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

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

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

    • @ИванИваныч-н3у
      @ИванИваныч-н3у 3 роки тому

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

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

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

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

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

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

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

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

    18:40 - в данном случае name не напечатался потому что ожидается ещё один