Подтвердить что ты не робот

Точность чтения: [0,0] vs (0,0)

Я использую Python с тех пор, и я обнаруживаю "питонический" способ кодирования. Я использую много кортежей в своем коде, большинство из них являются полярными или декартовыми позициями.

Я сам написал это:

window.set_pos([18,8])

вместо этого:

window.set_pos((18,8))

чтобы избавиться от двойной круглой скобки, которую мне было трудно прочитать.

Кажется, что python автоматически выполняет преобразование типа из списка в кортеж, так как мой код работает правильно.

Но это хороший способ кодировать? У вас есть подсказка для презентации, которую я мог бы использовать для написания читаемого кода?

Заранее благодарю за ваши, несомненно, просветляющие ответы.

4b9b3361

Ответ 1

Я был бы осторожен, решив избегать кортежей в пользу списков повсюду. Вы когда-нибудь использовали модуль dis? Посмотрите, что делает Python на уровне байт-кода, когда вы создаете список стилей, создающих кортеж:

>>> def f():
...     x = [1,2,3,4,5,6,7]
...     return x
... 
>>> def g():
...     x = (1,2,3,4,5,6,7)
...     return x
... 
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 LOAD_CONST               4 (4)
             12 LOAD_CONST               5 (5)
             15 LOAD_CONST               6 (6)
             18 LOAD_CONST               7 (7)
             21 BUILD_LIST               7
             24 STORE_FAST               0 (x)

  3          27 LOAD_FAST                0 (x)
             30 RETURN_VALUE     
>>>
>>>   
>>> dis.dis(g)
  2           0 LOAD_CONST               8 ((1, 2, 3, 4, 5, 6, 7))
              3 STORE_FAST               0 (x)

  3           6 LOAD_FAST                0 (x)
              9 RETURN_VALUE   

Хотя это, вероятно, никогда не будет проблемой в приложении GUI (как кажется, например, ваш пример), по соображениям производительности вы можете быть осторожны с тем, чтобы делать это повсюду в своем коде.

Ответ 2

Вы говорите

Кажется, что python автоматически выполняет преобразование типа из списка в tuple

Это сомнительно. Поскольку списки и кортежи являются типами последовательностей, они оба реализуют многие из одинаковых поведений, и любая библиотека графического интерфейса, которую вы используете, не нуждается в каких-либо из поведения только для списка.

Вероятно, это хорошо сделать во многих случаях, но обратите внимание, что списки занимают немного больше места, чем кортежи:

>>> sys.getsizeof((1, 2))
72
>>> sys.getsizeof([1, 2])
88

И может быть медленнее, чем кортежи при некоторых вещах:

>>> lst, tup = [1, 2], (1, 2)
>>> def unpack(x):
...     a, b = x
...     
>>> %timeit unpack(tup)
10000000 loops, best of 3: 163 ns per loop
>>> %timeit unpack(lst)
10000000 loops, best of 3: 172 ns per loop

Это очень небольшие различия, которые не будут иметь значения, пока вы не достигнете гораздо больших масштабов - как в миллиардах звонков, - поэтому компромисс может стоить того.

Тем не менее, я не вижу, чтобы люди делали это очень часто. Это похоже на хороший подход к удобочитаемости, но в некоторых случаях это может иметь неожиданные последствия. Например, если вы передадите список, который собираетесь использовать позже, то вы должны быть осторожны, чтобы не изменять его внутри функции. Наконец, как J.F. Себастьян справедливо указывает, кортежи и списки имеют тенденцию означать несколько разные вещи; использование их в нетрадиционных способах может свести на нет читаемость, которую вы ищете.

Ответ 3

Я серьезно сомневаюсь, что кортежи против списков делают заметную разницу в производительности в вашем случае. Не делайте микрооптимизации, если это не делает ваш профилировщик. Чтение является приоритетом.

list и tuple являются типами последовательностей.

Семантически кортежи могут быть предпочтительнее (см. Кортежи имеют структуру, списки имеют порядок). Позиция - это единственный объект с атрибутами x, y.

Визуальные списки могут быть легче читать в этом случае.

Что бы вы ни выбрали, просто быть последовательным.

Проверьте, поддерживает ли window следующее:

window.pos = 18, 8

Возможный способ его реализации состоит в том, чтобы сделать pos a property и связать set_pos() как сеттер.

Ответ 4

IMO единственным преимуществом использования (18,8) over [18,8] является то, что объект кортежа является неизменным, и вы можете быть уверены, что он не будет изменен внутри передаваемой функции, тогда как [18,8] можно легко изменить.

Ответ 5

Python не выполняет никакого автоматического преобразования из списка в кортеж, если явно не задает метод set_pos. кортеж и список имеют очень похожие протоколы, поэтому они, как правило, взаимозаменяемы в рамках этого протокола. Вы все еще можете нарушать вещи, в частности потому, что кортеж является неизменным, который может быть хэширован, а список отсутствует.

Чтобы ответить на ваш вопрос, просто напишите

window.set_pos( (18,18) )

правильные пространства делают чудеса с использованием стиля кодирования.

Ответ 6

Если вы хотите подчеркнуть тот факт, что ваш параметр является кортежем, вы можете его явно преобразовать:

window.set_pot(tuple([18, 18]))