Должен ли я избегать переупаковки нескольких распакованных итераций? например , (*(1,2),*(3,4)) чтобы получить (1,2,3,4)

#python #python-3.x #syntax

#питон #python-3.x #синтаксис

Вопрос:

Поддерживается ли синтаксис (*(1,2),*(3,4)) для получения (1,2,3,4) как стандартный, поэтому он переносим или это просто синтаксис, определенный реализацией, поэтому его следует избегать?

при использовании консоли python плагина notepad я обнаружил оба

 bytes((*range(ord('a'),ord('z') 1),*range(ord('A'),ord('Z') 1))).decode()
 

и

 "".join(map(chr,(*range(ord('a'),ord('z') 1),*range(ord('A'),ord('Z') 1))))
 

но это вызвало ту же ошибку синтаксиса. Но я попробовал это в Windows IDLE 3.6.3 shell и ubuntu python 3.6.5 ( $ python3 ), и оба сработали.

Итак, я попробовал (*(1,2), *(3,4)) в консоли плагина npp python, и это вызвало ту же ошибку, что и в IDLE и ubuntu.

Это просто потому, что консоль плагина npp плохо поддерживает python или этот синтаксис не является стандартным?

Я пытался найти информацию, но мне даже не удалось получить ключевое слово. никто не говорил о переупаковке синтаксиса unpacked.

Комментарии:

1. Стандарт в Python 3.5

Ответ №1:

В Python 3.7 это работает

 x = (*(1,2), *(3,4))
 

В python 3.4 это не

 x = (*(1,2), *(3,4))

  File "main.py", line 1
    x = (*(1,2), *(3,4))
         ^
SyntaxError: invalid syntax
 

Python 3.5 (я думаю) представил эти новые способы построения кортежей, dicts и т. Д. Через распаковку.

Вероятно, вы используете 2 разные версии python-3.x в этих двух средах.

Вот еще один интересный пример с dict s . Объединить два диктатора,

 d = {**d1, **d2}
 

И вот PEP-448, который ввел этот синтаксис

Ответ №2:

  1. Код, которым вы поделились, поддерживается в Python 3.5 , но не в какой-либо более старой версии.
  2. Я бы не рекомендовал вам использовать * оператор здесь, он обычно не используется для такого использования — больше для переменных аргументов в вызовах функций. Если что-нибудь, используйте итератор или два, это делает его более понятным.
 result = 
    "".join(chr(c) for c in range(ord('a'), ord('z') 1))   
    "".join(chr(c) for c in range(ord('A'), ord('Z') 1))
 

Простота и удобство обслуживания очень важны в реальном коде.

  1. Еще лучше, вы можете использовать:
 import string
result = string.ascii_lowercase   string.ascii_uppercase
 

Удачи!

Комментарии:

1. импорт этого модуля выглядит лучше всего. Спасибо.