Обучающий курс: stepik.org/cou... Подробно объясняется как работают операторы * и ** для упаковки и распаковки произвольных итерируемых объектов. Telegram-канал: t.me/python_se...
Сергей, спасибо. Добавлю можно создавать список из кортежа чуть по другому синтаксису(без звездочки перед range): d = 5, 10 print(list(range(*d))) #[5, 6, 7, 8, 9]
3:04 А вот так можно: (*x,) = 1,2,3 # x=[1,2,3] *x, = 1,2,3 # x = [1,2,3] [*x,] = 1,2,3 # x= [1,2,3] Но нельзя упаковать во множество (порядок элементов во множестве не задан, поэтому позиционное сопоставление не имеет смысла). {*x,} = 1,2,3 # SyntaxError: cannot assign to set display Хотя преобразовать список или кортеж во множество можно: x = set((1,2,3)) x = set([1,2,3])
Потому-что в Питоне куча уродливых костылей. Несмотря на его циничный Дзен, первые 4 пункта: 1) Красивое лучше, чем уродливое. 2) Явное лучше, чем неявное. 3) Простое лучше, чем сложное. 4) Сложное лучше, чем запутанное Я когда начинал изучать Питон и прочитал Дзен, сразу воодушевился - ну наконец-то кто-то все костыли выгреб и создал то что все ждали. Потом ждало несколько разочарований, первое самое сильное - оператор присваивания и равенство = и == как в си. В какой-то версии появилось := с поведением как = в си, и это назвали развитие языка. Ага, Гвидо не знал про Паскаль и си. И еще: - кортеж из 1 элемента (1,) - запятая нужна! - множество задается в фигурных скобках, но пустое множество скобками не задать (надо set()), иначе получится пустой словарь , другие последовательности строку кортеж и список можно - генераторные выражения для списка и множества можно задавать своими скобками, а для кортежа надо tuple() - вот опять же звездочки по-разному в разных местах - почему присваивание *x = [1,2,3] нельзя? (в функции это можно а также можно y, *x) - зачем нужно двоеточие в функциях после заголовка? там же далее идет первый отступ? для однострочной функции? дак жестко задать тело функции с отступа и все! - pass для пустого тела функции и циклов - костыль потому-что нет скобок - кортеж можно задать в скобках, можно бех скобок, но не всегда - Зачем вообще нужен кортеж, это кастрированный по возможностям список. Ну экономит память и быстрее работает? Да плевать, Питон и так медлителен он же интерпретатор. Ну и что-то еще. Не, Питон в чем-то очень даже хорош, но от костылей блевать хочется.
@@eugenedukatta9355 спасибо за ответ, интересно было почитать. Я, как начинающий, все эти вещи просто принимаю как данность, тк сравнить не с чем, но судя по тому что вы написали становится понятно, что всё могло быть лучше.
Композитор наверное был такой Балакирев прошу прощения имени не вспомнил. У вас что-то есть такое, что связано с классической музыкой. Извините если мои мнения не достоверны
Если a=[1,2, 3] или a=[1,2,3] или a={1,2,3} то попытка распаковать: (*a) # ошибка, запятой нет, поэтому скобки не задают кортеж, а просто обычные скобки в выражении, т.е это просто *a - бессмысленное выражение (*a,) # (1,2,3) Запятая означает ,что нужно распаковать для создания кортежа [*a] # [1,2,3] Скобки [ ] означают ,что нужно распаковать для создания списка {*a} # {1,2,3} Скобки { } означают ,что нужно распаковать для создания множества
Упаковка в любом случае происходит в список, а также упаковка во множество приведет к ошибке. Комментарий выше от Олега Комелева: "Однако упаковать во множество нельзя (порядок элементов во множестве не задан, поэтому позиционное сопоставление не имеет смысла)."
@@podgorniy.r Вот это и интересно: упаковывается всегда в список, хотя можно при упаковке указать [ ], а можно ( ,); а распаковать можно хоть в список, хоть в кортеж ,хоть во множество.
@@olegkomlev почему упаковка идет только в список ответа нет даже в документации. Думаю причина в том, что это самый подходящий тип данных для данного вида распаковки
Апдейт: теперь понял, что не знал элементарной вещи: скобки не являются причиной создания кортежей, вместо этого именно запятые указывают на их создание
Почему распаковка словаря в словарь работает, допустим d = {'a':1, 'b':2} {**d} - это работает без проблем, {a=1, b=1} - но так уже не работает, ведь **d это по сути то же самое что a=1, b=2 ? {**d} должно быть эквивалентно {a=1, b=1}, почему нет?
2:53 "Мы не можем упаковать уже упакованный кортеж". Посмотрел в PEP стандарт и все таки распаковка и последующая упаковка в данном случае возможна. Нужно применить вот такой синтаксис *x, = 1, 2, 3 или [*x] = 1, 2, 3 Собственно это ошибка и указывается в данном случае как синтаксическая: SyntaxError: starred assignment target must be in a list or tuple