Discuss / Python / 哪位大佬解答一下呗?

哪位大佬解答一下呗?

Topic source

1、为何第一个if里面定义的是a,b,为何__iter__中的Fib()却是self.a、self.b

2、解释一下n是切片的对应代码的逻辑,没看懂

3、解释一下__iter__和__getitem__的背后执行过程,当自动调用时究竟是怎么传参的

class Fib(object):
    def __getitem__(self, n):
        if isinstance(n, int): # n是索引
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice): # n是切片
            start = n.start
            stop = n.stop
            if start is None:
                start = 0
            a, b = 1, 1
            L = []
            for x in range(stop):
                if x >= start:
                    L.append(a)
                a, b = b, a + b
            return L

盛堂

#2 Created at ... [Delete] [Delete and Lock User]

第一个__iter__中使用self.a self.b是用作记录当前__next__函数访问的位置。就比如说,你第一次调用__next__函数是访问第一个元素,那么在下一次调用__next__函数就要访问第二个元素

而__getitem__返回的是一段值,返回以后,没有需要记录这一段元素的需求,也就是下一次你调用这个函数的时候完全是依据它的参数返回某一段的值,和上一次调用间没什么逻辑关系,所以就没有使用self.a self.b

况且如果__getitem__函数也使用self.a self.b那如果在for循环中使用了切片的话,可能会导致self.a self.b的值更改,进而发生错误

盛堂

#3 Created at ... [Delete] [Delete and Lock User]
class slice(object):
    """    slice(stop)    slice(start, stop[, step])        Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).    """

比如对list类型使用slice L[0:10:2],这个[0:10:2]就会是slice类中的start = 0,stop = 10, step = 2。

那个切片的逻辑就是获取start和stop的值,start is None对应这种情况:[ :10],所以就把start设置为0

然后当a大于等于start的时候开始将这个元素记录到L中,一直记录到stop,最终把这一段返回


  • 1

Reply