鱼C论坛

 找回密码
 立即注册
查看: 1924|回复: 12

[已解决]定制序列实验问题

[复制链接]
发表于 2017-11-24 10:23:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#P12_8.py

class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)
    def __len__(self):
        return len(self.values)
    def __getitem__(self,key):
        self.count[key] += 1
        return self.values[key]
              
以上是代码
----------------------------------------------------------------------------------
以下是运行情况
>>> c1 = CountList(1,3,5,7,9)
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
>>> c1[2]
5
>>> c1.count
{0: 0, 1: 1, 2: 1, 3: 0, 4: 0}
>>>

请问,哪位大神可以解释下工作原理和运行过程? 非常感谢!!!
最佳答案
2017-11-24 11:05:04
知识点涉及:魔法方法(http://bbs.fishc.com/thread-48793-1-1.html),类对象初始化,迭代,赋值/取值,内置函数,赋值运算,列表推导式
从创建对象为入口说明如下:
c1 = CountList(1,3,5,7,9)  -- 初始化定制序列
解释:首先调用__init__()魔法方法(当然第一个魔法方法是__new__),通过计算、迭代赋值类对象values(列表),count(字典)
c1[1] --获取直
解释:调用__getitem__魔法方法,self.count[key] += 1 统计调用次数,返回self.values[key]值
c1.count
返回类对象值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-11-24 10:44:19 | 显示全部楼层
你具体是哪里不懂?
如果是都不懂,那就先再温习一遍小甲鱼老师的视频
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 10:52:00 | 显示全部楼层
本帖最后由 694061755 于 2017-11-24 10:53 编辑
BngThea 发表于 2017-11-24 10:44
你具体是哪里不懂?
如果是都不懂,那就先再温习一遍小甲鱼老师的视频


视频看了,没有具体说运行过程
比如说,我想知道c=C(1,3,5,7,9)赋值后以及c[1]后,具体的运行过程或者说函数运行顺序
我基础比较薄弱,以前没有学过任何编程,这本书是第一本学习书籍,我是做网络的,想学点编程知识
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 11:05:04 | 显示全部楼层    本楼为最佳答案   
知识点涉及:魔法方法(http://bbs.fishc.com/thread-48793-1-1.html),类对象初始化,迭代,赋值/取值,内置函数,赋值运算,列表推导式
从创建对象为入口说明如下:
c1 = CountList(1,3,5,7,9)  -- 初始化定制序列
解释:首先调用__init__()魔法方法(当然第一个魔法方法是__new__),通过计算、迭代赋值类对象values(列表),count(字典)
c1[1] --获取直
解释:调用__getitem__魔法方法,self.count[key] += 1 统计调用次数,返回self.values[key]值
c1.count
返回类对象值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 11:56:33 | 显示全部楼层
本帖最后由 694061755 于 2017-11-24 12:21 编辑
$DIM 发表于 2017-11-24 11:05
知识点涉及:魔法方法(http://bbs.fishc.com/thread-48793-1-1.html),类对象初始化,迭代,赋值/取值, ...


self.count = {}.fromkeys(range(len(self.values)),0)    请问这里的len(self.values)和下面的 len(self.values)是什么关系?
def __len__(self):
        return len(self.values)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 12:33:20 | 显示全部楼层
694061755 发表于 2017-11-24 11:56
self.count = {}.fromkeys(range(len(self.values)),0)    请问这里的len(self.values)和下面的 len(s ...

没关系,都是调len()内置函数
__len__(self)  --定义当被len()调用时的行为
len(c1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 12:34:08 | 显示全部楼层
#P12_8.py

class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)
        print(self.values)
    #def __len__(self):
        #return len(self.values)
    def __getitem__(self,key):
        self.count[key] += 1
        return self.values[key]
______________________________________________________________
>>> c1 = CountList(1,3,5,7,9)
[1, 3, 5, 7, 9]
>>> c1[1]
3
>>> c2 = CountList(2,4,6,8,10)
[2, 4, 6, 8, 10]
>>> c2[1]
4
>>> c1[1] + c2[1]
7
>>> c1.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}
>>> c2.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}

我把 def __len__(self):注释掉后未见异常,这个是什么原因?def __len__(self):这句到底是什么用的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 12:39:46 | 显示全部楼层
$DIM 发表于 2017-11-24 12:33
没关系,都是调len()内置函数
__len__(self)  --定义当被len()调用时的行为
len(c1)

谢谢回复,再问一下:
#P12_8.py

class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)
        print(self.values)
    #def __len__(self):
        #return len(self.values)
    def __getitem__(self,key):
        self.count[key] += 1
        return self.values[key]
______________________________________________________________
>>> c1 = CountList(1,3,5,7,9)
[1, 3, 5, 7, 9]
>>> c1[1]
3
>>> c2 = CountList(2,4,6,8,10)
[2, 4, 6, 8, 10]
>>> c2[1]
4
>>> c1[1] + c2[1]
7
>>> c1.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}
>>> c2.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}

我把 def __len__(self):注释掉后未见异常,这个是什么原因?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 14:00:45 | 显示全部楼层
694061755 发表于 2017-11-24 12:39
谢谢回复,再问一下:
#P12_8.py

>>> len(c1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'CountList' has no len()
__len__()魔法方法是类对象调用时才触发,类  内部调用的是len()内置函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 14:52:45 | 显示全部楼层
$DIM 发表于 2017-11-24 14:00
>>> len(c1)
Traceback (most recent call last):
  File "", line 1, in

self.count = {}.fromkeys(range(len(self.values)),0)
哦,上面这句里面包含的len(self.values)还不是触发__len__的条件,是吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 15:00:11 | 显示全部楼层
694061755 发表于 2017-11-24 14:52
self.count = {}.fromkeys(range(len(self.values)),0)
哦,上面这句里面包含的len(self.values)还不是 ...

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 15:19:30 | 显示全部楼层
那要怎样才能触发呢?比如
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-28 15:09:53 | 显示全部楼层
$DIM 发表于 2017-11-24 11:05
知识点涉及:魔法方法(http://bbs.fishc.com/thread-48793-1-1.html),类对象初始化,迭代,赋值/取值, ...

>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}

c1.count和c2.count的统计次数看不太懂啊,

我在自己的机器上运行的c1 = CountList(1,3,5,7,9,) 和c2 = CountList(2,4,6,8,10)的结果是:
c1.count    结果:{0:0,1:2,2:0,3:0,4:0}
c2.count    结果:{0:0,1:2,2:0,3:0,4:0}
帮忙解释下访问次数的统计结果呢,一、两个统计结果怎么一样呢;二、结果的意思是数字3和4的访问次数为2次,其余均访问0次吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-4 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表