SELECT COUNT(*) FROM main WHERE user_id = ?
или SELECT EXISTS(SELECT * FROM main WHERE user_id = ?)
. Эти запросы гарантированно вернут одну строку с одним значением, 0 или 1. 0 - строка не существует, 1 - строка существует. import math
class RandomChoice(list):
pass
class RandomOrder(list):
pass
def random_choice(options) -> int:
total = 0
for option in options:
if isinstance(option, RandomChoice): # вложенный выбор варианта
total += random_choice(option)
elif isinstance(option, RandomOrder): # вложенное переупорядочивание
total += random_order(option)
else:
total += 1
return total
def random_order(options) -> int:
total = math.factorial(len(options))
for option in options:
if isinstance(option, RandomChoice): # вложенный выбор варианта
total *= random_choice(option)
elif isinstance(option, RandomOrder): # вложенное переупорядочивание
total *= random_order(option)
# а для просто варианта ничего делать не надо
return total
def total_count(items) -> int:
total = 1
for item in items:
if isinstance(item, RandomChoice): # вложенный выбор варианта
total *= random_choice(item)
elif isinstance(item, RandomOrder): # вложенное переупорядочивание
total *= random_order(item)
return total
sample = [
'я',
RandomChoice(['купил', 'приобрел']), # 2
RandomChoice(['на ярмарке','на рынке','в магазе']), # 3
RandomChoice(['сыр', #8
RandomOrder(['соль, ','хлеб, ','муку, ']), # 6
'сахар']),
]
combos = total_count(sample)
print(combos)
(перехватывать вывод в subprocess.PIPE, а после записывать это в файл)
'Карта: " + str(a) + " " + str(b) + " " + str(c) + " " + str(d) +"\nCVV: " + str(e))'
f"Карта: {a} {b} {c} {d}\nCVV: {e}"
a == 2 or 3
означает "(а равно 2) или (а равно 3)". a == 2 or a == 3
, или a in (2, 3)
Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?
import cv2
import sys
import matplotlib.pyplot as plt
original = cv2.imread(sys.argv[1])
ix = -1
iy = -1
drawing = False
def draw_reactangle_with_drag(event, x, y, flags, param):
global ix, iy, drawing, original
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix = x
iy = y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
img = original.copy()
cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
cv2.imshow("Title of Popup Window", img)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = original.copy()
cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
print(ix, iy, x, y)
cv2.imshow("Title of Popup Window", img)
cv2.namedWindow(winname= "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
cv2.imshow("Title of Popup Window", original)
while True:
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()
# типы данных. Они могут быть классами, или описаниями вида typing.Tuple[int, str]
# так как ты не описал типы данных, я пишу тут заглушки typing.Any (т.е. что угодно)
# эти типы лучше описать в отдельном файле, который будет импортироваться остальными
Snaphot = typing.Any
PreparedSnapshot = typing.Any
SnapshotResult = typing.Any
# функции обработки. они могу быть раскиданы по отдельным файлам,
# но они должны импортить нужные модули, в т.ч. описание типов данных
# ни одна функция не должна выбрасывать исключения
def get_snapshot(site: str, name: str) -> typing.Optional[Snapshot]:
"Качает один снапшот с сайта и возвращает его, или None если была ошибка."
...
def prepare_snapshot(snapshot: Snapshot) -> typing.Optional[PreparedSnapshot]:
"Подготавливает один снапшот к обработке. Возвращает None при ошибке."
...
def process_prepared_snapshot(snapshot: PreparedSnapshot) -> typing.Optional[SnapshotResult]:
"Извлекает нужные сведения из одного снапшота и возвращает их как структуру данных, или None при неудаче."
...
# эта функция будет в главном запускаемом файле
# главный файл должен импортировать остальные
targets = zip(...) # ну или как ты там делаешь список
# и вот тут уже главный цикл
# вариант А - классический цикл
results: typing.List[SnapshotResult] = []
for site, name in targets:
snap = get_snapshot(site, name)
if snap is not None:
prepared = prepare_snapshot(snap)
if prepared is not None:
result = process_prepared_snapshot(prepared)
if result is not None:
results.append(result)
# вариант Б - более функциональный подход
# фильтрует коллекцию, отбрасывает None
def skipNone(items):
return filter(lambda item: item is not None, items)
results: typing.List[SnapshotResult] = list(skipNone(
map(process_prepared_snapshot, skipNone(
map(prepare_snapshot, skipNone(
get_snapshot(site, name) for site, name in targets
))
))
))
# в любом случае, у тебя есть список результатов results, делай с ним что хочешь.
aList = "http://сайт-со-снепшотами.com"
bList = ['список', 'имен', 'для', 'снепшотов', 'и', 'так', 'далее']
for a, b in zip(aList, bList):
('h', 'список'), ('t', 'имен'), ('t', 'для'), ('p', 'снепшотов'), (':', 'и'), ('/', 'так'), ('/', 'далее'), ...
def process_dict(d: dict):
pass # тут работаешь с этим словарём
# рекурсивный вызов для вложенных словарей
subresults = [process_dict(subdict) for subdict in d['subCategories']]
pass # тут объединяешь результаты от вложенных словарей с основным результатом
return ... # обязательно возвращаешь результат
Не так, переменная меняется не присвоением ей значения, а за счет парсинга с сайта
old_value = None
while True:
new_value = parse_site() # parse_site() - написанная тобой функция, которая возвращает искомое значение
if old_value is not None and new_value != old_value: # если это не первый раз, и значение изменилось
print('Значение изменилось!')
old_value = new_value # чтобы в следующий раз сравнивать с последним увиденным значением
time.sleep(600) # спим 10 минут, чтобы не долбить сайт запросами