长衫罩子龙 发表于 2019-7-31 09:22:16

python 47讲

请问47讲这段代码中:
class CountList:
    def __init__(self, *args):
      self.values =
      self.count = {}.fromkeys(range(len(self.values)), 0)

    def __len__(self):
      return len(self.values)

    def __getitem__(self, key):
      self.count += 1
      return self.values

这句代码:self.count = {}.fromkeys(range(len(self.values)), 0)
中的:range(len(self.values))是什么意思?range不是表示范围,len表示长度吗?
例子中的c1 = CountList(1,3,5,7,9)
那么range(len(self.values))不应该是range(5)吗?
为何会把列表c1.values传递进去啊?

MMM啊 发表于 2019-7-31 11:05:05

首先呢,定义self.value时定义的是列表表达式,那么self.value就是列表就有长度了啊,然后range一个数字你应该知道啥意思的吧?range(n)这个东西,你可以试试到底会输出啥啊,然后不就知道了?后面那个问题是在这样,你没看到在定义__init__后面的参数前面有一个*号?这是可变参数,也就是说,c1列表的元素以一个一个作为参数进入类中,所以你得搞清楚到底程序的每一步都是什么意思(但愿我表达的和你想问的是一个意思,对你有所帮助)

长衫罩子龙 发表于 2019-7-31 11:19:22

本帖最后由 长衫罩子龙 于 2019-7-31 11:22 编辑

MMM啊 发表于 2019-7-31 11:05
首先呢,定义self.value时定义的是列表表达式,那么self.value就是列表就有长度了啊,然后range一个数字你 ...

这个len(self.values)结果应该是5啊,range(5)就是range(0,5).
{}.fromkeys(range(len(self.values)), 0)结果不应该是{0: 0, 1: 0, 2: 0, 3: 0, 4: 0}吗?
我专门敲了以下代码实验了一下,不在本体环境下,输出结果就是我说的这样:
>>> seq = ['Google', 'Runoob', 'Taobao']
>>> {}.fromkeys(range(len(seq)),0)
{0: 0, 1: 0, 2: 0}

这里面seq和self.value一样,都是个列表。

长衫罩子龙 发表于 2019-7-31 11:23:46

我反应过来了。。。。我看错了,我以为是把列表数值作为字典的键。。现在才发现是以列表下标作为键。。。{:10_247:}
页: [1]
查看完整版本: python 47讲