Сложные операции с Python (pygame.math.Vector2) - PullRequest
0 голосов
/ 29 сентября 2018

Я изучаю Python и натолкнулся на сложное выражение, которое происходит от pygame.Vector2:

import pygame
x = pygame.math.Vector2 (1,2)
b = x * 5 - (1, 2)
print (x)
print (b)

Результат:

[1,2]
[4,8]

В приведенном выше примере то же самое x * 5 операция выполняется для значений 1 и 2 Vector2, что приводит к (5, 10) соответственно;и затем оба результата вычитаются из кортежа (1, 2), что приводит к [4,8]

Однако, если я назначу простой кортеж для x: x = (1, 2) вместо Vector2, я получуошибка:

Ошибка типа: неподдерживаемые типы операндов для -: 'tuple' и 'tuple'

Мой вопрос: В какое время в PythonЯ могу выполнить эти сложные операции?

1 Ответ

0 голосов
/ 29 сентября 2018

Может сделать что-то вроде (см. Также комментарии):

x = (1,2) # create a `tuple`
b = map(lambda x: x * 5,x) # do a `map` object for multiplying 5 to all of them
print(x) # print the `tuple`
t=iter((1,2)) # do an generator object using `iter`, so able to use `next` to access every next element
print(tuple(map(lambda x: x-next(t),b))) # do the `next` and another `map`, to subtract as you wanted

Лучше всего создать класс:

from __future__ import division
class MyClass:
   def __init__(self,t):
      self.t=t
   def __mul__(self,other):
      return MyClass(tuple(map(lambda x: x*other,self.t)))
   def __truediv__(self,other):
      return MyClass(tuple(map(lambda x: x/other,self.t)))
   def __sub__(self,other):
      gen=iter(other)
      return MyClass(tuple(map(lambda x: x-next(gen),self.t)))
   def __add__(self,other):
      gen=iter(other)
      return MyClass(tuple(map(lambda x: x+next(gen),self.t)))
   def __repr__(self):
      return str(tuple(self.t))

Тогда теперь можно делать все что угодно:

x = MyClass((1,2))
b = x*5
print(b)
print(b-(1,2))

Выход:

(5, 10)
(4, 8)

Также можно сделать сложение:

x = MyClass((1,2))
b = x*5
print(b)
print(b-(1,2)+(3,4))

Выход:

(5, 10)
(7, 12)

Также деление:

x = MyClass((1,2))
b = x*5
print(b)
print((b-(1,2)+(3,4))/2)

Вывод:

(5, 10)
(3.5, 6.0)
...