С множествами можно показать ещё возможность создавать новое множество, в котором есть только те значения, которые есть в одном множестве, но нет в другом. Короче подобие битовой XOR операции. {1, 2, 3, 4, 5} ^ {3, 4, 5, 6} -> {1, 2, 6} Помогает когда есть два огромных списка(больше пары сотен значений например), которые должны быть одинаковыми, но по какой-то причине не одинаковы. Вот эти исключения этот приём помогает отыскать :) Очень специфическая штука, пригодится одному из сотни прочитавших, но писать свою реализацию такой операции занимает 10 минут. (У меня из-за невнимательности отняло 40-60)
Уточнение. Функция в пайтон возвращает только одно значение, в примере на видео - кортеж. Да, кортеж может содержать кучу данных, но возвращаемый из функции кортеж - это одно значение. При использовании type hinting (def func() -> tuple:) это становится более очевидным. По-моему, только Golang может возвращать несколько значений.
Добавил бы, что генераторы списка быстрей работают т.к. не выполняется .append. Присваивание lambda-функции, как по мне, противоречит самому её назначению "анонимной функции", и гораздо читаемо будет выглядеть обычный def.
1) NotImplemented в идеале заменить NotImplemented Error и выкидывать как исключение, а не возвращать (raise NotImplementedError), при вызове будет исключение, а не unexpected-behavior. 2) Анонимные функции не стоит использовать часто, в основном используется в map / filter / reduce (Пример: map(lambda x: x ** 2, [1, 2, 3, 4]))
Простые полезные штуки. Про элипсис только не сказал, что он используется для отображения бесконечно вложенной рекурсии. in_me = [1] in_me.append(in_me) print(in_me) # [1, [... ]]
Фокус с преобразованием списка в множество для удаления дубликатов содержит маленькую засаду - множество не гарантирует упорядоченность элементов, а вдруг для вас порядок элементов в исходном списке имеет значение даже при удаленных дубликатах
Я, когда кто-то сохраняет лямбду в переменую: чел, ты... На счёт декораторов: я осмелюсь предположить, что если ты не знаешь про них, то либо ты не разработчик на питоне, а используешь его как побочный инструмент, либо ты совсем новичок Когда возвращаешь много значений из функции, нв самом деле ты возвращаешь кортеж из этих значений Про *args и **kwargs стоило упомянуть, что это в основном для лекораторов, где сигнатуры подменяются. А то налепят своих кваргов, пойди потом разбери что и как в функцию передать надо. Ну и чисто как по мне - вариант произношения ки варгс странное, либо кварги/кваргс, либо уж полностью keyword arg(ument)s
@@zproger Подскажи, пожалуйста, в связи с тем что Heroku прекратил работу на территории РФ, какой бы ты ещё сервер для телеграмм ботов мог бы посоветовать?
Гераторы и списковые включения не одно и то же. Генератор возвращает итерируемый обьект, в то время как list comprehensions возвращает список. Вообще списковые включения это очень приятный синтаксический сахар. А у генераторов есть цель: экономить затраты по ОЗУ.
Любли подобные конструкции [2]+[i for i in range(1,1001,2) if len([j for j in range(1,i+1) if not i % j]) == 2] (выведет все простые до 1000) Бывает напишишь в одну строку такого, что на следующий день без бутылки хрен разберёшься))) Надо делать подобные конструкции либо оч короткие, или лучше вообще использовать for. Ибо читается код чаще чем пишится.
я сегодня узнал что анонимные функции так использовать нельзя "PEP 8: E731 do not assign a lambda expression, use a def" Нужно обьявлять функцию вместо переменной
Одно уточнение. Генераторов картежей в пайтоне не существует. В круглых скобках генерируются итераторы. Именно к ним мы можем применить метод next () ))...
Эммм, называть list comprehension генератором - это жесть и полная дичь. И оправдываться, что мне так удобно говорить еще большая дичь. Генератор выполнятся лениво, а comprehension сразу. Если поставить круглые скобки, да это будет генератор - но это не имеет никакого отношения к кортежам. Честно, совету автору повысить свою грамотность в питончеке в первую очередь, а потом уже вещать на широкую аудиторию.
18 фишек в пайтон, о которых ты знаешь, программируя на пайтон около 6 месяцев. Такие себе фишки. Рассказали бы например, что можно писать не только *args и **kwargs, а например *book **books, про метаклассы, про дескрипторы, вот это фишки, а так видео, ну для очень начинающих
Нееет! Порой заворачивают такие однострочники с лямбдами, что хоть всех святых выноси. Разбираешься в этом нагромождении столько же, сколько в сотне строк. Дай им многострочные лямбды, и код уже никто не сможет поддерживать
ну можно конечно сговнокодить, но если взять тапл и перечислять строки для выполнения, то по сути будет ограниченная многострочность (можно вместо '=' использовать ':=')
@@predatel_rodini def всем хорош. Просто его нецелесообразно заводить, когда нужна однострочная функция, которая больше не будет использоваться в коде.
С последним советом нужно быть очень аккуратным, т.к. при преобразовании списка во множество автоматически происходит его сортировка. Т.е. при выполнении команды list(set([3, 2, 1])) получим список [1, 2, 3]
В множествах (set) элементы не сортируются, они вообще не упорядочены, у них нет индекса. Попробуй заполнить set строками и вызвать print несколько раз, тогда каждый раз элементы множества будут в разном порядке Например: set('1', '2', '3') print(set) 1 2 3 2 3 1 3 1 2 и т.д
Простое лучше сложного, явное лучше неявного, бла бла бла, кококо, а код посмотришь - люди соревнуются как больше кода в строку засунуть, perl косплеят.
ВАУ лист в сет. ВОТ БЫ УЖ НИКОГДА НЕ ПОДУМАЛ. ВАУ ЛЯМБДА. А расскажите про цикл while или f stings или про чтение из файла. Я думаю мало кто об этом знает. (если что - это все жирный сарказм)
С множествами можно показать ещё возможность создавать новое множество, в котором есть только те значения, которые есть в одном множестве, но нет в другом. Короче подобие битовой XOR операции.
{1, 2, 3, 4, 5} ^ {3, 4, 5, 6} -> {1, 2, 6}
Помогает когда есть два огромных списка(больше пары сотен значений например), которые должны быть одинаковыми, но по какой-то причине не одинаковы. Вот эти исключения этот приём помогает отыскать :)
Очень специфическая штука, пригодится одному из сотни прочитавших, но писать свою реализацию такой операции занимает 10 минут. (У меня из-за невнимательности отняло 40-60)
5:45 - list(range(20)) выполняется быстрее [x for x in range(20)], а результат один и тот же.
Уточнение. Функция в пайтон возвращает только одно значение, в примере на видео - кортеж. Да, кортеж может содержать кучу данных, но возвращаемый из функции кортеж - это одно значение. При использовании type hinting (def func() -> tuple:) это становится более очевидным. По-моему, только Golang может возвращать несколько значений.
Ура, мне не придётся это писать)
Спасибо что уже сделал это
А на C++ функции через ссылки и указатели могут возвращать сколь угодно много значений, лол
может, через запятую несколько значений, для приема которы требуется несколько переменных
@@dann1kid и это всё равно будет кортеж
Добавил бы, что генераторы списка быстрей работают т.к. не выполняется .append.
Присваивание lambda-функции, как по мне, противоречит самому её назначению "анонимной функции", и гораздо читаемо будет выглядеть обычный def.
Спасибо за комментарий, он хорошо дополняет видео
1) NotImplemented в идеале заменить NotImplemented Error и выкидывать как исключение, а не возвращать (raise NotImplementedError), при вызове будет исключение, а не unexpected-behavior.
2) Анонимные функции не стоит использовать часто, в основном используется в map / filter / reduce (Пример: map(lambda x: x ** 2, [1, 2, 3, 4]))
анонимные функции прекрасно прокидываютая в колбеки вообщем сахарит код
злоупотребление конечно зло(мапы и генераторы в 2 экрана длиной видали:))
@@renat9933а можно по джунски пожалуйста?😁
А где ты обрабатываешь видео?
Вам привет из Казахстана, начал смотреть Ваши видео - и учиться программированию :)
И вам привет =))
Лайк поставил, жду следующего видео)
=)
Простые полезные штуки.
Про элипсис только не сказал, что он используется для отображения бесконечно вложенной рекурсии.
in_me = [1]
in_me.append(in_me)
print(in_me)
# [1, [... ]]
Ку, что за редактор ты используешь??? Красивый
Хочу вас попросить, а будет ли такая возможность сделать несколько видео про ассинхронный python
Будет, обязательно сделаю видео =)
@@zproger спасибо большое, ценю такой качественный контент, очень нравиться ваш подход к видео роликам, обязательно продолжайте в том же духе
Фокус с преобразованием списка в множество для удаления дубликатов содержит маленькую засаду - множество не гарантирует упорядоченность элементов, а вдруг для вас порядок элементов в исходном списке имеет значение даже при удаленных дубликатах
Я, когда кто-то сохраняет лямбду в переменую: чел, ты...
На счёт декораторов: я осмелюсь предположить, что если ты не знаешь про них, то либо ты не разработчик на питоне, а используешь его как побочный инструмент, либо ты совсем новичок
Когда возвращаешь много значений из функции, нв самом деле ты возвращаешь кортеж из этих значений
Про *args и **kwargs стоило упомянуть, что это в основном для лекораторов, где сигнатуры подменяются. А то налепят своих кваргов, пойди потом разбери что и как в функцию передать надо. Ну и чисто как по мне - вариант произношения ки варгс странное, либо кварги/кваргс, либо уж полностью keyword arg(ument)s
Привет,а что за линукс дистрибутив у тебя?)
дженту
Zorin OS
Боже, как всегда лучший!
😉
@@zproger Подскажи, пожалуйста, в связи с тем что Heroku прекратил работу на территории РФ, какой бы ты ещё сервер для телеграмм ботов мог бы посоветовать?
Спасибо, и правда отлично! Лайк от СЕООНЛИ
На счёт дата класса, ещё есть именнованый картеж, тоже классная штука
6:29 можно использовать range(x)
Спасіба за відео.
Рад что понравилось
Круто, я не знал, что * и ** это про распаковку, не смотрел на это именно таким образом
Гераторы и списковые включения не одно и то же.
Генератор возвращает итерируемый обьект, в то время как list comprehensions возвращает список.
Вообще списковые включения это очень приятный синтаксический сахар. А у генераторов есть цель: экономить затраты по ОЗУ.
Согласен, это разные вещи. Я подразумеваю генератор как "генератор значений", а не технологию из Python
Один из лучших!!!
Благодарю!
Любли подобные конструкции [2]+[i for i in range(1,1001,2) if len([j for j in range(1,i+1) if not i % j]) == 2] (выведет все простые до 1000) Бывает напишишь в одну строку такого, что на следующий день без бутылки хрен разберёшься))) Надо делать подобные конструкции либо оч короткие, или лучше вообще использовать for. Ибо читается код чаще чем пишится.
Спасибо за отличное видео, автор вы молодец =)
Благодарю!
У вас программа вывода аудио - информации зациклена по 3 - 4 раза, повторяете 1 и тоже. Выходите вовремя из цикла. Или не пользуйтесь ВАЙЛ.
Не вайл а вхиле
Спасибо за работу, лайк для продвига
Благодарю
Спасибо огромное!!!
Благодарю за фишки!
Я год учусь, усердно и о всём этом знаю, контент хороший продолжать в том же духе
Так держать =)
ну, это круто что ты все это узнал всего за год
харош, удачи
А еще из интересного, в Python 3.8 добавили оператор :=
Пример:
x = 4
if (y := x) == 4:
print(x, y) #output: 4, 4
Еще pattern matching - интересная тема. Добавлен в Python 3.10
Да, об этих темах есть видео на канале:
th-cam.com/video/ZBv-G4vxxyc/w-d-xo.html
th-cam.com/video/jIFeDDf69Uk/w-d-xo.html
анонимные функции решают проблему с блокировками при асинхронной работе
6:14 Можно еще заменить вторую запись этим: res2 = list(range(number))
😎
[*range(x)]
Спасибо за фичи🔥
Какая у Вас тема в VsСode?
Dracula
@@zproger 🙂
Благодарю! 🔥
=)))
я сегодня узнал что анонимные функции так использовать нельзя "PEP 8: E731 do not assign a lambda expression, use a def" Нужно обьявлять функцию вместо переменной
потому что лямбда нужна там, где требуется обьект функции и с не очень большим функционалом, в остальном же лучше использоваться обычную
Неплохо =)
@@brothersstudio3566 не тут написано точно do not assign a lambda expression, use a def
Спасіба, elipsis я найшов шо ти робиш!
:)
2 полезные фишки, но для новеньких (хз как назвать тех, кто даже до начинающих не дотягивает) я бы добавил контейнеры.
Одно уточнение. Генераторов картежей в пайтоне не существует. В круглых скобках генерируются итераторы. Именно к ним мы можем применить метод next () ))...
Во-первых, кОртежей. Во-вторых, не итераторы, а генераторы, к ним и применяется метод next.
ооо...
помню, в детстве была олимпиадная (паскаль) задачка. поменять две переменные местами, не использую третью.))
а питон так просто может
спс. большая часть знакома. просьба когда-нибудь включить кратко-тезисное разъяснение оператора & (который НЕ &&). thx ещё раз.
Спасибо
Гугл перевод Зен Пайтона это нечто
Супер! Спасибо.
=)
7:55 Я тебе щас руки оторву
res2 = [x for x in range(0, 20, 2)]
А можно каждого слово было повторить не 30 а 1000 раз к примеру? Пришлось ставить скорость 1,5 чтобы как то усвоить смысл .
Про елипсис не знал) Всегда пользовался pass
круто =)
Спасибо
;)
Yield и from можно прикольно комбенировать
Эммм, называть list comprehension генератором - это жесть и полная дичь. И оправдываться, что мне так удобно говорить еще большая дичь. Генератор выполнятся лениво, а comprehension сразу. Если поставить круглые скобки, да это будет генератор - но это не имеет никакого отношения к кортежам. Честно, совету автору повысить свою грамотность в питончеке в первую очередь, а потом уже вещать на широкую аудиторию.
Про this я знаю.
=)
Не троеточие, а МНОГОТОЧИЕ!
ок =)
Никто никогда не оскорблял слово ''this'' тем, что произносил его как ''зис'' 🤣🤣🤣🤣🤣🤣
... if ... else ... if ... else ...
18 фишек в пайтон, о которых ты знаешь, программируя на пайтон около 6 месяцев. Такие себе фишки. Рассказали бы например, что можно писать не только *args и **kwargs, а например *book **books, про метаклассы, про дескрипторы, вот это фишки, а так видео, ну для очень начинающих
Про датаклассы было полезно
Благодарю
Что интересно, Доусон об этом всём не пишет
что за доусон
list comprehension - это не генераторы, а генераторы - это генераторы, это очень неправильное удобство
Согласен, стараюсь от этой привычки избавится =)
Но тут скорее генератор не в прямом смысле, а именно как технология которая генерирует значения
Я только учусь писать код, зачем я это смотрю?
Чтобы сразу писать правильно =)
Всё знаю из этого)
Правда жалко, что Гвидо отказался делать лямбду многострочной, очн не хватает порой(((
Было бы неплохо =)
Нееет! Порой заворачивают такие однострочники с лямбдами, что хоть всех святых выноси. Разбираешься в этом нагромождении столько же, сколько в сотне строк. Дай им многострочные лямбды, и код уже никто не сможет поддерживать
ну можно конечно сговнокодить, но если взять тапл и перечислять строки для выполнения, то по сути будет ограниченная многострочность (можно вместо '=' использовать ':=')
@@predatel_rodini def всем хорош. Просто его нецелесообразно заводить, когда нужна однострочная функция, которая больше не будет использоваться в коде.
Блин, ну все хорошо, но фраза «троеточие» ну ваще позор режет слух... многоточие, многоточие же это, какое нахрен троеточие 😤
Шеститочие 😁
😄 блин, в комментарии своём слово «позор» не его писал, только сейчас увидел 🤦🏻♂️, должно было быть «просто»
С последним советом нужно быть очень аккуратным, т.к. при преобразовании списка во множество автоматически происходит его сортировка.
Т.е. при выполнении команды list(set([3, 2, 1])) получим список [1, 2, 3]
В множествах (set) элементы не сортируются, они вообще не упорядочены, у них нет индекса. Попробуй заполнить set строками и вызвать print несколько раз, тогда каждый раз элементы множества будут в разном порядке
Например:
set('1', '2', '3')
print(set)
1 2 3
2 3 1
3 1 2
и т.д
EBI RCI BUS
=)
Многоточие, а не троеточие
Простое лучше сложного, явное лучше неявного, бла бла бла, кококо, а код посмотришь - люди соревнуются как больше кода в строку засунуть, perl косплеят.
☯☯☯☯☯
ВАУ лист в сет. ВОТ БЫ УЖ НИКОГДА НЕ ПОДУМАЛ. ВАУ ЛЯМБДА.
А расскажите про цикл while или f stings или про чтение из файла. Я думаю мало кто об этом знает.
(если что - это все жирный сарказм)