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