鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-3-23 08:39:02 | 显示全部楼层
  1. '''
  2. 如果一个类想被用于for ... in循环,类似list或tuple那样
  3. 就必须实现一个__iter__()方法,该方法返回一个迭代对象
  4. 然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值。
  5. 写一个生成斐波那契数列Fib的类,可以作用于for循环
  6. 要求打印输出的数值用中文表示
  7. '''

  8. def shownumBychinese(n):
  9.     numdc={0:'零',1:'一',2:'二',3:'三',4:'四',5:'五',6:'六',7:'七',8:'八',9:'九'}
  10.     bitdc={1:'',2:'十',3:'百',4:'千',5:'万'}
  11.     showstr=''
  12.     listnum=list(str(n))
  13.     listlen=len(listnum)
  14.     k=0
  15.     while k<listlen:
  16.         if listnum[k]=='0':
  17.             showstr=showstr+'零'
  18.         else:
  19.             showstr=showstr+numdc[int(listnum[k])]+bitdc[listlen-k]
  20.         k=k+1
  21.     xstr='零零'
  22.     while xstr in showstr:
  23.         showstr=showstr.replace(xstr,'零')
  24.     if showstr.endswith('零'):
  25.         return showstr[:-1]
  26.     else:
  27.         return showstr

  28. class Fib(object):
  29.     def __init__(self):
  30.         self.a=1
  31.         self.b=1
  32.     def __iter__(self):
  33.         return self
  34.     def __next__(self):
  35.             self.a,self.b=self.b,(self.a+self.b)
  36.             return self.a

  37. myfib=Fib()
  38. for i in myfib:
  39.     if i<10000:
  40.         print(shownumBychinese(i))
  41.     else:
  42.         break
  43.         
  44.         
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-23 08:55:23 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-23 19:30:27 | 显示全部楼层
评分截至标记。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-23 19:46:45 | 显示全部楼层
天圆突破 发表于 2018-3-21 10:58
加了点难度,支持10**28-1以内的数字转换,汉字数字好像只能这么大,再大就没有单位了。

都没听过好几个单位,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-23 23:55:49 | 显示全部楼层

好像出现了 '一十三'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 08:51:10 | 显示全部楼层
本帖最后由 the0503 于 2018-3-24 08:52 编辑
  1. #!/usr/bin/python
  2. #-*- encoding: utf-8 -*-

  3. import types
  4. _MAPPING = ('零', '一', '二', '三', '四', '五', '六','七', '八','九', )
  5. _P0 = ('', '十', '百', '千', )
  6. _S4= 10 ** 4

  7. class Fib(object):
  8.     def __init__(self):
  9.         self.a,self.b = 0,1 # 初始化两个计数器a,b

  10.     def __iter__(self):
  11.         return self # 实例本身就是迭代对象,故返回自己

  12.     def __next__(self):
  13.         self.a, self.b = self.b, self.a + self.b # 计算下一个值
  14.         return self.a # 返回下一个值


  15. def _to_chinese4(num):
  16.     assert(0 <= num and num < _S4)
  17.     if num < 10:
  18.         return _MAPPING[num]
  19.     elif num>=10 and num<20:
  20.         return '十'+ _MAPPING[num-10]

  21.     else:
  22.         lst = [ ]
  23.         lst1= []
  24.                   
  25.         lst1=list(str(num))
  26.         for i in lst1:
  27.             temp=int(i)
  28.             lst.append(temp)
  29.         lst.reverse()
  30.         c = len(lst)  # 位数
  31.         result = ''
  32.      
  33.         for idx, val in enumerate(lst):
  34.             if val != 0:
  35.                 result += _P0[int(idx)] + _MAPPING[int(val)]
  36.                 if idx < c - 1 and lst[int(idx + 1)] == 0:
  37.                         result += '零'
  38.         return result[::-1]   

  39. for i in Fib():
  40.     if i >10000:
  41.         break
  42.     print(_to_chinese4(i))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 10:41:50 | 显示全部楼层
class fib(object):
    def __init__(self):
        self.a,self.b=0,1
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b=self.b,self.b+self.a
        if self.a>100000:
            raise StopIteration()
        return self.a

fib=fib()
innum='0123456789'
outnum='零一二三四五六七八九'
suffix='十百千万'

for i in fib:
    output=''
    print(i)
    a=len(str(i))
    input=str(i)
    for j in input:
        if int(j):
            output+=outnum[innum.index(str(j))]
            if a>1:
                output+=suffix[a-2]
        else:
            if a>1:
               output+='零'
        a=a-1
    print(output)        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-12 11:24:34 | 显示全部楼层
def fun():
    dct = dict(zip([0,1,2,3,4,5,6,7,8,9,10,100,1000,10000], ["零","一","二","三","四","五","六","七","八","九","十","百","千","万"]))
    print(dct)
    a, b = 1, 1
    while b <= 10000:
        a, b =b, a+b
        lent = len(str(b))
        other = b
        out = ""
        for i in range(lent):
            k = other % 10
            if 10**i > 1:
                out += dct[10**i] + dct[k]
            else:
                out += dct[k]
            other = other//10
        out = out[::-1]
        if out[-1] == "零":
            out = out[:-1]
        yield out
fun()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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