Самый СТРАННЫЙ оператор в Python (основные фишки и ошибки с walrus operator)
HTML-код
- Опубликовано: 4 июн 2024
- ⭐ Курс ООП и Приват канал: www.zproger-school.com/?...
⭐ Мой телеграм канал: t.me/+7INN3ABOEnk1ZGIx
⭐ Телеграм канал из видео: t.me/+i-oKNJt75rowNWVi
В данном видео мы рассмотрим очень странный оператор Python, который добавили в релизе Python3.8. Многие вообще не знают о его существование, но он призван упростить нам написание кода и избавить от ошибок.
Но как бы это странно не звучало, в некоторых моментах он эти ошибки наоборот добавляют, поэтому в этом видео мы рассмотрим как и возможности оператора, так и ошибки, которые часто совершают новички, используя возможности оператора моржа.
📁 Документация walrus operator: t.me/codeblog8/133
📁 Github: github.com/Zproger
📁 Все плейлисты с уроками: bit.ly/39GaY89
📁 Связаться со мной: zproger777@gmail.com
📁 Поддержать криптовалютой: github.com/Zproger/donate
Тайм-коды:
0:00 - Новый странный оператор
0:55 - Как работает оператор моржа?
1:26 - Странные записи walrus оператора
2:00 - Зачем добавили этот оператор? Почему не расширили оператор присваивания?
4:06 - Оператор моржа это синтаксический сахар?
4:46 - Пример использования в условиях
6:15 - Использование в циклах для ввода данных
7:16 - Настоящее предназначение walrus оператора в python
9:28 - Интересный пример использования
10:04 - Разбираем популярные ошибки с оператором моржа
11:40 - Где глубже изучить этот оператор?
Если кто знает интересные фишки с этим оператором,
не забудьте поделиться в комментариях =)
Принципиальная разница между := и = в том, что первый оператор определяет выражение, а второй - инструкцию. Поэтому как и должно при использовании выражений возвращается результат обработки выражения. С инструкциями такое не прокатывает, потому что инструкции не могут никаких результатов возвращать (это не их роль).
"Проблемка" в Си (и многих наследниках) была в том, что там оператор = являл собой и инструкцию и выражение в зависимости от контекста использования.
a = 5; - инструкция присваивания.
if (a = 5) ... ; - выражение (a = 5) в инструкции (условной оператор).
Да, при неопытности или рассеянности это может приводить к проблемам, при перепутывании операторов = и ==, например, в условном выражении.
В Python = является только инструкцией и никак иначе (следовательно, возвращать значения не может), поэтому если бы вернули "фишку" классических Си-подобных языков с оператором инструкции и выражения в зависимости от контекста, то это было бы не в духе Python, в котором стараются в максимальную однозначность и т. п.
В print(a=5) "проблема" в том, что интерпретатор даже не может предположить, что ты с какого-то хрена будешь пихать инструкцию в качестве параметра в функцию. Поэтому, разумеется, ищется подходящий аргумент.
Ну, а для наглядной разницы что происходит и какие проблемы могут быть при недостаточном опыте или непонимании что-то типа такого:
Первый фрагмент.
if a := False and (b := True):
print('a = ', a)
print('b = ', b)
print('a = ', a)
print('b = ', b)
Второй фрагмент.
if a := True and (b := False):
print('a = ', a)
print('b = ', b)
print('a = ', a)
print('b = ', b)
Третий фрагмент.
if a := True and (b := False):
print('a = ', a)
print('b = ', b)
print('a = ', a)
print('b = ', b)
Четвёртый фрагмент.
if a := False or (b := True):
print('a = ', a)
print('b = ', b)
print('a = ', a)
print('b = ', b)
Пятый фрагмент.
if (a := False) or (b := True):
print('a = ', a)
print('b = ', b)
print('a = ', a)
print('b = ', b)
Поэтому с данным оператором надо быть внимательным. Особенно стоит обратить внимание на 4-й фрагмент и сравнить с 5-м.
Классное видео, очень полезное спасибо :)
ну как же, он позволяет оставлять рожицы в комментариях к программе: # :=)
@@grigoriikuchumov2277 по-моему код, в котором есть неоднозначности стоит признать говном. Поэтому даже зная приоритет выполнения инструкций/выражений, всё-равно считается хорошим тоном ставить скобки. В конце концов, синтаксический сахар должен быть сладким, а не превращать одностроку в горький ребус. Поэтому наверное и цикл FOR будет жить вечно в кодерской среде - он прост и понятен как два пальца.
Всё обобщается фразой:
Оператор сохраняет значение в переменную и одновременно его возвращает
Да, но если я так скажу и сразу закрою видео, никто не поймет ничего)
@@zproger что не понятного?
@@rad9587 думаю многие если услышат такое объяснение просто скажут "зачем? можно же просто просто сначала присвоить переменной, а потом использовать переменную"
@@qvar7449 мне лично уже с превьюшки было понятно, что делает этот оператор, хотя программирую на расте
Честно говоря, странно, что обычное присваивание не возвращает присвоенное значение, в отличие от Си, не смотря на то, что Питон на Си и написан. Хотя цепное присваивание `a = b = c` в Питоне есть
Определение назначения фактически отсутствует, сплошные иллюстрации. Наглядность - это замечательно, но строгость описания не менее важна.
Я лично услышал в данном ролике что-то вроде: «Если мы напишем «print(x:=1)», то значение 1 запишется в x, то есть это - всё равно, что написать «print(1)»...» - как-то невнятно. Должно же, как мне кажется, описание звучать как-то так: «Данный оператор присваивает переменной значение и возвращает его», - и уже дальше можно пускать примеры, так будет и строго, и наглядно.
согласен, видно что автор то сам понимает что говорит, а вот мне непонятно, хотя я уже второй год работаю
Пример с двухчасовой функцией реально дал понимание нужности этого оператора. Остальные примеры тяжело понять, в особенности со строкой startswith поскольку там генератор в любом случае пройдётся по всему списку
Не, any "ломается" на первом True
Проблема высосана из пальца. Элементарно всё решаетcя и без моржа.
@@romansovetskikh7902 да, решается, просто моржовый оператор изначально создавался как сахар, а не принципиально новый подход
Более подробно в документации описали, оператор хоть и достаточно простой по своей логике, но примеров кода очень много и не всегда удается понять с первого раза.
@@user-pz9ju6ss7r ну, такой себе сахар, с огромным содержанием горчицы. Операции присвоения и возврата гораздо интуитивно понятнее. Когда перед тем, как съесть сахар, надо подумать пару дней, явно лучше съесть проверенное несладкое за 5 минут - иначе с голоду помереть можно.
На 7:30 мы имеем дело не с генератором а с (list comprehension - строковые включения)
f_data = [y for x in data if (y := test(x)) != 4]. данная запись при вызове type(f_data) вернет .
для того что бы создать генератор используется подобная запись, только в круглых скобках:
f_data = (y for x in data if (y := test(x)) != 4) - тот же type(f_data) вернет , с которым работают через вызов next(f_data)
Отличие этих двух записей очень большое.
Так что правильнее будет сказать, что данная запись генерирует список, но генератором не является
По поводу примера while (value:= input()) != "" можно же красиво упростить:
while name := input("Name:"):
print(name)
тот случай когда быстрее прочитать чем посмотреть ролик до конца ) но спасибо за наводку )
Пожалуйста =)
ZProger, пожалуйста, давайте больше конкретики в видео, не обходитесь одними иллюстрациями. Без четкого и ясного определения функции намного сложнее понимать ее применение. Пожалуйста, уделите больше внимания разбору примеров
Очень много повторений, можно было сократить видео раза в 2
Спасибо, учту в следующих видео и постараюсь не повторяться
Спасибо очень помогаешь с учёбой по языку Python!!!;)
Это хорошо =)
Очень полезная информация для новичка, все подробно и просто розложено. Спасибо что делаете подобные видео, ждем другие:)
Благодарю!
АРГХХ, БЛДЖАД! Это можно было сказать тремя фразами: кейс 1 - присваивать значение переменной в условиях (в С-стиле, но без его недостатка), кейс 2 - перестать делать for y in [fn(x)] в comprehension'ах, и кейс 3 - конфликт синтаксиса присвоения внутри аргумента функции и именованных аргументов функций
Если язык С влияет на Питон - возникает обоснованный вопрос о целесообразности существования этого самого Питона. лол.
Оператор для собеседований
Тоже верно)
03:31 знаем знаем) так меньше шансов ошибится. Вместо равенства можно случайно указать присвоение переменной и тогда это будет совсем другой код. Такая запись лишает нас возможности присвоения. У этой фишки есть название, но я не помню его)
Yoda notation я подозреваю. Но обычно в ООП таким образом ещё и избавляются от nullPointerException
Да, опасная штука :)
Насколько я знаю компилятор gcc с параметром -Werror не даст скомпилировать код если нарисать if x=5, оно покажет ошибку.
Видео полезное, спасибо. Особенно про производительность при двойном вызове функции.
я правильно понял, что он работает как и обычное = ,но вмести с тем возвращает присвоенное значение.
Да
Ого, сперва подумал, что вообще показалось, что ты попросил 600 лайков... Но это же действительно странно, что такой полезный канал так не популярен!
Будем исправляться =)
Доброго дня, хорошего настроения.
Есть интересная особенность, которая к сожалению не касается моржового оператора.
Хотелось бы получить ответ на следующий вопрос :
Почему конкатинируются строки в листе?
Пример следующий:
temp=['i','love',
'the '
'Python','very','match'
'!!!']
print(temp)
Ожидание: что это за оператор
Автор: сейчас я расскажу как его можно использовать
p.s. прошла уже половина видео и я так и не понял
:0
Спасибо за полезное видео! Но надеюсь люди догадываются, что в 7:28 не генератор, а просто list comprehension. синтаксис генаратора вместо [] использует ().
Про print(num = 1) было интересно👍
простите мне мою невежественность , а как вы сделали != "" перечеркнутым? Я только начинаю учится. Это только в пайчарме так можно?
IDE сама так форматирует для красоты =)
Спасибо! Очень хорошо и доходчиво
Рад что Вам понравилось
Спасибо за ответы на "основные вопросы", которые запутали все окончательно...
я старался =)
вот, сначала нарушают основные принципы программирования - плодят сущности, а потом вынуждены плодить их еще больше из-за именованных аргументов ))))) а как удобно в JS паровозиком присваивать: a=b=1;if(x=a==b)alert('x='+x) счастье порой так близко...
Но ведь результат работы двухчасовой функции можно предварительно присвоить в переменную и потом сравнивать как угодно без повторного вызова. Как понимаю, := дает только возможность визуально сократить код на строку присваивания.
Это чисто пример, чтобы понять суть оператора.
А так да, оператор частично создан чтобы улучшить код и добавить новый функционал.
В случае while это уже выльется в бесконечный цикл с прерыванием по значению
Крутая штука, главное предупреждать команду перед использованием, а когда пишешь сам то просто быть внимательным :)
=)
Если есть функция которая выполняется два часа, наверное следует её переписать на С++ или по крайней мере на Cython
Это да, я чисто для простоты понимания сделал такой пример
Это полезно для codewars и leetcode, мне этого точно порой не хватало, но с другой стороны, если это необходимо, значит что-то изначально не так
А если и с++ функция работает два часа, тут уже никуда не убежишь :)
Тем временем функция
class Supermatem:
Def reshala(aboba, nanana, sss)
time. sleep(7200000)
return "сложна, очень сложна"
Вы знаете язык программирования Cpython? Не слышал о таком
Спасибо Вам, очень понятно и лаконично👍
Благодарю! Буду стараться и дальше =)
Зачем ты врёшь? И зачем автор это лайкнул? Я просмотрел уже 8 минут и особенно мой мозг взорвался на примере с if, потому что я не могу понять, зачем это нужно
насчёт понятно спорный момент
Оо, спасибо, что увидел мой комментарий :]
Пожалуйста, я все крутые идеи реализовываю =)
Да за шо) Вот смотрю видео и так затягивает, что хочется смотреть ещё и ещё и те видео, которые выходят во всплывающих подсказках) И так уходит незаметно полдня) Автору спасибо за топовые контенты, которые он пилит для нас)
Спасибо за инфу)
Чисто сахар, чтобы писать в меньшее количество строк)
Ага) Но сахар достаточно опасный в некоторых случаях =)
Очень много "воды", но многие говорят, что "воды" очень много, совсем много, что просто капец, ведь можно было без "воды", которой очень много, сказать лишь суть, которая без "воды".
но кстати этого оператора мне часто не хватало, даже подумать не мог что он есть ещё и с версии 3.8
Пайтон не перестает удивлять :)
спасибо, стало понятнее. пример бы наверное сделал через filter. хотя может через моржа и правильнее
Можно разные примеры делать =)
Огромное спасибо. Это было очень интересно и познавательно
Рад что принес пользу =)
Круто! Но больше всего мне стало интересно этот как вместо != зачеркнутое равно поставить, это какуюто комбинацию клавишь надо прожать или только в пайчарме актуально?
Тоже интересно. Нашли, как это сделать?
Попытался скопировать знак ≠. Не работает
Супер, очень полезная вещь!
Благодарю
А как взять записать ресурсы с одного екзешника другой я знаю что есть секция .rsrc реально ли ее взять с 1го файла и переписать в 2й екзешник что бы у него были там иконка, манифест , версия такие как у 1го файла и что б он работал как раньше?
Реально, но я не знаю как это сделать в Python, потому что тут всё оборачивается в рантайм, и там сложно найти какие-то ресурсы
Раз речь про .exe, то речь не о питоне, либо про питон, но с нестандартным транслятором, где полученный результат будет работать даже если удалить его из системы
скопировать в другой то действительно можно, только смысл, если это никакого положительного результата не даст? Это будут тупо неиспользуемые данные
Удобно, вызвал один раз функцию и проверил и присвоил))))
Сам изучаю питон 3 недели и случайно узнал моржевом операторе.
Тема крутая, но мне пока очень трудно найти правильное использование.
Думаю ещё придет время =)
3:35 - так пишут, чтобы по ошибке не написать в условии оператор присваивания. Про крайней мере меня так учили)
Отличное видео, спасибо!
=)
я сначала подумал это Turbo Pascal
тьфу тьфу тьфу
Скажи пожалуйста как называется твоя тема pycharm?
Dracula
Спасибо! Видео оказалось очень полезным!
=)
а главное понятным
Сначала перепутал с ключ значением в генераторе словаря {i: = value for i in range(n)}, оказалось немного другое 👍
Информативно. Круто мне понравилось.
Благодарю!
Пригодится во всяких генераторах, к примеру каждый вызов увеличивает возвращаемое число на 1
Те кто на C/C++ пишут не путают = и ==.
И я бы никогда так как предлагается не писал, некрасиво, лучше сущность сравнивать с чем то, а не наоборот.
Простой пример
if(men.age == 5) //если человеку 5 лет
if(5 == men.age) //если 5 человеку лет. Вы серьезно так думаете и говорите?
То что касается питона, хорошие примеры, подробно и понятно
Добрый день! Почему у Вас не равно записано не != , а перечёркнутое равно? И как так делать?
полезная вещь для изоляции переменных в блоках как условие или цикл. Что-то наподобие лямба функций, аргументы нужны лишь временно и не нужно дублировать и везде расставлять.
Большое спасибо за видеоролик!
Рад что понравилось
Классный ролик, все понятно, пусть я почти и не знаю информатику и питон в частности(((
Спасибо автору, видео супер=) и если можно не ускоряйте видео сами, кому надо могут это сделать средствами ютуба, а замедление вашего видео звучит ужасно(((
В каком плане не ускорять видео? Именно моменты где я пишу код?
После ответа попытаюсь исправить, чтоб было комфортней смотреть
@@zproger нет, код норм. Просто я речь вашу не успеваю осмысливать, может я тормоз=(. Привык к темпу Немчинского. Для меня вы рассказываете слишком быстро. На 0.75 поставил скорость и стало норм. Возможно мне нужно периодически останавливать воспроизведение и думать.
@@IvanIvanov-dh3sg мне наоборот кажется что автор медленно говорит. Ставлю 1.25 чтобы не уснуть
Я о том же, посмотрите мои видео раньше, они были в 3 раза медленнее, там дольше 20 секунд никто не смотрел) Если буду снимать в стиле Немчинского, то видео будут юзать для того чтобы заснуть, а не выучить Python :)
это конечно здорово, но я видел две двойных рекламы и получил очевидный ответ в конце. короче, спасибо кэп, лай не ставил
Я вообще не понимаю какую рекламу вы здесь увидели, если её тут нет
Ууу! До 8:30 думал - "что за ерунда", а потом как понял!
Спасибо!
Это точно)
Прикольно )) Как вы сидите на зорине, посидел 3 дня, меня убила дерганая анимация и это на версий за 39 долларов ;p
Не сижу, это чисто для видео)
@@zproger а что у вас за система на основной машине? я стараюсь вам подражать и сидел на минте как вы, потом увидел zorin решил поставить, но эта анимация меня просто убила (
Мне Manjaro Gnome нравится =)
@@zproger бегу ставить :p
для any пример надо было с еще # добавить что типо любой с # столько сколько будет стока и принтанет... ну так для просто ясности
а так да спасибо класная штука все помню как то парился как в j for j in list чето присвоить )) потом друг скинул новое в питоне ссылку на это и я прям порадовался ) но так и не применял потом ))) ахахаз
Спасибо, одни из лучших среди лучших
Спасибо
отлично, спасибо за видео
Спасибо за поддержку!
очень интересный акцент, никогда такого не слышал.
;)
Спасибо Автор)
Не знал про это(
Рад что было полезно!
Интересно на питоне инъекции шел кода и в частности Shellcode Reflective DLL Injection
Интересно, но ютубу такое не понравится
Если бы в print() был аргумент **kwargs и метод работы с ним, то он прекрасно бы кушал print(x = 1).
Python дошел до стандарта С++11 с инициализацией переменных, получается
:D
Спасибо за видео!
Часто использую этот оператор именно в if statement, больше нигде
Спасибо большое, хорошее видео
Рад что понравилось!
Только узнал, что питон написан на C...
=)
Доброе время суток. Я что-то не понимаю. Почему в питоне нельзя писать так f_data = [y for x in data if(y = test(x)) != 4].
prtint() просто нельзя сделать присвоение в рандомно переменную. Хотя в чем тут проблема я честного говоря не понимаю. В том же C# это можно сделать. А тут то что не так ? По идее просто происходить присвоение значения. А потом эта переменная проверяется в условии.
Классно объяснил оператор моржа, но меня смутил знак неравенства ≠, интерпретатор пайтон это понимает? и что надо сделать, чтобы это работало? почему не стандартный знак != неравенства?
сам глаза округлил..правда не ас в питоне.
Это так редактор кода форматирует) А на деле там обычный !=
что это за странный оператор не равно? 06:44
Это так IDE форматирует =)
@@zproger а, фух🙈
@@zproger А не подскажите, как называется плагин на такое форматирование? Очень понравилось, хотелось бы себе поставить
Очень крутое видео! Хотелось бы больше видео по селениуму. Особенно разбор оператора if с driver.find_element
Постараюсь что-то придумать =)
А что там вообще рассматривать, если заданный элемент нашелся if срабатывает, это обычный if, что вы от него еще хотите?
Python медленно превращается в Pascal.
возможно
Насколько я понял, это аналог оператора = из C
Можно сказать и так, но walrus operator более функциональный
это моржовый оператор, больше используется для написания кода в строчку
этому оператору уже два года
python 3.8 Release Date: Oct. 14, 2019
Ну так никто и не говорил что он новый =)
Мало кто снимает об этом операторе и хотелось что-то интересное рассказать
@@zproger 6 секунда, вы говорите новый оператор. разрешите дое*** :)))
Упс, что-то не то сказал значит
Аж на 12 мин ролик о том, что объясняется одним предложением . Моржовый (walrus) оператор, появившийся в Python 3.8, дает возможность решить сразу две задачи: присвоить значение переменной и вернуть это значение, поэтому порой можно написать код короче и сделать его более читаемым, и он может быть даже более эффективным с точки зрения вычислений.
Генераторы делаются в круглых скобках.
да, речь о других генераторах, не о технологии из языка
@@zproger не знаю как там в русскоязычной терминологии, но впервые встречаю что лист компрехеншены называют генераторами, генераторы это принципиально другая вещь.
Дядь, как у тебя неравно записалось как перечеркнутое равно? Оно же как то так записывается: !=
Это так форматирует IDE для красоты =)
Годно Годно )
Благодарю =)
Си'шники наныли, базарю =)
100%
Тема для пайшарма очень симпатичная. Как называется?
Github Dark
@@zproger спасибо
Спасибо большое
Рад что понравилось
... хоспадеблять ... если не знать школьных основ информатики, программирование воспринимается на грани с магией ((( вайтивайти из слесарей дворников продавецпятерочки ((
xDD
@@zproger ... сорян, на пике Балмера был походу, не помню что хотел сказать этим
70% ролика ВОООООООООООДЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ, как душно, просто пздц(
Классика Си: (c = getchar()) != EOF.
:D
как использовать такую запись ≠ вместо != ?
Никак, это редактор кода форматирует :)
material theme установи
А почему у тебя на 6:30 вместо != Поставлено ≠ ?
Это редактор кода так делает для красоты)
@@zproger понятно
я вот не понял num вообще не имеет значения и тут получается хочешь присвоить ему 1?
спасибо очень полезно начинающему
8:48 вроде python это оптимизирует для одинаковых значений
Это в новой версии python добавили?
Да
Если много писать на питоне - можно заработать синтаксический диабет
100% xD
Три минуты говорить "почему же мы делаем так, хотя могли бы сделать вот так?" - это искусство. Фулл видео ниасилил.
С := понятно, а как ты символ зачеркнутого равно написал? Что это такое вообще? != ?
Это IDE так форматирует =)
Очень затянуто.
а какая у тебя тема в PyCharm?
Material UI - Github Dark
@@zproger спс
Из какого Го?! Я узнал про этот оператор из Борланд Паскаль!