鱼C论坛

 找回密码
 立即注册
查看: 42|回复: 3

关于第66讲类和对象(IX)中的最后的例题

[复制链接]
发表于 昨天 14:08 | 显示全部楼层 |阅读模式

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

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

x
在本节课程的最后,我们定义了一个可以将中文转化为整数的类ZH_INT,源码如下:
class ZH_INT:
    def __init__(self,num):
        self.num = num

    def __int__(self):
        try:
            return int(self.num)
        except ValueError:
            zh = {"零":0,"一":1,"二":2,"三":3,"四":4,"五":5,"六":6,"七":7,"八":8,"九":9,
                  "壹":1,"贰":2,"叁":3,"肆":4,"伍":5,"陆":6,"柒":7,"捌":8,"玖":9}
            result = 0

            for each in self.num:
                if each in zh:
                    result += zh[each]
                else:
                   result += int(each)
                result *= 10
            return result // 10
        

请问红色这行代码是什么意思?琢磨了好久,也没看懂这句话执行的意义?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 14:10 | 显示全部楼层
亲爱的鱼油,

您提到的红色代码行,我猜是 result *= 10 这一行。这行代码的作用是在循环中每次处理一个字符后,将当前结果乘以10,以便为下一个数字字符腾出十进制的位空间。这样,数字就能从左到右逐位构建起来。

具体来说:
- 在循环中,先根据字符类型(中文数字或普通数字)将对应的值加到 result 上。
- 然后,result *= 10 将结果左移一位(相当于在十进制中增加一个零),使得下一位数字能添加到正确的位置。
- 循环结束后,return result // 10 用于修正最后多乘的一次10。

例如,输入 "一二三" 时:
- 处理 "一":result 先加1,变成1;然后乘以10,变成10。
- 处理 "二":result 加2,变成12;然后乘以10,变成120。
- 处理 "三":result 加3,变成123;然后乘以10,变成1230。
- 最后返回 1230 // 10 = 123,得到正确整数。

但请注意,代码中有一个错误:result += zh 应该是 result += zh[each],因为 zh 是字典,需要通过键来获取值。否则,代码会报错。

修正后的完整代码:

  1. class ZH_INT:
  2.     def __init__(self, num):
  3.         self.num = num

  4.     def __int__(self):
  5.         try:
  6.             return int(self.num)
  7.         except ValueError:
  8.             zh = {"零":0, "一":1, "二":2, "三":3, "四":4, "五":5, "六":6, "七":7, "八":8, "九":9,
  9.                   "壹":1, "贰":2, "叁":3, "肆":4, "伍":5, "陆":6, "柒":7, "捌":8, "玖":9}
  10.             result = 0
  11.             for each in self.num:
  12.                 if each in zh:
  13.                     result += zh[each]  # 修正处
  14.                 else:
  15.                     result += int(each)
  16.                 result *= 10
  17.             return result // 10
复制代码


如果您指的是其他代码行,欢迎提供更多细节,我会继续为您解答!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 昨天 14:10 | 显示全部楼层
明白了,是处理纯数字的。哎
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 14:11 | 显示全部楼层
laocaiye 发表于 2025-10-25 14:10
明白了,是处理纯数字的。哎


亲爱的鱼油,

很高兴您理解了!是的,代码中的 `result *= 10` 确实是用来处理数字的位构建的,无论是中文数字还是纯数字(如 '1'、'2' 等),它都能通过逐位左移来正确组合整数。

简单总结一下逻辑:
- 循环中,每个字符如果是中文数字,就从字典中取值;如果是纯数字,就直接转换。
- 每次处理后,`result *= 10` 将结果左移一位,为下一位数字腾出空间。
- 最后 `return result // 10` 修正多乘的一次。

例如,输入 "一二3":
- 处理 "一":result 加1,变成1;然后乘以10,变成10。
- 处理 "二":result 加2,变成12;然后乘以10,变成120。
- 处理 "3":result 加3,变成123;然后乘以10,变成1230。
- 返回 1230 // 10 = 123。

但请记住,代码中有一个小错误:`result += zh` 应该是 `result += zh[each]`,否则会报错。修正后就能正常工作啦!

如果您还有其他疑问,随时欢迎提出~加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-26 02:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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