Python: Сохраняйте сумму 2 переменных, изменяющихся, когда 2 изменения [дубликаты]

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(event_id SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL 
,start_dt DATETIME NOT NULL 
,end_dt DATETIME NULL
);

INSERT INTO my_table VALUES
(1, 'Carnival', '2018-04-30 12:00:00','2018-04-30 12:00:00'+INTERVAL 150 MINUTE),
(2, 'Fairytale','2018-04-30 20:00:00','2018-04-30 20:00:00'+INTERVAL 200 MINUTE);


SELECT * FROM my_table;
 +----------+-----------+---------------------+---------------------+
 | event_id | name      | start_dt            | end_dt              |
 +----------+-----------+---------------------+---------------------+
 |        1 | Carnival  | 2018-04-30 12:00:00 | 2018-04-30 14:30:00 |
 |        2 | Fairytale | 2018-04-30 20:00:00 | 2018-04-30 23:20:00 |
 +----------+-----------+---------------------+---------------------+

INSERT INTO my_table (name,start_dt,end_dt) 
SELECT 'Whatever','2018-04-20 11:58:00','2018-04-30 13:00' 
  FROM (SELECT 1) x 
  LEFT 
  JOIN my_table y 
    ON y.end_dt > '2018-04-30 11:58:00' 
   AND y.start_dt < '2018-04-30 13:00:00' 
 WHERE y.event_id IS NULL;

SELECT * FROM my_table;
 +----------+-----------+---------------------+---------------------+
 | event_id | name      | start_dt            | end_dt              |
 +----------+-----------+---------------------+---------------------+
 |        1 | Carnival  | 2018-04-30 12:00:00 | 2018-04-30 14:30:00 |
 |        2 | Fairytale | 2018-04-30 20:00:00 | 2018-04-30 23:20:00 |
 +----------+-----------+---------------------+---------------------+
0
задан lcq92 9 January 2016 в 15:09
поделиться

3 ответа

Вы можете сделать это с помощью функции вместо переменной.

def y(x):
    return x + 10

Таким образом, print(y(x)) выдаст текущее значение x плюс десять.

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

1
ответ дан Erica 26 August 2018 в 14:24
поделиться

Единственный способ, которым я знаю это сделать в стандартной библиотеке Python, - использовать свойство, так что соответствующее значение вычисляется каждый раз, когда к нему обращаются:

class Thing(object):

    def __init__(self, x, y_add):
        self.x = x
        self.y_add = y_add

    @property
    def y(self):
        return self.x + self.y_add

In use:

>>> t = Thing(2, 10)
>>> t.x
2
>>> t.y
12
>>> t.x = 3
>>> t.y
13

В противном случае вам нужно будет вызвать функцию (y() вместо y) или использовать что-то вроде sympy .

4
ответ дан jonrsharpe 26 August 2018 в 14:24
поделиться

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

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

См.: https://mail.python.org/pipermail/tutor/2000-August/001976.html

0
ответ дан Rob Murray 26 August 2018 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: