Подготовили PDF шпаргалку, которую можно распечатать и держать перед глазами, чтобы быстрее всё запомнить: to.digital/s/12-python-oneliners.pdf - цветная версия to.digital/s/12-python-oneliners-wb.pdf - чёрно-белая версия Мой курс «Хардкорная веб-разработка» - course.to.digital Вжух!
@salmanchik12 жыл бұрын
19:28 Чувак, ударение в слове красивее поставил слегка неправильно. А так очень познавательный выпуск.
@indravishnu2387 Жыл бұрын
Красавчик ! но шпаргалка в формате txt честно не хватает )) !!!!
@jornand1232 жыл бұрын
Относительно .split есть неточность: split() и split(" ") - не одно и то же. split() для разделения использует не только пробел, но и все whitespace символы, например, таб, а также последовательность таких символов рассматривается как один - сплитятся слова независимо от кол-ва пробелов между ними. split(" ") сплитит строго по одиночным пробелам
@Pafel06842 жыл бұрын
Результат то одинаковый?
@АнтонДудкевич2 жыл бұрын
@@Pafel0684 нет )
@frand21582 жыл бұрын
Насчёт множественных пробелов: split(' ') делает также
@ivanivanovich975 Жыл бұрын
@@frand2158 нет
@barbosspirat Жыл бұрын
@@Pafel0684пример: "товар\tяблоко".split() = [товар, яблоко] та же строчка только теперь с split(" "), мы получим [товар\tяблоко]
@flashxl5553 жыл бұрын
Нужно добавить, что копирование вида L2 = L[:] является поверхностным копированием, а не полным. Это значит, что если есть вложенные в список структуры, например: ещё один список или словарь - то могу возникнуть проблемы. В таких случаях нужно использовать функцию deepcopy из модуля copy.
@coppolos3 жыл бұрын
мало того, такая штука будет корректно работать только с объектами которые поддерживают срезы
@СергейДанилов-п6щ3 жыл бұрын
Полезный коммент. В питоне много шансов при обучении упустить историю с глубоким и поверхностным копированием.
@valarg57563 жыл бұрын
Полностью согласен, тоже смотрел об этом подумал
@AJIagguH3 жыл бұрын
а если вызвать метод copy() ?
@flashxl5553 жыл бұрын
@@AJIagguH Если взять L.copy() - это будет эквивалентно L[:]
@astoscope3 жыл бұрын
Так то можно и целиком модули/скрипты/программы упихивать в одну строку, но имхо, читаемость кода значительно выше в большинстве случаев, когда кодер не поленился и написал в несколько строк каждое действие пошагово, а не запихнул миллион действий в одну строку, действия в которой выполняются теперь и не слева направо и не справа налево, а в порядке, индивидуальном для каждого случая. Что такое x * y * z понятно сразу, а редьюс от принципиально неименуемой функции и мапа с данными, которые хз какие они там придут вообще - это нифига без пузыря и не разберешься, нафига оно нужно тут
@bari_grey_woolf_69883 жыл бұрын
пиши машинный код, будет понятно
@pavelgushchin22233 жыл бұрын
@HoroscopeVideo - Гороскоп на сегодня Единственный здравый комментарий. Без мата на его редьюс невозможно смотреть
@magomedmagomedov91683 жыл бұрын
Ну когда переменных 2-3 то конечно лучше не использовать reduce, но если их 30-40, то reduce смотрится уже привлекательнее
Так цель видео в первую очередь обучить этим фичам, а не научить пихать всё в одну строку. Всегда полезно знать, как можно сделать, чтобы применить часть знаний в нужном месте правильно.
@hardline_fc11 ай бұрын
Братан как же приятно тебя слушать, очень позитивный чувак. За пять лет от галер до крупных банков ни одного хорошего человека на сеньере не встретил. 90 процентов это пассивно-агрессивные, злые, но трусливые шавки нолайферы, которые в технологиях сами еле-еле разбираются. Братан, есть у тебя команда? Я бы с удовольствием поработал с тобой.
@sergepodkolzin10043 жыл бұрын
Не, ну когда reduce добавили с лямбдой, уже усложнено для восприятия, лучше отдельной строкой это делать. Явное лучше неявного или как там в дзене...
@ЭсканорНаверное2 жыл бұрын
Да для многих многосторонность читабельнее нежели вот то. Но не знаю, я как человек который боролся, в процессе обучения, за лучшие решения в Кодварс могу сказать этот код выглядит элегантным :)
@doltramir2 жыл бұрын
Вместо лямбды с reduce: from math import prod volume = prod(map(int, input().strip().split()))
@alittlemoron40683 жыл бұрын
16:56 только что проверил данный код. На самом деле, это обычный аналог copy.copy функции, которая копирует не объект полностью, а лишь его структуру. Т.е. в случае, если ваш список будет многоуровневым (список в списке), то при изменении внутреннего списка, эти изменения отразятся и на скопированном списке. Так что если нужно железобетонно скопировать список как полностью новый объект, то лучше воспользоваться функцией из модуля copy deepcopy.
@Max-fr3xv3 жыл бұрын
+
@PythonDevelopment3 жыл бұрын
Ну это понятно и так. Не зря же deepcopy придумали. А срезы как быстрый и элегантный способ работы со списками, кортежами.
@ssatskov3 жыл бұрын
Крутое видео, подача как всегда на уровне! НО Думаю, нужно было бы добавить про: 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 Спасибо за то, что ты делаешь Один из немногих качественных каналов в ру сегменте
@SemyonKalyakulin2 жыл бұрын
py - python ?:)
@nataliepodgainova6582 Жыл бұрын
Спасибо мне было очень полезно, 3-5 вообще не знала
@shadowraze6928 Жыл бұрын
еще можна 10e6, число после `e` - количество нулей
@ivanivanov-hl7ry3 жыл бұрын
Первый пример: А можно ведь и без .strip() обойтись, так как без параметров он убирает только whitespaces, а .split() по умолчанию с краёв их тоже уберёт. Т.е. для решения этой же задачи можно просто input().split()
@grieverrr3 жыл бұрын
эта история работает только пробельного разделителя, если ты сплитнешь по запятой строку вида a = ", asd , ggg, rrrr , f, j" то пробелы с краев никуда не денутся. поэтому лучше сразу привыкать всегда делать стрип после сплита.
@kryzh_kit3 жыл бұрын
Хоть и всё изложенное использую, но с удовольствием посмотрел ролик, подача шикарная!)
@Vjidowkdkcpapqkfjfw7 ай бұрын
Алексей, спасибо! Долго держал видео в закладках. В итоге, когда сейчас посмотрел, то всё уже знаю. Но, подача, как всегда, отличная. Спасибо ещё раз! Ждём новых подобных видео!
@t0digital7 ай бұрын
Спасибооо!
@t0digital3 жыл бұрын
Вопрос не по теме - а как вам картинка:)?
@i17talk83 жыл бұрын
и звук ничо. Новая камера?
@vlightendy25393 жыл бұрын
Wow 😍
@m_kovalenko3 жыл бұрын
Пожалуйста, делай отступы когда показываешь IDE. Из-за элементов интерфейса ютуба не видно код
@sw18813 жыл бұрын
круто все!
@t0digital3 жыл бұрын
@@m_kovalenko отступы от краёв экрана, чтобы код не прилипал к краям экрана?
@suspiciousgoose7904Ай бұрын
Супер подходы, почти все использую. Спасибо!
@igorratnik23572 жыл бұрын
Спасибо Добрый человек. На степике прохожу 2 курс по пайтон поколение питон для продвинутых, на будущее присматриваю, чем продолжить. Увидел ваш курс. Добавил в закладочки. По строчным выражениям очень удобная штука, особенно циклы в них, в том числе вложенные.
@helish_883 жыл бұрын
только сейчас понял как работает map, про reduce не знал, спс за видео, как всегда топ
@voronovmaksim884 ай бұрын
11:30 Сеты это все же не массивы , а множества. Спасибо за видео.
@orange_keeper2 жыл бұрын
Вместо последнего пункта напрашивается создать Интерфейс Group, от которого будут наследоваться AdminGroup, ManagerGroup и т.д. Они будут по разному определять метод process_request.Тогда вместо стринга можно в конструктор User передать Request через интерфейс
@bernardsoul8936 Жыл бұрын
Очень полезное, а главное понятное видео, спасибо большое!
@ИгорьДорошенко-з6з5 ай бұрын
Задача-1. Длина, ширина, высота вводятся через пробел, вычислить объём. print(eval(input().strip().replace(' ','*'))) или так print((lambda l, w, h: int(l) * int(w) * int(h))(*input().split()))
@CultureofSpeech8 ай бұрын
Чудесно звучит🎉❤ а Когда же будет продолжение этой темы разговора😊
@alexanderkramskoy77012 жыл бұрын
Очень доходчиво и познавательно! Спасибо!
@knarg46828 ай бұрын
21:00 функция all умеет удивить. Пустая коллекция -- это False, конечно же. Но не в этом случае. Это прикол из высшей математики, "парадокс одинокого француза": если в комнате нет ни одного человека, то можно утверждать, что ВСЕ люди, находящиеся в комнате -- французы. Или пингвины. Или что угодно. Вот такие грибы. Зачем понадобилось лепить такое в стандартную библиотеку, окутано глубоким хз. Это просто надо запомнить.
@Amgarak4 ай бұрын
И правда, но не логично как-то..
@nitproject51933 жыл бұрын
8:20 попався джсер)
@t0digital3 жыл бұрын
да вот задолбали они, не могли хотя бы синтаксис комментариев во всех ЯП сделать однородным:)
@RuslanKovtun3 жыл бұрын
@@t0digital так в питоне комменты как в bash, он ведь с ним конкурировал изначально.
@alexandertomilov61653 жыл бұрын
💯 ТОП!🔥 Сделай пожалуйста PDF: было/ стало, чтобы все могли скачать и было всегда перед глазами.
@t0digital3 жыл бұрын
Отличная мысль, сделаем!
@vitalik100500q3 жыл бұрын
В последнем примере можно сделать декоратор который будет генерировать айтемы в этом словаре и навесить его на функции обработчики, а так же дополнительно можно сделать функцию которая будет резолвить это, может быть удобно если структура более сложная, со вложенными словарями
@vladimir_s19613 жыл бұрын
Из серии "хозяйке на заметку" - просто, легко, красиво. Приятно слушать человека, который знает, о чем говорит. Спасибо!
@Namynnuz2 жыл бұрын
Лямбды выглядят чуждо для семантики языка. В шарпее с 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.
@cbrnt41572 жыл бұрын
Декларативный способ подстановки функции супер! Решил проблему, над который давно думал. Спасибо, Алексей!
@C0oo1D3 жыл бұрын
Сразу зачесалось дополнить)) 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)
@alexeisafronov66273 жыл бұрын
Классный урок! Круто было бы послушать про протоколы!
Я заговнокодил первый вариант без дополнительных библиотек и чисто в одну строку)): for num in [input().split() for x in range(1)]:print(int(num[0])*int(num[1])*int(num[2]))
@alexbokuto53532 жыл бұрын
Спасибо! Очень полезно и понятно!
@codelearner17133 жыл бұрын
Видео хорошее, но важно помнить, что коротко, не всегда красиво и читаем. И автор говорит об этом. Не забывайте про pep8
@АндрейЛарионов-ж3э2 жыл бұрын
Видос супер. Бомбезные штуки показаны. Даже знаю где можно в моих проектах это могло бы заменить мой говнокод. Я в python новичок и выглядит всё это очень понятно и внятно, во многом благодаря подаче автора. Выражаю большую благодарность за столь мощный подход к созданию контента.
@pythonofsky45452 жыл бұрын
Думаешь, если ты пишешь по другому, например, перебор в цикле вместо in то твой код уже говнокод? Эти фишки только для профи, которые фигачат на питоне по 8 часов в день и так забадываются, что быстреев одну строку написать, чем цикл или функции расписывать. А на самом деле классический вид и работает быстрее, и читается лучше. Сам иногда грешу всякими тернарниками и лямбдами, а потом мой код никто понять не может... ))
@АндрейЛарионов-ж3э2 жыл бұрын
@@pythonofsky4545 нет, думаю если ты не знаешь синтаксические и общепринятые конструкции, то собираешь велосипед, у которого и педали крутить сложно и руль фиг пойми как работает и колёса в разные стороны крутятся. Ясно правило "Нормально делай - нормально будет", но иногда из-за не знания особенностей различных инструментов лепишь фиг пойми какую чушь. И я тоже за понятный код, но в некоторых моментах всё-таки стоит использовать лаконичные подходы, которые и читаются просто, если знать язык, и не загромождают код ненужной белибердой.
@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)
@mykolakudinov44033 жыл бұрын
Конфигурационный словарь нужно будет согласовывать со списком типов пользователя. Этот вопрос будет решён если вместо строки использовать dataclass(name: str + process_request: Callable) как аргумент __init__ . В таком случае мы можем спрятать вызов process_request с user как аргумент внутри функции класса User.
@mykolakudinov44033 жыл бұрын
Опять таки знаю об этом я только благодаря твои предыдущим роликам
@monkdok3 жыл бұрын
Спасибо за конфигурационный словарь!
@vladimirtalpa53903 жыл бұрын
Смотрю уже в середине ролика и думаю, надо бы написать, чтобы снял про замену if_else на dict_get - а в конце финальный аккорд как раз об этом. Молодец! Крутой мануал для джунов - ведь на собесех постоянно спрашивают об этих фишках. Такой же ролик стоит снять про: @staticmethod @classmethod @dataclass про использование абстрактных классов про синглтоны про конечные автоматы или машины состояний
@vladimirtalpa53903 жыл бұрын
а ещё очень крутая штука это @context. Ее как раз используют в машине состояний , но и не только
@AlexandrSpb10 ай бұрын
Очень полезное видео, спасибо!
@valarg57563 жыл бұрын
В последнем примере с условиями думал нововведение switch и case сейчас покажешь,ан нет, на деле другое исполнение донес :) спасибо, не знал
@C0oo1D3 жыл бұрын
Он же вроде в 3.10, а тут 3.9 =)
@АлексейПротасов-п6э3 жыл бұрын
вообще не вижу какой то пользы от match, передаёшь функции объект, а далее кейсы перехватывают.Всё то же самое можно реализовать условиями.
@andreiosipov27663 жыл бұрын
@@АлексейПротасов-п6э если у тебя более одного elif, то ты движешься куда-то не туда)
@АлексейПротасов-п6э3 жыл бұрын
@@andreiosipov2766 это откуда ты такое взял что elif нельзя употреблять более раза?другое дело если else более раза
@andreiosipov27663 жыл бұрын
@@АлексейПротасов-п6э ты профессиональный разработчик? Работаешь с другими людьми, проходишь код-ревью?
@IgnatikVodichka3 жыл бұрын
Крутая рубрика. Оч крутая. Такого бы по чаще.
@ИванИванов-ж1г1я3 жыл бұрын
Коротко, ясно, без воды 👍
@AntThinker3 жыл бұрын
16:20 Кажется мне, что list(numbers) более читаемо, чем нецелево использованный слайс. И с разворотом то же самое -- есть reversed(). А вообще норм!
@huseeads2 жыл бұрын
Слайсы популярны и используются повсеместно, с их понимаем проблем возникнуть не должно
@vladimirprin2632 жыл бұрын
многое знал, но пару фишек утащу, спасибо)
@kirillmelnikov17005 күн бұрын
Вроде елементарно, но некоторые вещи удивили, спасибо)
@Dmitrii-Zhinzhilov2 жыл бұрын
Алексей, благодарю += 1000 !!
@Rusia-164 ай бұрын
Для факториала подойдет reduce ?
@noookm3 жыл бұрын
Очень круто, очень полезно. Спасибо 👍 большое
@deve1oper2 жыл бұрын
Ну довольно простые приемы, все их я уже знал, кроме последнего, но там можно логически додуматься, хорошо зная питон, однако материал клевый, подача супер, все быстро, наглядно, с объяснениями, супер!
@vachapoluk90353 жыл бұрын
Очень спасибо за формат таких видео!!
@restless_gypsy3 жыл бұрын
Очень базовый и очень полезный видос. Спасибо автору, отличный формат, несешь добро людям )
@bulhi3 жыл бұрын
Знаешь, спасибо тебе Когда-то давно я просто смотрел твои видосы, ничего не понимал Потом через время начал учиться жабускрипт, и спустя пол года устроился Сейчас, спустя 8 месяцев работы, являюсь мидл фулстак разрабом, с зп в 200 рублей Недавно увидел первый лям, и задумался с чего все начиналось и твой видос с реки попал, и все сошлось Спасибо!!
@bulhi3 жыл бұрын
Update: плюс ко всему мне 19)
@romanrrv3 жыл бұрын
Спасибо! Классный туториал получился!
@furiousangel2563 жыл бұрын
Такой код выглядит приятно для глаза и экономит место. Вот только читабельным он является только для того, кто знает эти фишки. Например, если бы я до этого видел увидел конструкцию [::-1] я бы во-первых не понял, что тут вообще происходит, а во-вторых засомневался бы - работает ли оно вообще? Спасибо за интересные фишки конечно, но я лучше потрачу 2-3 строчки кода и опишу последовательность действий в явном виде. Надеюсь мой неведомый потомок скажет мне спасибо :-)
@iiepe19152 жыл бұрын
Когда программировал классы, нельзя было сделать через case?
@sevashpun3 жыл бұрын
Отличный урок! Респект!
@alexpermenev2 жыл бұрын
Кто-то смотрит и удивляется новым для себя возможностям, а я удивлялся все видео тому как легко ты справляешься с vim и каким образом вообще vim понимает до какого символа тебе нужно выделить текст?????!! Врыв мозга просто…
@Vipe_team_43653 жыл бұрын
Возможно стоило также рассказать помимо словарей конфигурации и о существовании ConfigParser'а, все-таки сохранять конфиги нужно также и в моменты "простаивания" программного продукта
@itkrasnodar9563 жыл бұрын
17:34 ПОДСКАЖИТЕ, а чем плохи методы list.copy() и list.reverse() для копирования списка и переворачивания?
@t0digital3 жыл бұрын
ничем не плохи
@itkrasnodar9563 жыл бұрын
@@t0digital Спасибо за ответ, а в производительности работы программы, как считаете, какой метод будет лучше?
@t0digital3 жыл бұрын
у меня нет такой информации в голове, но можете проверить - снять время до выполнения кода, после, проверить, что быстрее отрабатывает и насколько. Думаю, драматичной разницы не будет.
@СамвелПогосян-к1е3 жыл бұрын
print('Василий' if 'Василий' in ('Христофор','Василий') else '') Таким образом можно сократить условие и вывод до одной строчки.Блок else в данном случае обязательный (тут он просто выведет пустую строку если нашего имени не обнаружилось в кортеже)
@alexandrunknown14563 жыл бұрын
Вот таких видосов бы больше
@Ruslantuber3 жыл бұрын
Супер полезно! №8 и №11 сразу забрал в свой скрипт. Знал, что как-то лаконичнее можно, но не знал как.
@daryamachigina1572 жыл бұрын
Как вы красиво все объясняете 😌😃
@АхмедИмадаев3 жыл бұрын
Может ли функция reduce рассчитать знакочередующуу последовательность?
@t0digital3 жыл бұрын
Смотря что такое "рассчитать знакочередующуу последовательность"
@АхмедИмадаев3 жыл бұрын
@@t0digital Последовательность чисел с меняющимися арифметическими действиями,точнее 1-2+3-4+5...n ну рассчитать произвольную n.мне кажется что толдна быть такая функция в питоне,точнее надеюсь)))
@cryptoworkdonkey3 жыл бұрын
Спасибо за хаки. Компрехеншны удобны. К обработке текста нужно привыкнуть. Например в R фильтрация идёт грепом: names = c('Хри', 'Аде', 'Тэя', 'Сте', 'Арх') grep("^А", names, value = TRUE) или конвейером: names %>% grep ("^А", ., value = TRUE) И в ифчиках/фильтрах есть булевый grepl(). Вот прям оч удобно.
@ВікторА-к2й2 жыл бұрын
К сплиту лепить стрип не надо, т.к. сплит уже убрал лишние пробелы. Такая конструкция может применяться в случае если мы в сплит передаем аргумент с конкретным разделителем. Срезы не изменяют список, т.е. конструкция список[::-1] просто возвращает список в обратном порядке, список при этом остался в первоначальном варианте. Для того чтобы развернуть список используется reverse().
@DmitryKravchyna2 жыл бұрын
Первая задача в одну строку)) print(*[x * y * z for x, y, z in [map(int, input().split())]])
@alexanderizotov30113 жыл бұрын
Лучано Ромальо в своей книге "python к вершинам мастерства" писал про то, что вместо функциональщины (map, reduce, lambda-функций) почти всегда можно воспользоваться генератором списка, кортежа или словаря, и это и есть pythonista-style))
@alexanderizotov30113 жыл бұрын
Досмотрел до 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))
@t0digital3 жыл бұрын
Да все используют функциональщину, почти во всех больших взрослых проектах она есть, ибо удобно. А кто не умеет map читать, ну его проблемы, я считаю. Нет ничего нечитаемого в map(str.strip, strings), элементарная конструкция, и если сделать это в comprehension, то код не станет лучше
@13danyocean133 жыл бұрын
О теме с конфигурацией: кроме простой и pythonic конструкции мы также получим сложность O(1), вместо O(n)(при реализации c кучей elif).
Пример, когда all() может вас подставить: all(( hasattr(my_object, "some_data"), my_object.some_data is not None )) all() будет проверять все условия, даже если одно из них уже точно ложное, поэтому если у my_object нет атрибута some_data, при проверке второго условия вас будет ждать AttributeError.
@АндрейРожнов-ш9к3 жыл бұрын
Cпасибо! Очень полезно и наглядно!
@RuslanKovtun3 жыл бұрын
18:40 - в данном случае name не напечатался потому что ожидается ещё один
@КонстантинКомиссаров-ж1э3 жыл бұрын
Про all есть нюанс. В случае перечисления через and проверка остановится, как только встретит первый False. В случае с all будут проверены все элементы. То есть перечисление через and хоть и не такое красивое, но более эффективное.
@andrew_z.3 жыл бұрын
тут дело не в all. all тоже не будет все элементы проверять, если это не нужно: all((print(i) or i
@Michael2010782 жыл бұрын
Мегаполезная подборка. Огромнейшее спасибо!
@ИванКулеш-х9иАй бұрын
Привет из 2024г. К обращению списка могу добавить, что нечасто нам нужен отдельный обращенный список. Гораздо чаще нам нужно обрабатывать исходный список с конца. Тут может помочь функция reversed. Она предоставляет итератор, по которому список просматривается с конца, и не копирует исходный итерируемый объект.
@gatapov3 жыл бұрын
Очень хорошая и понятная подача материала, спасибо! Можете сделать видео о Django signals?
@Darqsatyricon3 жыл бұрын
Интересно псмотреть на покрытие юнит тестами при любви к однострочкам... И что-нибудь услышать про maintainability кода где в одну строку выполняется сразу несколько операций. Ты, наверное, сознательно опустил процесс валидации инпута в первом примере и любой еррор хендлинг. Вобщем, чёт я ожидал большего. Больше выглядит как студенческий код для фриланса нежели продакшн код с какого то нормального проекта или энтерпрайза.
@t0digital3 жыл бұрын
Вот это - нечитаемо: 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) Ну ок:)
@hunya_k2 жыл бұрын
А можно ли в первом случае сделать массив? Чтобы в неограниченные количестве «переменных» вписывать значения после сплита
@t0digital2 жыл бұрын
вот так можно: some_tuple = input().strip().split() в some_tuple будет tuple=кортеж, не list. В видео/PDF там же распаковка кортежа просто показана в левой части. Если нужен именно list, то кортеж надо преобразовать явно в list: some_list = list(input().strip().split())
@hunya_k2 жыл бұрын
@@t0digital спасибо! Ваше видео вдохновило переписать код) (специально видео не искала, в рекомендациях попалось)
@vovchic35932 жыл бұрын
С объёмом можно вообще так написать print(*[x*y*z for x, y, z in [map(int, input().split())]])
@alexsukhykh56663 жыл бұрын
Спасибо за all, any. ))
@wasyaokyn40773 жыл бұрын
Про копирование списка: а метод .copy?
@t0digital3 жыл бұрын
Отработает аналогично [:]
@andrew_z.3 жыл бұрын
а ещё функцией list() тоже аналогичная копия получается.
@wasyaokyn40773 жыл бұрын
@@andrew_z. А тут у меня уже вопрос производительности. По моим замерам (timeit, список на 10 элементов, 10.000.000 запусков подряд, и 5 замеров): b = a[:] -> 0.99-1.01 секунды b = a.copy() -> 0.95-0.99 секунды b = list(a) -> 1.5-1.7 секунды b = [i for i in a] -> 3.8-4.3 секунды На списке в 1000 элементов время у первого выросло примерно до 21 секунды, у второго и третьего выросло до примерно 22 секунд, четвертый прошел за 230 секунд.
@andrew_z.3 жыл бұрын
@@wasyaokyn4077 у первых трёх близкие результаты по производительности. поэтому главное - это какой вариант лучше смотрится в коде, и это "a.copy()", имхо.
@АртурЛагунов-ч6ъ Жыл бұрын
map принимает последовательность вторым аргументом, это ведь несовсем правда, map iterable принимает, это более широкий интерфейс, а sequence это более узкий интерфейс, он iterable (__iter__), sized(__len__) и container(__in__), iterable это может быть и генератор и сопрограмма (Coroutine) это я не поумничать пишу просто мне кажется важным различать ту самую утиную типизацию, где какой минимальный интерфейс необходим, ну и это помогает точно хинты писать, где что надо за материал, большое спасибо, очень полезно
@gustaugutter94773 жыл бұрын
*тидимс* И вот я оставил комментарий в поддержку отличного контента)
@eugene10793 жыл бұрын
Спасибо, видео "пушка". А что за книга была на столе в этом видео?
@kirillkorotkov54063 жыл бұрын
какой font используешь?
@t0digital3 жыл бұрын
Monaco
@RuslanKovtun3 жыл бұрын
6:30 - `from operators import mul` и не надо лямбду писать, ну или `int.__mul__` но это больше текста и читабельность падает.
@drdrdr68353 жыл бұрын
То чувство что сначала сам решал задание а потом смотрел пример, почти все аналогично сделал🤔
@SergMirny_yt2 жыл бұрын
аможем ли элемент тапла сравнить со строкой? в плане, вы кто показали код if sub_string in ("string1", "string2", "string3"). A можно наоборот ("sub_str1", "sud_str2", "sub_str3") in string? вот такой финт че-то не получился у меня.
@t0digital2 жыл бұрын
Английский «in» переводится как «в». Мы проверяем, входит ли sub_string в набор ("string1", "string2", "string3"). В обратную сторону это теряет смысл. Вопрос есть ли монета в кошельке имеет смысл, а вопрос есть ли кошелек в монете - нет.
@SergMirny_yt2 жыл бұрын
@@t0digital Ясно понятно, спасибо. А как тогда можно красиво решить этот вопрос что б не городить конструкцию if (substr1 in string) or (substr2 in string) or (substr3 in string) Можно ли так bool_tuple = (True for substr in substr_list if substr in string else False)? Получаем кортеж булевых значений, затем в ифе проверяем if True in bool_tuple. Но это решение уже в две строки и не имеет смысла (проще через or в одном ифе сделать ))) но если не такой, то может есть другой способ изящный?
@t0digital2 жыл бұрын
@@SergMirny_yt если задача проверить, входит ли одна из строчек в другую строку, я бы сделал так: if any((substr1 in string, substr2 in string, substr3 in string)) Просто, читаемо, понятно для трёх проверяемых подстрок. Если их больше, то можно усложнить: if any(substr in string for substr in (substr1, substr2, substr3, substr4))
@SergMirny_yt2 жыл бұрын
@@t0digital Спасибо. Осмыслю
@andruhaz3 жыл бұрын
Отличное видео, можно сделать серию таких?
@Rusia-164 ай бұрын
Я не понял чем лучше Filter обычного генератора цикла с вложенным логическим оператором? Тоже 1 строка !
@ИванКулеш-х9иАй бұрын
У Лутца написано, что циклы мы пишем на python, а функции map, filter написаны на Си, следовательно, возможно они быстрее работают. Да и без функции строка будет длиннее.
@alexenderius2 жыл бұрын
Предостережение автору. Упрощая, слово group произносится как /груп/. Если произносить /гроуп/, получается слово grope с совсем другим значением, возможно нежелательным в образовательном видео
@Khmeriscool3 жыл бұрын
Очень круто, спасибо
@Yarikorg3 жыл бұрын
Хорошее видео, спасибо. Так глядишь, мне Пайтон зайдет и начну его использовать. Много от Перл там вижу. Не знаю что раньше появилось.
@nikitainiciative3563 жыл бұрын
крутое видео, классно понимать, что о мапе я узнал раньше (вчера)
@ЭдКалумнуз3 жыл бұрын
Думал, что все уже знаю, но узнал про any и all только сейчас, спасибо за видос
@kai.hexenzorn8 ай бұрын
Так в нормальных языках люди смотрят в спецификацию коллекции и обнаруживают у неё все необходимые функциональные методы filter, map, all, every... А в python перевернули всё с ног на голову, и поэтому чтобы узнать о существовании глобальных методов all, any, должно снизойти свыше.
@SaVlaGood3 жыл бұрын
Недавно открыл для себя встроенную функцию eval, с помощью которой последний пример можно уместить в одну строчку. Вот пример: eval(f"process_{client.group}_request(user, request)")
@t0digital3 жыл бұрын
eval потенциально небезопасен - он выполняет произвольный код, надо очень сильно подумать, прежде чем использовать его. Того же эффекта можно добиться без eval, если речь о методах внутри класса: getattr(SomeClass, f'process_{user.group}_request')(user, request). Если речь не о методе класса, а именно о функции - можно достать её из locals(), docs.python.org/3/library/functions.html#locals Но у такого подхода с составлением строки, содержащей имя метода/функции, есть один минус - IDE не отрефачит такой код, если функция будет переименована
@SaVlaGood3 жыл бұрын
@@t0digital Спасибо, раньше об этом как-то не задумывался, но и самой функцией (к счастью) раньше не пользовался.
@VikMoc3 жыл бұрын
Интересное видео, особенно для того, кто только знакомится с python
@nitroflap3 жыл бұрын
Большинство я уже знаю, но все таки, довольно много интересного узнал. Классно! А все таки... когда будет Go...?
@t0digital3 жыл бұрын
Возможно будет раст вместо го:)
@nitroflap3 жыл бұрын
@@t0digital А почему? Гошка же лучше для веба :O
@t0digital3 жыл бұрын
Пока не сложил для себя однозначного мнения по этому поводу. Go проще, это факт, но простота это не всегда лучше
@ЮрийЧебышев-т1ф3 жыл бұрын
@@t0digital вау раст! Слышал много хорошего, было бы интересно