Как работает определение функции, вложенной в другую? - PullRequest
0 голосов
/ 19 февраля 2020

В Python реализации строкового алгоритма Сяолиня Ву функция определяется, будучи вложенной в другую функцию. Часть кода:

def draw_line(img, p1, p2, color):
    """Draws an anti-aliased line in img from p1 to p2 with the given color."""
    x1, y1 = p1
    x2, y2 = p2
    dx, dy = x2-x1, y2-y1
    steep = abs(dx) < abs(dy)
    p = lambda px, py: ((px,py), (py,px))[steep]

    if steep:
        x1, y1, x2, y2, dx, dy = y1, x1, y2, x2, dy, dx
    if x2 < x1:
        x1, x2, y1, y2 = x2, x1, y2, y1

    grad = dy/dx
    intery = y1 + _rfpart(x1) * grad
    def draw_endpoint(pt):
        x, y = pt
        xend = round(x)
        yend = y + grad * (xend - x)
        xgap = _rfpart(x + 0.5)
        px, py = int(xend), int(yend)
        putpixel(img, p(px, py), color, _rfpart(yend) * xgap)
        putpixel(img, p(px, py+1), color, _fpart(yend) * xgap)
        return px

Как это работает? Почему программист не определил код где-то еще, а затем вызвал его в этой функции? Если бы эта функция была вызвана в al oop для рисования нескольких линий, разве не было бы более эффективно просто, как я сказал, определить вложенную функцию где-нибудь еще?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

попробуйте это:

class Humans():
    def health(self, weight, height, age):
        self.weight = weight
        self.height = height
        self.age = age
    def health_health(self):
        print(f'''This human is {self.age} years old; weighs {self.weight},  
        and has a height of {self.height}''')
Harar = Humans()
Harar.health(1,2,3)
Harar.health_health()
0 голосов
/ 19 февраля 2020

Причина в том, что вы вызываете функцию из определения класса , в отличие от инициализированного объекта . Чтобы исправить это, вы можете сделать две вещи:

Вызвать функцию из объекта, который был инициализирован:

class Foo:

    def bar(x):
        print(x)

a = Foo()
a.bar(10)

Или определить функцию как staticmethod:

class Foo:

    @staticmethod
    def bar(x):
        print(x)

Foo.bar(10)

Оба будут выводить:

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