Может кто-нибудь объяснить, что происходит с этим куском микро python - PullRequest
0 голосов
/ 15 февраля 2020

Только начал играть с BB C micro: bit. Один из примеров имеет эту строку кода

fla sh = [Image (). Invert () * (i / 9) для i в диапазоне (9, -1, -1)]

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

class Image:
    def __init__(self,*args):
        print ("init")
        for a in args:
            print (a)

    def invert(self, *args):
        print ("invert")
        for a in args:
            print (a)


flash = [Image().invert()*(i/9) for i in range(9, -1, -1)]

print ( flash )

, который выдает

python3 test.py 
init
invert
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    flash = [Image().invert()*(i/9) for i in range(9, -1, -1)]
  File "test.py", line 14, in <listcomp>
    flash = [Image().invert()*(i/9) for i in range(9, -1, -1)]
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 февраля 2020

In invert() Вам нужно передать некоторые значения типа int и вернуть любое значение типа int. В вашем коде вы не возвращаете значение int или float в вашей функции invert () . Попробуйте это

class Image:
    def __init__(self,*args):
        print ("init")
        for a in args:
            print (a)

    def invert(self, *args):
        print ("invert")
        for a in args:
            return a
flash = [Image().invert(1,)*(i/9) for i in range(9, -1, -1)]
print (flash)

Это будет работать

0 голосов
/ 15 февраля 2020

Только что обнаружил, что в Image есть * оператор, ie это не оператор распаковки, что меня смущало.

Спасибо за ответы

0 голосов
/ 15 февраля 2020

Ваша функция инвертирования ничего не возвращает, поэтому, когда вы пытаетесь ее умножить, вы получаете None*float, что приводит к описанному вами ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...