# if the 'q' key is pressed, stop the loop
if key == ord("q"):
break
def process_one_part(part: numpy.ndarray) -> numpy.ndarray:
...
# пустое изображение такого же размера, как исходное, с тремя каналами по 8 бит на канал
# если на выходе у тебя другое число каналов или тип данных, поправишь
result = numpy.zeros(image.shape[:2] + (3,), numpy.uint8)
for i in range(img_h // bl_h):
for j in range(img_w // bl_w):
cropped = image[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w]
processed = process_one_part(cropped)
# нужно, чтобы присваиваемый фрагмент имел такой же размер, как "окно" присваивания
result[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w] = processed
# дальше делаешь с result что тебе нужно
import typing as t
lst = ['a', 'b', 'c', 'd', 'e'] # не называй переменную list
def split(lst: t.List[t.Any], indices: t.Iterable[int]) -> t.Tuple[t.List[t.Any], t.List[t.Any]]:
selected = list(map(lst.__getitem__, indices))
remainder = list(lst)
# удаляем с конца, чтобы еще не обработанные индексы не поехали
# вот только с отрицательными индексами это уже не прокатит
# их придётся самомму пересчитывать в положительные
for i in sorted(indices, reverse=True):
del remainder[i]
return selected, remainder
print(split(lst, [0, 3])) # (['a', 'd'], ['b', 'c', 'e'])
class X:
meta = {}
a: int
meta['a'] = {'foo': 'bar'}
print(X.meta['a'])
class metadata(dict):
pass
class X(Metaclass):
a: int = metadata(foo='bar')
<\bound method Aliases.new_alias of
<\aliases.py.Aliases object at 0x7fcf55c104c0>
>
import inspect
class A:
def test(self, x):
print(x)
a = A()
print(A.test) # <function A.test at 0x0000029692C0FB50>
print(a.test) # <bound method A.test of <__main__.A object at 0x0000029692BF3040>>
print(inspect.signature(A.test)) # <Signature (self, x)>
print(inspect.signature(a.test)) # <Signature (x)> так как значение self зафиксировано - это a
# причём обёртка создаётся каждый раз новая, это НЕ один и тот же объект
print(a.test is a.test) # False
# но две обёртки одного метода равны.
print(a.test == a.test) # True
# а метод класса всегда один и тот же
print(A.test is A.test) # True
print(A.test == A.test) # True
rub = 'рубль' or 'рублей' or 'рубля'
не имеет ни смысла, ни эффекта. Просто убери её.если две последние цифры 11, 12, 13, 14 или последняя цифра 0, 5, 6, 7, 8, 9 - "рублей"
иначе если последняя цифра 2, 3, 4 - "рубля",
иначе - "рубль"
if last_digit in (0, 5, 6, 7, 8, 9):
...
a = [1, 2, 3] # а содержит ссылку на некий список
b = a # b содержит ссылку на тот же список!
print(b is a) # True. b - это тот же объект, что и a
a.append(4) # Ссылка а не меняется, меняется объект по этой ссылке!
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4] так как b ссылается на то же, что и a
a = [1, 2] # теперь a хранит ссылку на другой объект-список!
print(b is a) # False. Даже если бы содержимое списков совпало, это два разных объекта.
print(a) # [1, 2]
print(b) # [1, 2, 3, 4] так как b хранит ссылку на старый список
a.append(5)
print(a) # [1, 2, 5] изменили объект, на который ссылается a
print(b) # [1, 2, 3, 4] b ссылается на другой объект, он остался не изменён.
a[:] = [1, 2, 3, 4]
Для надёжности можешь этот список показать как read-only property вместо обычного поля класса - тогда можно будет модифицировать объект списка (добавлять/удалять элементы), но нельзя будет заменить список на другой.