鱼C论坛

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

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

[复制链接]
发表于 2018-3-6 08:43:11 From FishC Mobile | 显示全部楼层
两个生成器
def cal():
    def nn(d):
        n=1
        while 1:
            n*=d
            yield n
    n2,n3=nn(2),nn(3)
    k,j=next(n2),next(n3)
    while 1:
        yield min(k,j)
        k,j=(next(n2),j) if k<j else (k,next(n3))
def main():
    k=cal()
    for i in range(50):
        print(next(k))
main()
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 23:04:15 | 显示全部楼层
  1. def fun():
  2.     i = 1
  3.     j = 1
  4.     while True:
  5.         if 2 ** i < 3 ** j:
  6.             yield 2 ** i
  7.             i += 1
  8.         else:
  9.             yield 3 ** j
  10.             j += 1

  11. for i in fun():
  12.     print(i)
  13.     input()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 10:57:28 | 显示全部楼层
自我感觉我的代码是最贴近题目意思的,和他们投机取巧的方法不同,我首先创建了两个列表分别储存2^n和3^n,然后再经过比较之后返回数值。
  1. def fun():
  2.     #我们先创建2**n和3**n列表
  3.     index,two,three=1,[],[]
  4.     while True:
  5.         two.append(2**index)
  6.         three.append(3**index)
  7.         index+=1
  8.         if index== 9:
  9.             index,indext = 0,0#初始化两个列表的索引
  10.             break
  11.     #以下为合并--排序过程
  12.     while 1:
  13.         if two[index] < three[indext]:
  14.             yield two[index]#返回相邻两个数较小的那个
  15.             if index < len(two)-1:#防止索引超出范围
  16.                 if two[index+1] < three[indext]:#用2^n这个列表中的第n+1个元素和3^n这个列表中的第n个元素比较
  17.                     yield two[index+1]          #避免类似于9排在8前面的情况出现
  18.                     index+=1    #由于已经返回了two[index+1],避免与14行的返回值重复,故将index+1
  19.             yield three[indext]
  20.         if index == len(two)-1:    #2^n这个列表的元素已经取完了,但有可能3^n的元素还没取完
  21.             for each in three[indext+1:]:    #迭代出3^n其余的元素并返回之
  22.                 yield each
  23.             break
  24.         #控制索引值递增
  25.         index+=1
  26.         indext+=1

  27. #一次性打印出所有数字
  28. for i in fun():
  29.     print(i)
  30. #以下实现输入一个回车显示一个数字
  31. gg=fun()
  32. while 1:
  33.     str1=input("请输入")
  34.     if str1=="":
  35.         try:
  36.             temp = next(gg)
  37.             print(temp)
  38.         except:
  39.             print("已经没有内容啦!")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 23:06:32 | 显示全部楼层
def fun():
    x=2
    y=3
    while True :
        if x<y :
            yield x
            x=x*2
        else :
            yield y
            y=y*3
for i in fun():
    print(i)
    input() #这里加入一个输入等待,按一次回车显示一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 10:45:35 | 显示全部楼层
给自己找题目做做~
  1. def fun():
  2.     n=1
  3.     m=1
  4.     while True:
  5.         n_2_pow = pow(2,n)
  6.         m_3_pow = pow(3,m)
  7.         min_pow = min(n_2_pow,m_3_pow)
  8.         if min_pow == n_2_pow:
  9.             n += 1
  10.         else :
  11.             m += 1
  12.         yield int(min_pow)

  13. def main():
  14.     for i in fun():
  15.         print(i)
  16.         x = input()
  17.         if x == '':
  18.             continue
  19.         else:
  20.             break
  21.     print('Over......')

  22. >>> main()
  23. 2

  24. 3

  25. 4

  26. 8

  27. 9

  28. 16

  29. 27

  30. 32

  31. 64

  32. 81

  33. 128

  34. 243

  35. 256

  36. 512

  37. 729

  38. 1024

  39. 2048

  40. 2187

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

使用道具 举报

发表于 2018-5-31 23:05:09 | 显示全部楼层

def fun():
   
    n = 1  #这个不要考虑fun()的输出 通过下面 for循环 输出
    while 1:
        s1 = 2**n
        s2 = 3**n
        n += 1
        if s1 > s2 :
            yield s2  #yield 是换行输出
        else:
            yield s1
        s1 = 0
        s2 = 0

for i in fun():
    print(i)
    input()  #空行输出,按enter输出一次
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-1 13:30:01 | 显示全部楼层
  1. Traceback (most recent call last):
  2. 为什么会报错?
  3. File "C:/Users/Administrator/Desktop/2.py", line 17, in <module>
  4.     q = input()
  5.   File "<string>", line 0
  6.    
  7.     ^
  8. SyntaxError: unexpected EOF while parsing
  9. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-18 22:27:01 | 显示全部楼层
  1. def fun() :
  2.         m, n, a, b = 1, 1, 2, 3
  3.         while True :
  4.                 c = 0
  5.                 if pow(a, m) < pow(b, n) :
  6.                         c = pow(a, m)
  7.                         m += 1
  8.                 else :
  9.                         c = pow(b, n)
  10.                         n += 1
  11.                 yield c

  12. for i in fun() :
  13.         print(i)
  14.         input()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-18 23:19:39 | 显示全部楼层
def fun():#我刚刚学了三天python不知道yield,百度了一下据说和return一样就闭着眼睛用了,谁给我科普一下啊
    a=2
    b=3
    while 1:
        if a<b:
            yield a
            a=a*2
        else:
            yield b
            b=b*3
   
for i in fun():
    print(i)
    input()
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 00:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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