laocaiye 发表于 2025-10-25 14:08:40

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

在本节课程的最后,我们定义了一个可以将中文转化为整数的类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
                else:
                   result += int(each)
                result *= 10
            return result // 10
      

请问红色这行代码是什么意思?琢磨了好久,也没看懂这句话执行的意义?

FishC 发表于 2025-10-25 14:10:27

亲爱的鱼油,

您提到的红色代码行,我猜是 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,因为 zh 是字典,需要通过键来获取值。否则,代码会报错。

修正后的完整代码:

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# 修正处
                else:
                  result += int(each)
                result *= 10
            return result // 10


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

laocaiye 发表于 2025-10-25 14:10:42

明白了,是处理纯数字的。哎

FishC 发表于 2025-10-25 14:11: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`,否则会报错。修正后就能正常工作啦!

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 关于第66讲类和对象(IX)中的最后的例题