鱼C论坛

 找回密码
 立即注册
查看: 3678|回复: 27

[技术交流] Python:每日一题 168

[复制链接]
发表于 2018-3-21 10:58:11 | 显示全部楼层
本帖最后由 天圆突破 于 2018-3-21 12:28 编辑

加了点难度,支持10**28-1以内的数字转换,汉字数字好像只能这么大,再大就没有单位了。
  1. import re

  2. class Hanzi:
  3.     def __init__(self):
  4.         pass

  5.     def _change(self, s):
  6.         def inner(num):
  7.             if num == 0:
  8.                 return ''
  9.             else:
  10.                 lst = list('千百十')
  11.                 dct = dict(zip([str(i) for i in range(10)], list('零一二三四五六七八九')))
  12.                 num = [dct[i] for i in list(str(num))]
  13.                 num[0] = (len(num) != 2 or num[0] != '一') * num[0]
  14.                 n = len(num)
  15.                 if n <= 4:
  16.                     for i in range(n - 1, 0, -1):
  17.                         num.insert(i, (num[i - 1] != '零') * lst[i + 3 - n])
  18.                     num = re.sub('零+', '零', ''.join(num))
  19.                     if num[-1] == '零':
  20.                         num = num[:-1]
  21.                 return num
  22.         jin = ['', '万', '亿', '兆', '京', '垓', '秭']
  23.         if s > 10 ** 28 - 1:
  24.             return s
  25.         else:
  26.             s, slst, i = str(s), list(), 1
  27.             while s != '':
  28.                 slst.append(int(s[-4:]))
  29.                 s = s[:-4]
  30.             s = list()
  31.             for i in range(len(slst)):
  32.                 if slst[i] == 0:
  33.                     s.insert(0, '零')
  34.                 elif len(slst) == 1:
  35.                     s.insert(0, inner(slst[i]))
  36.                 elif 0 < slst[i] < 1000 and i != len(slst) - 1:
  37.                     s.insert(0, '零' + inner(slst[i]) + jin[i])
  38.                 else:
  39.                     s.insert(0, inner(slst[i]) + jin[i])
  40.             return re.sub('零+', '零', ''.join(s))

  41.     def __call__(self, func):
  42.         def _call(arg):
  43.             res = func(arg)
  44.             return self._change(res)
  45.         return _call




  46. class Fib:
  47.     def __init__(self):
  48.         self.a , self.b = 0, 1

  49.     def __iter__(self):
  50.         return self

  51.     @Hanzi()
  52.     def __next__(self):
  53.         while True:
  54.             self.a , self.b = self.b, self.a + self.b
  55.             return self.a
复制代码

  1. if __name__ == '__main__':
  2.     fib = Fib()
  3.     while True:
  4.         print(next(fib))
  5.         input()
复制代码


fib1.jpg fib2.jpg

大于10**28-1就只能显示数字了

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2018-3-21 10:59:10 | 显示全部楼层
领奖励

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-22 04:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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