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

  Рет қаралды 223,218

Диджитализируй!

Диджитализируй!

Күн бұрын

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

Пікірлер: 664
@t0digital
@t0digital 2 жыл бұрын
Подготовили PDF шпаргалку, которую можно распечатать и держать перед глазами, чтобы быстрее всё запомнить: to.digital/s/12-python-oneliners.pdf - цветная версия to.digital/s/12-python-oneliners-wb.pdf - чёрно-белая версия Мой курс «Хардкорная веб-разработка» - course.to.digital Вжух!
@salmanchik1
@salmanchik1 Жыл бұрын
19:28 Чувак, ударение в слове красивее поставил слегка неправильно. А так очень познавательный выпуск.
@indravishnu2387
@indravishnu2387 Жыл бұрын
Красавчик ! но шпаргалка в формате txt честно не хватает )) !!!!
@jornand123
@jornand123 2 жыл бұрын
Относительно .split есть неточность: split() и split(" ") - не одно и то же. split() для разделения использует не только пробел, но и все whitespace символы, например, таб, а также последовательность таких символов рассматривается как один - сплитятся слова независимо от кол-ва пробелов между ними. split(" ") сплитит строго по одиночным пробелам
@Pafel0684
@Pafel0684 Жыл бұрын
Результат то одинаковый?
@user-dd1di2fv6i
@user-dd1di2fv6i Жыл бұрын
@@Pafel0684 нет )
@frand2158
@frand2158 Жыл бұрын
Насчёт множественных пробелов: split(' ') делает также
@ivanivanovich975
@ivanivanovich975 Жыл бұрын
@@frand2158 нет
@barbosspirat
@barbosspirat 6 ай бұрын
​@@Pafel0684пример: "товар\tяблоко".split() = [товар, яблоко] та же строчка только теперь с split(" "), мы получим [товар\tяблоко]
@flashxl555
@flashxl555 2 жыл бұрын
Нужно добавить, что копирование вида L2 = L[:] является поверхностным копированием, а не полным. Это значит, что если есть вложенные в список структуры, например: ещё один список или словарь - то могу возникнуть проблемы. В таких случаях нужно использовать функцию deepcopy из модуля copy.
@coppolos
@coppolos 2 жыл бұрын
мало того, такая штука будет корректно работать только с объектами которые поддерживают срезы
@user-om9sf3fi6u
@user-om9sf3fi6u 2 жыл бұрын
Полезный коммент. В питоне много шансов при обучении упустить историю с глубоким и поверхностным копированием.
@valarg5756
@valarg5756 2 жыл бұрын
Полностью согласен, тоже смотрел об этом подумал
@AJIagguH
@AJIagguH 2 жыл бұрын
а если вызвать метод copy() ?
@flashxl555
@flashxl555 2 жыл бұрын
@@AJIagguH Если взять L.copy() - это будет эквивалентно L[:]
@sergepodkolzin1004
@sergepodkolzin1004 2 жыл бұрын
Не, ну когда reduce добавили с лямбдой, уже усложнено для восприятия, лучше отдельной строкой это делать. Явное лучше неявного или как там в дзене...
@user-sl5lc8xx4q
@user-sl5lc8xx4q 2 жыл бұрын
Да для многих многосторонность читабельнее нежели вот то. Но не знаю, я как человек который боролся, в процессе обучения, за лучшие решения в Кодварс могу сказать этот код выглядит элегантным :)
@doltramir
@doltramir Жыл бұрын
Вместо лямбды с reduce: from math import prod volume = prod(map(int, input().strip().split()))
@ssatskov
@ssatskov 2 жыл бұрын
Крутое видео, подача как всегда на уровне! НО Думаю, нужно было бы добавить про: 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 жыл бұрын
py - python ?:)
@nataliepodgainova6582
@nataliepodgainova6582 Жыл бұрын
Спасибо мне было очень полезно, 3-5 вообще не знала
@shadowraze6928
@shadowraze6928 6 ай бұрын
еще можна 10e6, число после `e` - количество нулей
@kryzh_kit
@kryzh_kit 2 жыл бұрын
Хоть и всё изложенное использую, но с удовольствием посмотрел ролик, подача шикарная!)
@alittlemoron4068
@alittlemoron4068 2 жыл бұрын
16:56 только что проверил данный код. На самом деле, это обычный аналог copy.copy функции, которая копирует не объект полностью, а лишь его структуру. Т.е. в случае, если ваш список будет многоуровневым (список в списке), то при изменении внутреннего списка, эти изменения отразятся и на скопированном списке. Так что если нужно железобетонно скопировать список как полностью новый объект, то лучше воспользоваться функцией из модуля copy deepcopy.
@Max-fr3xv
@Max-fr3xv 2 жыл бұрын
+
@PythonDevelopment
@PythonDevelopment 2 жыл бұрын
Ну это понятно и так. Не зря же deepcopy придумали. А срезы как быстрый и элегантный способ работы со списками, кортежами.
@helish_88
@helish_88 2 жыл бұрын
только сейчас понял как работает map, про reduce не знал, спс за видео, как всегда топ
@ivanivanov-hl7ry
@ivanivanov-hl7ry 2 жыл бұрын
Первый пример: А можно ведь и без .strip() обойтись, так как без параметров он убирает только whitespaces, а .split() по умолчанию с краёв их тоже уберёт. Т.е. для решения этой же задачи можно просто input().split()
@grieverrr
@grieverrr 2 жыл бұрын
эта история работает только пробельного разделителя, если ты сплитнешь по запятой строку вида a = ", asd , ggg, rrrr , f, j" то пробелы с краев никуда не денутся. поэтому лучше сразу привыкать всегда делать стрип после сплита.
@alexanderkramskoy7701
@alexanderkramskoy7701 Жыл бұрын
Очень доходчиво и познавательно! Спасибо!
@Vjidowkdkcpapqkfjfw
@Vjidowkdkcpapqkfjfw 21 күн бұрын
Алексей, спасибо! Долго держал видео в закладках. В итоге, когда сейчас посмотрел, то всё уже знаю. Но, подача, как всегда, отличная. Спасибо ещё раз! Ждём новых подобных видео!
@t0digital
@t0digital 21 күн бұрын
Спасибооо!
@bernardsoul8936
@bernardsoul8936 Жыл бұрын
Очень полезное, а главное понятное видео, спасибо большое!
@user-ey4qp4mq4q
@user-ey4qp4mq4q 2 жыл бұрын
Коротко, ясно, без воды 👍
@vachapoluk9035
@vachapoluk9035 2 жыл бұрын
Очень спасибо за формат таких видео!!
@astoscope
@astoscope 2 жыл бұрын
Так то можно и целиком модули/скрипты/программы упихивать в одну строку, но имхо, читаемость кода значительно выше в большинстве случаев, когда кодер не поленился и написал в несколько строк каждое действие пошагово, а не запихнул миллион действий в одну строку, действия в которой выполняются теперь и не слева направо и не справа налево, а в порядке, индивидуальном для каждого случая. Что такое x * y * z понятно сразу, а редьюс от принципиально неименуемой функции и мапа с данными, которые хз какие они там придут вообще - это нифига без пузыря и не разберешься, нафига оно нужно тут
@bari_grey_woolf_6988
@bari_grey_woolf_6988 2 жыл бұрын
пиши машинный код, будет понятно
@pavelgushchin2223
@pavelgushchin2223 2 жыл бұрын
@HoroscopeVideo - Гороскоп на сегодня Единственный здравый комментарий. Без мата на его редьюс невозможно смотреть
@magomedmagomedov9168
@magomedmagomedov9168 2 жыл бұрын
Ну когда переменных 2-3 то конечно лучше не использовать reduce, но если их 30-40, то reduce смотрится уже привлекательнее
@reaexp
@reaexp 2 жыл бұрын
уроки Python бесплатно - kzfaq.info/get/bejne/irZ2hM590cjXZKM.html
@gauss_gun
@gauss_gun Жыл бұрын
Так цель видео в первую очередь обучить этим фичам, а не научить пихать всё в одну строку. Всегда полезно знать, как можно сделать, чтобы применить часть знаний в нужном месте правильно.
@cbrnt4157
@cbrnt4157 2 жыл бұрын
Декларативный способ подстановки функции супер! Решил проблему, над который давно думал. Спасибо, Алексей!
@igorratnik2357
@igorratnik2357 2 жыл бұрын
Спасибо Добрый человек. На степике прохожу 2 курс по пайтон поколение питон для продвинутых, на будущее присматриваю, чем продолжить. Увидел ваш курс. Добавил в закладочки. По строчным выражениям очень удобная штука, особенно циклы в них, в том числе вложенные.
@romanrrv
@romanrrv 2 жыл бұрын
Спасибо! Классный туториал получился!
@noookm
@noookm 2 жыл бұрын
Очень круто, очень полезно. Спасибо 👍 большое
@gatapov
@gatapov 2 жыл бұрын
Очень хорошая и понятная подача материала, спасибо! Можете сделать видео о Django signals?
@alexbokuto5353
@alexbokuto5353 2 жыл бұрын
Спасибо! Очень полезно и понятно!
@user-sn1qp2xq8l
@user-sn1qp2xq8l 2 жыл бұрын
Cпасибо! Очень полезно и наглядно!
@user-if1dj7fy2y
@user-if1dj7fy2y Ай бұрын
Чудесно звучит🎉❤ а Когда же будет продолжение этой темы разговора😊
@zaicevIT
@zaicevIT Жыл бұрын
Огромное спасибо за работу, очень полезный видос🤝
@vitalik100500q
@vitalik100500q 2 жыл бұрын
В последнем примере можно сделать декоратор который будет генерировать айтемы в этом словаре и навесить его на функции обработчики, а так же дополнительно можно сделать функцию которая будет резолвить это, может быть удобно если структура более сложная, со вложенными словарями
@alexeisafronov6627
@alexeisafronov6627 2 жыл бұрын
Классный урок! Круто было бы послушать про протоколы!
@reaexp
@reaexp 2 жыл бұрын
уроки Python бесплатно - kzfaq.info/get/bejne/irZ2hM590cjXZKM.html
@Dmitriy777JF
@Dmitriy777JF 2 жыл бұрын
Спасибо за конфигурационный словарь!
@nitproject5193
@nitproject5193 2 жыл бұрын
8:20 попався джсер)
@t0digital
@t0digital 2 жыл бұрын
да вот задолбали они, не могли хотя бы синтаксис комментариев во всех ЯП сделать однородным:)
@RuslanKovtun
@RuslanKovtun 2 жыл бұрын
@@t0digital так в питоне комменты как в bash, он ведь с ним конкурировал изначально.
@yariktyrykin3393
@yariktyrykin3393 2 жыл бұрын
Возможно стоило также рассказать помимо словарей конфигурации и о существовании ConfigParser'а, все-таки сохранять конфиги нужно также и в моменты "простаивания" программного продукта
@SamSafonov
@SamSafonov Жыл бұрын
Алексей, спасибо за видео!
@AlexandrSpb
@AlexandrSpb 3 ай бұрын
Очень полезное видео, спасибо!
@Ruslantuber
@Ruslantuber 2 жыл бұрын
Супер полезно! №8 и №11 сразу забрал в свой скрипт. Знал, что как-то лаконичнее можно, но не знал как.
@sevashpun
@sevashpun 2 жыл бұрын
Отличный урок! Респект!
@daryamachigina157
@daryamachigina157 Жыл бұрын
Как вы красиво все объясняете 😌😃
@IgnatikVodichka
@IgnatikVodichka 2 жыл бұрын
Крутая рубрика. Оч крутая. Такого бы по чаще.
@Hardy_21
@Hardy_21 4 ай бұрын
Братан как же приятно тебя слушать, очень позитивный чувак. За пять лет от галер до крупных банков ни одного хорошего человека на сеньере не встретил. 90 процентов это пассивно-агрессивные, злые, но трусливые шавки нолайферы, которые в технологиях сами еле-еле разбираются. Братан, есть у тебя команда? Я бы с удовольствием поработал с тобой.
@URich87UA
@URich87UA 2 жыл бұрын
супер, спасибо) очень познавательно)
@alexandertomilov6165
@alexandertomilov6165 2 жыл бұрын
💯 ТОП!🔥 Сделай пожалуйста PDF: было/ стало, чтобы все могли скачать и было всегда перед глазами.
@t0digital
@t0digital 2 жыл бұрын
Отличная мысль, сделаем!
@codelearner1713
@codelearner1713 2 жыл бұрын
Видео хорошее, но важно помнить, что коротко, не всегда красиво и читаем. И автор говорит об этом. Не забывайте про pep8
@andruhaz
@andruhaz 2 жыл бұрын
Отличное видео, можно сделать серию таких?
@MrPavelFrolov
@MrPavelFrolov 2 жыл бұрын
Спасибо за видео, хороший формат, давно искал такое. К сожалению, ничего нового для себя не увидел, хотелось бы чего то нового, может быть сложнее, или "спрятанного".
@alexandrunknown1456
@alexandrunknown1456 2 жыл бұрын
Вот таких видосов бы больше
@michaelhin2290
@michaelhin2290 2 жыл бұрын
Спасибо большое, отличное видео! Если бы ещё по golang'у кто-то такое снимал
@Michael201078
@Michael201078 2 жыл бұрын
Мегаполезная подборка. Огромнейшее спасибо!
@vladimir_s1961
@vladimir_s1961 2 жыл бұрын
Из серии "хозяйке на заметку" - просто, легко, красиво. Приятно слушать человека, который знает, о чем говорит. Спасибо!
@iamzeus1250
@iamzeus1250 2 жыл бұрын
Спасибо большое!
@nikitainiciative356
@nikitainiciative356 2 жыл бұрын
крутое видео, классно понимать, что о мапе я узнал раньше (вчера)
@C0oo1D
@C0oo1D 2 жыл бұрын
Сразу зачесалось дополнить)) 3. читаемее mul вместо lambda, вообще лямбды стараюсь использовать по минимуму: from operator import mul volume = reduce(mul, map(int, input().strip().split()) 5. Вот функциональная часть в питоне порой подбешивает.. Хотел бы я написать вот так, но не выйдет: tuple(filter(str.startswith('A'), names)) Нужно дополнительно усложнять т.к. по простому объект не передать, а магию передачи уже забыл (есть что-то встроенное, но с ним выглядит насколько я помню хуже чем с лямбдой), потому часто проще и читаемее использовать comprehensions. 12. Смело как то) Я бы сделал так: def fallback(user, request): print(f'Not exists group provided: {user.group}') # logging.error is better group_to_process_method.get(user.group, fallback)(user, request)
@AntThinker
@AntThinker 2 жыл бұрын
16:20 Кажется мне, что list(numbers) более читаемо, чем нецелево использованный слайс. И с разворотом то же самое -- есть reversed(). А вообще норм!
@huseeads
@huseeads 2 жыл бұрын
Слайсы популярны и используются повсеместно, с их понимаем проблем возникнуть не должно
@vladimirtalpa5390
@vladimirtalpa5390 2 жыл бұрын
Смотрю уже в середине ролика и думаю, надо бы написать, чтобы снял про замену if_else на dict_get - а в конце финальный аккорд как раз об этом. Молодец! Крутой мануал для джунов - ведь на собесех постоянно спрашивают об этих фишках. Такой же ролик стоит снять про: @staticmethod @classmethod @dataclass про использование абстрактных классов про синглтоны про конечные автоматы или машины состояний
@vladimirtalpa5390
@vladimirtalpa5390 2 жыл бұрын
а ещё очень крутая штука это @context. Ее как раз используют в машине состояний , но и не только
@cryptoworkdonkey
@cryptoworkdonkey 2 жыл бұрын
Спасибо за хаки. Компрехеншны удобны. К обработке текста нужно привыкнуть. Например в R фильтрация идёт грепом: names = c('Хри', 'Аде', 'Тэя', 'Сте', 'Арх') grep("^А", names, value = TRUE) или конвейером: names %>% grep ("^А", ., value = TRUE) И в ифчиках/фильтрах есть булевый grepl(). Вот прям оч удобно.
@deve1oper
@deve1oper Жыл бұрын
Ну довольно простые приемы, все их я уже знал, кроме последнего, но там можно логически додуматься, хорошо зная питон, однако материал клевый, подача супер, все быстро, наглядно, с объяснениями, супер!
@sergv4782
@sergv4782 2 жыл бұрын
Спасибо, полезно)
@user-hj6oh4bw3n
@user-hj6oh4bw3n 2 жыл бұрын
Вместо последнего пункта напрашивается создать Интерфейс Group, от которого будут наследоваться AdminGroup, ManagerGroup и т.д. Они будут по разному определять метод process_request.Тогда вместо стринга можно в конструктор User передать Request через интерфейс
@clauseclause6640
@clauseclause6640 2 жыл бұрын
Сразу лайк =) ну и... вкусовщина конечно, но вместо lambda x, y: x * y можно использовать operator.mul а по последнему имхо наглядней Enum ну и можно через f-строку красиво сделать, например если это методы класса - getattr(self, f"process_{user.group}_request")(user, request)
@reaexp
@reaexp 2 жыл бұрын
уроки Python бесплатно - kzfaq.info/get/bejne/irZ2hM590cjXZKM.html
@Yarikorg
@Yarikorg 2 жыл бұрын
Хорошее видео, спасибо. Так глядишь, мне Пайтон зайдет и начну его использовать. Много от Перл там вижу. Не знаю что раньше появилось.
@goodgriefwhatarelief8899
@goodgriefwhatarelief8899 2 жыл бұрын
Очень круто, спасибо
@Dmitrii-Zhinzhilov
@Dmitrii-Zhinzhilov Жыл бұрын
Алексей, благодарю += 1000 !!
@vladimirprin263
@vladimirprin263 Жыл бұрын
многое знал, но пару фишек утащу, спасибо)
@eugene1079
@eugene1079 2 жыл бұрын
Спасибо, видео "пушка". А что за книга была на столе в этом видео?
@maximshumilo3728
@maximshumilo3728 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)
@Namynnuz
@Namynnuz Жыл бұрын
Лямбды выглядят чуждо для семантики языка. В шарпее с LINQ с этим всем гораздо лучше: 6:58 int volume(string input) => input.Split(' ').Select(int.Parse).Aggregate((a, b) => a * b); 12:34 List filter(string[] input, string prefix) => input.Where(o => o.StartsWith(prefix)).ToList(); В случае с in это .Contains(), аналогичные .All() и .Any() так же имеются. При том, что это всё просто extension methods по IEnumerable.
@ONYX_RU
@ONYX_RU 2 жыл бұрын
Я заговнокодил первый вариант без дополнительных библиотек и чисто в одну строку)): for num in [input().split() for x in range(1)]:print(int(num[0])*int(num[1])*int(num[2]))
@valarg5756
@valarg5756 2 жыл бұрын
В последнем примере с условиями думал нововведение switch и case сейчас покажешь,ан нет, на деле другое исполнение донес :) спасибо, не знал
@C0oo1D
@C0oo1D 2 жыл бұрын
Он же вроде в 3.10, а тут 3.9 =)
@user-ot5iy5es4l
@user-ot5iy5es4l 2 жыл бұрын
вообще не вижу какой то пользы от match, передаёшь функции объект, а далее кейсы перехватывают.Всё то же самое можно реализовать условиями.
@andreiosipov2766
@andreiosipov2766 2 жыл бұрын
@@user-ot5iy5es4l если у тебя более одного elif, то ты движешься куда-то не туда)
@user-ot5iy5es4l
@user-ot5iy5es4l 2 жыл бұрын
@@andreiosipov2766 это откуда ты такое взял что elif нельзя употреблять более раза?другое дело если else более раза
@andreiosipov2766
@andreiosipov2766 2 жыл бұрын
@@user-ot5iy5es4l ты профессиональный разработчик? Работаешь с другими людьми, проходишь код-ревью?
@user-tl8gn9yg1b
@user-tl8gn9yg1b 2 жыл бұрын
24:20 - гораздо эффективнее в таких случаях прибегнуть к полиморфизму. Спасибо за видео!
@user-bv4mh7xb2p
@user-bv4mh7xb2p 2 жыл бұрын
print('Василий' if 'Василий' in ('Христофор','Василий') else '') Таким образом можно сократить условие и вывод до одной строчки.Блок else в данном случае обязательный (тут он просто выведет пустую строку если нашего имени не обнаружилось в кортеже)
@alexsukhykh5666
@alexsukhykh5666 2 жыл бұрын
Спасибо за all, any. ))
@hinomuratomisaburo4901
@hinomuratomisaburo4901 2 жыл бұрын
ого крутой контент ! класс
@amigo4884
@amigo4884 2 жыл бұрын
Привет! Большое спасибо за видео. Не так давно ты говорил, что там, где требуется быстродействие код пишется на Go или на C/C++. У меня вопрос: чистый C жив в веб-разработке?
@t0digital
@t0digital 2 жыл бұрын
Привет! Не могу сказать про C/С++, так как не слежу за ними. Думаю, что какие-то хардкорные вещи под нагрузку пишутся на С или C++, но в будущем Rust их вытеснит в таких нишах.
@SantaCluster
@SantaCluster 2 жыл бұрын
интересно, а вытеснит ли Rust парочку C/C++ совсем? (для новых проектов, исключая имеющееся наследие)
@furiousangel256
@furiousangel256 2 жыл бұрын
Такой код выглядит приятно для глаза и экономит место. Вот только читабельным он является только для того, кто знает эти фишки. Например, если бы я до этого видел увидел конструкцию [::-1] я бы во-первых не понял, что тут вообще происходит, а во-вторых засомневался бы - работает ли оно вообще? Спасибо за интересные фишки конечно, но я лучше потрачу 2-3 строчки кода и опишу последовательность действий в явном виде. Надеюсь мой неведомый потомок скажет мне спасибо :-)
@user-ir2qw1nt8z
@user-ir2qw1nt8z 2 жыл бұрын
Интересное видео, особенно для того, кто только знакомится с python
@mykolakudinov4403
@mykolakudinov4403 2 жыл бұрын
Конфигурационный словарь нужно будет согласовывать со списком типов пользователя. Этот вопрос будет решён если вместо строки использовать dataclass(name: str + process_request: Callable) как аргумент __init__ . В таком случае мы можем спрятать вызов process_request с user как аргумент внутри функции класса User.
@mykolakudinov4403
@mykolakudinov4403 2 жыл бұрын
Опять таки знаю об этом я только благодаря твои предыдущим роликам
@user-bi8ed5gs1r
@user-bi8ed5gs1r Жыл бұрын
Спасибо!
@user-fd7ce2em5y
@user-fd7ce2em5y Жыл бұрын
Видос супер. Бомбезные штуки показаны. Даже знаю где можно в моих проектах это могло бы заменить мой говнокод. Я в python новичок и выглядит всё это очень понятно и внятно, во многом благодаря подаче автора. Выражаю большую благодарность за столь мощный подход к созданию контента.
@pythonofsky4545
@pythonofsky4545 Жыл бұрын
Думаешь, если ты пишешь по другому, например, перебор в цикле вместо in то твой код уже говнокод? Эти фишки только для профи, которые фигачат на питоне по 8 часов в день и так забадываются, что быстреев одну строку написать, чем цикл или функции расписывать. А на самом деле классический вид и работает быстрее, и читается лучше. Сам иногда грешу всякими тернарниками и лямбдами, а потом мой код никто понять не может... ))
@user-fd7ce2em5y
@user-fd7ce2em5y Жыл бұрын
@@pythonofsky4545 нет, думаю если ты не знаешь синтаксические и общепринятые конструкции, то собираешь велосипед, у которого и педали крутить сложно и руль фиг пойми как работает и колёса в разные стороны крутятся. Ясно правило "Нормально делай - нормально будет", но иногда из-за не знания особенностей различных инструментов лепишь фиг пойми какую чушь. И я тоже за понятный код, но в некоторых моментах всё-таки стоит использовать лаконичные подходы, которые и читаются просто, если знать язык, и не загромождают код ненужной белибердой.
@RuslanKovtun
@RuslanKovtun 2 жыл бұрын
6:30 - `from operators import mul` и не надо лямбду писать, ну или `int.__mul__` но это больше текста и читабельность падает.
@user-so6rz7bz1m
@user-so6rz7bz1m 6 ай бұрын
map принимает последовательность вторым аргументом, это ведь несовсем правда, map iterable принимает, это более широкий интерфейс, а sequence это более узкий интерфейс, он iterable (__iter__), sized(__len__) и container(__in__), iterable это может быть и генератор и сопрограмма (Coroutine) это я не поумничать пишу просто мне кажется важным различать ту самую утиную типизацию, где какой минимальный интерфейс необходим, ну и это помогает точно хинты писать, где что надо за материал, большое спасибо, очень полезно
@user-qt4gz1dl6w
@user-qt4gz1dl6w 2 жыл бұрын
Было бы круто если ты бы сделал обзор всей библиотеки functools, там же не один метод reduce?
@viktorh71
@viktorh71 Жыл бұрын
Офигенно!
@Darqsatyricon
@Darqsatyricon 2 жыл бұрын
Интересно псмотреть на покрытие юнит тестами при любви к однострочкам... И что-нибудь услышать про maintainability кода где в одну строку выполняется сразу несколько операций. Ты, наверное, сознательно опустил процесс валидации инпута в первом примере и любой еррор хендлинг. Вобщем, чёт я ожидал большего. Больше выглядит как студенческий код для фриланса нежели продакшн код с какого то нормального проекта или энтерпрайза.
@t0digital
@t0digital 2 жыл бұрын
Вот это - нечитаемо: numbers = map(int, input().split()) А вот так - песня: input_string = input() input_word = input.split() first_word = input_elements[0] second_word = input_elements[1] first_number = int(first_word) second_number = int(second_word) numbers = (first_number, second_number) Ну ок:)
@user-iu6xg8wo8l
@user-iu6xg8wo8l 2 жыл бұрын
Думал, что все уже знаю, но узнал про any и all только сейчас, спасибо за видос
@kai.hexendorf
@kai.hexendorf Ай бұрын
Так в нормальных языках люди смотрят в спецификацию коллекции и обнаруживают у неё все необходимые функциональные методы filter, map, all, every... А в python перевернули всё с ног на голову, и поэтому чтобы узнать о существовании глобальных методов all, any, должно снизойти свыше.
@t0digital
@t0digital 2 жыл бұрын
Вопрос не по теме - а как вам картинка:)?
@i17talk8
@i17talk8 2 жыл бұрын
и звук ничо. Новая камера?
@vlightendy2539
@vlightendy2539 2 жыл бұрын
Wow 😍
@m_kovalenko
@m_kovalenko 2 жыл бұрын
Пожалуйста, делай отступы когда показываешь IDE. Из-за элементов интерфейса ютуба не видно код
@sw1881
@sw1881 2 жыл бұрын
круто все!
@t0digital
@t0digital 2 жыл бұрын
@@m_kovalenko отступы от краёв экрана, чтобы код не прилипал к краям экрана?
@vol1ura
@vol1ura 2 жыл бұрын
На Ruby это можно записать ещё короче )) и даже импорт делать не придётся. Например, volume = gets.strip.split.map(&:to_i).reduce(&:*) А последний пример, который здесь показан и занимает 5 строчек (ну или 2 но очень длинные), можно записать self.send "process_#{user.group}_request".to_sym user request
@palyaros02
@palyaros02 Жыл бұрын
последний пример тоже можно оптимизировать разными способами до состояния одной короткой строчки. Например, использовать eval, магические методы или сделать декоратор. Автор просто не стал идти в такие дебри.
@user-oe5ok3sj4q
@user-oe5ok3sj4q Жыл бұрын
К сплиту лепить стрип не надо, т.к. сплит уже убрал лишние пробелы. Такая конструкция может применяться в случае если мы в сплит передаем аргумент с конкретным разделителем. Срезы не изменяют список, т.е. конструкция список[::-1] просто возвращает список в обратном порядке, список при этом остался в первоначальном варианте. Для того чтобы развернуть список используется reverse().
@molodoi_d
@molodoi_d 2 жыл бұрын
Мне кажется, в последнем примере удобнее использовать метод get, для обработки случаев выхода за границы ключей за счёт дефолтного значения
@t0digital
@t0digital 2 жыл бұрын
Да
@gustaugutter9477
@gustaugutter9477 2 жыл бұрын
*тидимс* И вот я оставил комментарий в поддержку отличного контента)
@drdrdr6835
@drdrdr6835 2 жыл бұрын
То чувство что сначала сам решал задание а потом смотрел пример, почти все аналогично сделал🤔
@13danyocean13
@13danyocean13 2 жыл бұрын
О теме с конфигурацией: кроме простой и pythonic конструкции мы также получим сложность O(1), вместо O(n)(при реализации c кучей elif).
@reaexp
@reaexp 2 жыл бұрын
уроки Python бесплатно - kzfaq.info/get/bejne/irZ2hM590cjXZKM.html
@Monte_Cristo_R
@Monte_Cristo_R 2 жыл бұрын
Подскажите , почему цену на курс подняли с 20 до 30 ? Посчитали что цена низкая(конечно это дело автора , и я не с целью упрекнуть , но просто интересно откуда такое ценообразование и повышение на 1/3)? Получается примерно те первые 250-300 человек кто приобрёл курс успели и им повезло ? И значит ли это что в будущем цена ещё вырасти может и на сколько ?
@DmitryKravchyna
@DmitryKravchyna 2 жыл бұрын
Первая задача в одну строку)) print(*[x * y * z for x, y, z in [map(int, input().split())]])
@serhiiriznychenko4108
@serhiiriznychenko4108 2 жыл бұрын
Если кому интересно, вот как первая функция будет выглядеть на языке scala: input.trim.split(" ").map(_.toInt).product
@mrmedbedb1256
@mrmedbedb1256 Жыл бұрын
list comps, dict comp, gen exp это убойные инструменты питониста. В сочетании с тернарным оператором вообще на глушняк :)
@daniilpopkov4176
@daniilpopkov4176 2 жыл бұрын
По поводу пункта 6, будьте внимательны, это поверхностное копирование. Если вам нужно полное используйте deepcopy
@user-di7gx3rc2q
@user-di7gx3rc2q 2 жыл бұрын
Про all есть нюанс. В случае перечисления через and проверка остановится, как только встретит первый False. В случае с all будут проверены все элементы. То есть перечисление через and хоть и не такое красивое, но более эффективное.
@andrew_z.
@andrew_z. 2 жыл бұрын
тут дело не в all. all тоже не будет все элементы проверять, если это не нужно: all((print(i) or i
@bulhi
@bulhi 2 жыл бұрын
Знаешь, спасибо тебе Когда-то давно я просто смотрел твои видосы, ничего не понимал Потом через время начал учиться жабускрипт, и спустя пол года устроился Сейчас, спустя 8 месяцев работы, являюсь мидл фулстак разрабом, с зп в 200 рублей Недавно увидел первый лям, и задумался с чего все начиналось и твой видос с реки попал, и все сошлось Спасибо!!
@bulhi
@bulhi 2 жыл бұрын
Update: плюс ко всему мне 19)
@alexenderius
@alexenderius Жыл бұрын
Предостережение автору. Упрощая, слово group произносится как /груп/. Если произносить /гроуп/, получается слово grope с совсем другим значением, возможно нежелательным в образовательном видео
@mrpisarik
@mrpisarik 2 жыл бұрын
07:44 вместо лямбды можно передать operator.mul, где operator - это стандартный пакет в питоне
@vovchic3593
@vovchic3593 Жыл бұрын
С объёмом можно вообще так написать print(*[x*y*z for x, y, z in [map(int, input().split())]])
@nitroflap
@nitroflap 2 жыл бұрын
Большинство я уже знаю, но все таки, довольно много интересного узнал. Классно! А все таки... когда будет Go...?
@t0digital
@t0digital 2 жыл бұрын
Возможно будет раст вместо го:)
@nitroflap
@nitroflap 2 жыл бұрын
@@t0digital А почему? Гошка же лучше для веба :O
@t0digital
@t0digital 2 жыл бұрын
Пока не сложил для себя однозначного мнения по этому поводу. Go проще, это факт, но простота это не всегда лучше
@user-lh6ou6de6l
@user-lh6ou6de6l 2 жыл бұрын
@@t0digital вау раст! Слышал много хорошего, было бы интересно
@t0digital
@t0digital 2 жыл бұрын
вот и мне интересно, изучаю
@0range2un
@0range2un 2 жыл бұрын
Крутяк, спасибо, собрание классных фишек в одном видео с простыми примерами. Я бы еще добавил насчет генераторов: my_list = (x for x in range(30000000)) my_list1 = [x for x in range(30000000)] Теперь, если обходить в цикле первую конструкцию, затраты по памяти составят 17 Мб, а если вторую, то больше 1 Гб
@WorldCount
@WorldCount 2 жыл бұрын
А если обходить итератор?
@user-zk3uo3ti6f
@user-zk3uo3ti6f 2 жыл бұрын
Так он сказал в видео, что кортежи эффективнее по памяти и нужно их использовать, везде где не требуется, дальнейшее изменение данных
@Max-fr3xv
@Max-fr3xv 2 жыл бұрын
насколько я понимаю, в первом случае создаётся генератор, который генерирует цифры по ходу итерации, следовательно памяти много не нужно. А в случае генерации списка, в него заносится цифры на хранение которых нужна память,ну и при итерации в данном случае идёт перебор элементов списка
@Max-fr3xv
@Max-fr3xv 2 жыл бұрын
если попробовать обратиться к генератору и сказать ему допустим my_list[5], то он выбросит ошибку, так как генератор не знает, какое число там будет, до данного числа нужно итерироваться. А в случае my_list1[5] будет выдано число
@Max-fr3xv
@Max-fr3xv 2 жыл бұрын
мои познания могут быть не совершенны, так что сорян если что :)
How To Choose Ramen Date Night 🍜
00:58
Jojo Sim
Рет қаралды 60 МЛН
Como ela fez isso? 😲
00:12
Los Wagners
Рет қаралды 11 МЛН
10 признаков того, что вы новичок в Python
4:59
Всё об исключениях и работе с ними в Python
30:34
Диджитализируй!
Рет қаралды 48 М.
Решаем тестовое задание на позицию junior python backend разработчик
21:18
𝐧𝐞𝐫𝐝𝐢𝐳𝐚𝐲-𝐜𝐨𝐝𝐞
Рет қаралды 9 М.
Архитектура ПО, MVC и бизнес-логика. Критика Django
20:26
Диджитализируй!
Рет қаралды 74 М.
C++ Разработчик учит Python
28:01
Winderton
Рет қаралды 473 М.
Именование переменных, классов и методов в коде
25:40