鱼C论坛

 找回密码
 立即注册
查看: 4377|回复: 55

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

[复制链接]
发表于 2018-2-26 20:31:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-3-4 19:41 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
2的n次方是2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,  2048......
3的n次方是3, 9, 27, 81, 243, 729,  2187......
如果两个序列合并,并按由小到大排列则是
2, 3, 4, 8, 9, 16, 27, 32, 64, 81, 128, 243, 256, 512, 729, 1024, 2048, 2187......
现在要求编写一个函数fun(),以yield返回值,成为一个生成器,可以以下面的方式调用函数,
  1. for i in fun():
  2.     print(i)
  3.     input() #这里加入一个输入等待,按一次回车显示一个
复制代码

注不能使用列表等方式,再合并排序,因为这个序列可以有无穷多个数。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-2-26 21:55:06 | 显示全部楼层
  1. import itertools as it
  2. def func():
  3.     X = (2**x for x in it.count(1))
  4.     Y = (3**x for x in it.count(1))
  5.     x = next(X)
  6.     y = next(Y)
  7.     while True:
  8.         if x>y:
  9.             yield y
  10.             y = next(Y)
  11.         else:
  12.             yield x
  13.             x = next(X)

  14. for i in func():
  15.     print(i)
  16.     input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-26 21:56:38 | 显示全部楼层
  1. def fun():
  2.     x = 1
  3.     numset = set()
  4.     while x:
  5.         numset.add(2**x)
  6.         numset.add(3**x)
  7.         minum = min(numset)
  8.         yield minum
  9.         numset.remove(minum)
  10.         x += 1

  11. for i in fun():
  12.     print(i)
  13.     input()
复制代码

我不知道是不能用列表进行合并排序还是说不能用列表,干脆就不用了。
还有大佬你的题目里面1024后面应该是2048。

点评

多谢提醒,已改正  发表于 2018-2-26 22:02

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-26 22:17:49 | 显示全部楼层
  1. def fun():
  2.     a, b = 1, 1
  3.     while True:
  4.         if pow(2, a) < pow(3, b):
  5.             res = pow(2, a)
  6.             a += 1            
  7.         else:
  8.             res = pow(3, b)
  9.             b += 1
  10.         yield res
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-26 22:41:58 | 显示全部楼层
  1. list1=[]
  2. x=1
  3. def fun():   
  4.     global list1
  5.     global x
  6.     list1.append(2**x)
  7.     list1.append(3**x)
  8.     if len(list1)!=1:
  9.         for j in range(len(list1)-1,0,-1):
  10.             if list1[j]<list1[j-1]:
  11.                 temp=list1[j-1]
  12.                 list1[j-1]=list1[j]
  13.                 list1[j]=temp         
  14.     return list1

  15. for i in fun():
  16.     print(i)
  17.     input()
  18.     x+=1
  19.     fun()
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 要求是生成器哟

查看全部评分

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

使用道具 举报

发表于 2018-2-26 23:27:14 | 显示全部楼层
  1. def fun157():
  2.     x = 1
  3.     list_x = list()
  4.     while True:
  5.         list_x.extend([2**x,3**x])
  6.         yield sorted(list_x)[x-1]
  7.         x += 1

  8. if __name__ == '__main__':
  9.     for i in fun157():
  10.         print(i)
  11.         input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 00:22:27 | 显示全部楼层
剛學習編程的新手 每日練習奠定穩固的編程基礎!
今天這題跟小甲魚的課後題利用生成器求質數很類似(避免內存爆炸)
相信有認真做作業的同學都能完成,順便複習了生成器的用法

  1. import math as m

  2. def number_check(number):     #檢查是2或3的n次方
  3.     global i,j
  4.     if number == int(m.pow(2, i)):
  5.         i += 1
  6.         return True
  7.     elif number == int(m.pow(3, j)):
  8.         j += 1
  9.         return True
  10.     return False

  11. def fun():          #生成器
  12.     number = 1
  13.     while True:
  14.         if number_check(number):
  15.             yield number
  16.         number += 1
  17.       
  18. i, j = 1, 1

  19. for number in fun():
  20.     print(number)
  21.     input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 03:02:03 | 显示全部楼层
  1. def fun():
  2.     a,b=2,3
  3.     while True:
  4.         if a>b:
  5.             yield b
  6.             b*=3
  7.         else:
  8.             yield a
  9.             a*=2
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 08:41:53 | 显示全部楼层
  1. def generrator():
  2.     ia=1
  3.     ib=1
  4.     a=2**ia
  5.     b=3**ib
  6.     r={'a':a, 'b':b}
  7.     while True:
  8.         if r['a']<r['b']:
  9.             ia+=1
  10.             yield r['a']
  11.             r['a']=2**ia
  12.         else:
  13.             ib+=1
  14.             yield r['b']
  15.             r['b']=3**ib

  16. for i in generrator():
  17.     print(i)
  18.     input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 10:32:59 | 显示全部楼层
本帖最后由 凌九霄 于 2018-2-27 10:34 编辑
  1. def power():
  2.     a = 1
  3.     b = 1
  4.     while True:
  5.         if (2 ** a < 3 ** b):
  6.             yield 2 ** a
  7.             a += 1
  8.         else:
  9.             yield 3 ** b
  10.             b += 1


  11. for i in power():
  12.     print(i,end='')
  13.     input()
复制代码


360截图20180227103201342.jpg

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 10:33:23 | 显示全部楼层
def fun():
    a=2
    b=3
    yield a
    a = a*2
    while True:
        if a<b:
            yield a
            a = a*2
        else:
            yield b
            b = b*3
            
for i in fun():
    print(i)
    input()  


2

3

4

8

9

16

27

32

64

81

128

243

256

512

729

1024

2048

2187

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 10:44:45 | 显示全部楼层
  1. n2, n3 = 1, 1

  2. def fun():
  3.     global n2, n3
  4.     while True:
  5.         if 2**n2 < 3**n3:
  6.             n2 += 1
  7.             yield 2**(n2-1)
  8.         else:
  9.             n3 += 1
  10.             yield 3**(n3-1)

  11. for i in fun():
  12.     print(i)
  13.     input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 10:59:27 | 显示全部楼层
def fun():
        n = 1
        list1 = []
        while True:
                r2 = 2**n
                r3 = 3**n
                list1.append(r2)
                list1.append(r3)
                list1.sort()
                yield list1.pop(0)
                n += 1
               
for i in fun():
        print(i)
        input()

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 11:23:40 | 显示全部楼层
本帖最后由 lemon123 于 2018-2-27 11:25 编辑

def fun():
    i=1
    while True:
        m=3**i
        yield m
        c=i+1
        mm=1
        while mm==1:
            if 2**c >3**i:
                if 2**c < 3**(i+1):
                      yield 2**c
                else:
                    mm=0
            c+=1
        
        i+=1
for i in fun():
    print(i)
    raw_input()

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 没有从2开始

查看全部评分

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

使用道具 举报

发表于 2018-2-27 12:59:32 | 显示全部楼层
#fun yield

def fun():
    m,n = 1,1
    while True:
        if pow(2,m)>pow(3,n):
            yield pow(3,n)
            n += 1
        elif pow(2,m)<pow(3,n):
            yield pow(2,m)
            m += 1
        elif pow(2,m)==pow(3,n):
            yield pow(2,m)
            m += 1
            n += 1
    return

def main():
    for i in fun():
        print(i,end='')
        input()
    return

if __name__ == "__main__":
    main()

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 13:05:23 | 显示全部楼层
#-*-coding :utf-8 -*-
#-*-coding :cp936 -*-
def fun():
        i=1
        j=1
        while True :
                if 2**i<3**j :
                        yield 2**i
                        i+=1
                else :
                        yield 3**j
                        j+=1
for i in fun() :
        print(i)
        input()

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 14:15:39 | 显示全部楼层
  1. def fun():
  2.     a = 2
  3.     b = 3
  4.     while 1:
  5.         yield a
  6.         a *= 2
  7.         yield b
  8.         b *= 2

复制代码

点评

结果不对  发表于 2018-3-4 19:52
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 14:39:13 | 显示全部楼层
本帖最后由 solomonxian 于 2018-2-27 14:40 编辑

没说输入是什么啊,是两个数学方程吗
  1. def fun(y1, y2):
  2.     x1 = x2 = 1
  3.     while 1:
  4.         if y1(x1) <= y2(x2):
  5.             yield y1(x1)
  6.             x1 += 1
  7.         else:
  8.             yield y2(x2)
  9.             x2 += 1


  10. if __name__ == "__main__":
  11.     a = lambda n: 2**n
  12.     b = lambda n: 3**n
  13.     for i in fun(a, b):
  14.         print(i)
  15.         input()
复制代码

整数数学方程有点奇怪,还是假设输入是生成器吧
生成器可短可长,可空可无穷
  1. def fun2(g1, g2):
  2.     def nextone(g):
  3.         try:
  4.             return next(g)
  5.         except StopIteration:
  6.             return float('inf')
  7.         
  8.     lst1 = [nextone(g1), g1]
  9.     lst2 = [nextone(g2), g2]
  10.     while True:
  11.         if lst1[0] == lst2[0] == float('inf'):
  12.             raise StopIteration
  13.         
  14.         temp = min([lst1, lst2])
  15.         yield temp[0]
  16.         temp[0] = nextone(temp[1])


  17. if __name__ == "__main__":
  18.     a = (2**i for i in range(1, 6))
  19.     b = (3**i for i in range(1,3))
  20.     for i in fun2(a, b):
  21.         print(i)
  22.         input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 15:19:19 | 显示全部楼层
def fun23(x,i):
    a,b=0,1
    while b<=i:
        a=x**b
        yield a
        b+=1
def fun(i):
    a=fun23(2,i)
    b=fun23(3,i)
    n=1
    a1=next(a)
    b1=next(b)
    flag=False
    while n<=2*i:
        if a1<b1 and flag==False:
            yield a1
            # 捕获a1的stopiteration异常后,说明a1全部输出完成,将flag标志位为真,终止a<b的判断
            try:
                a1 = next(a)
            except :
                flag=True
        else:
            yield b1
            b1 = next(b)
        n+=1
i=input("请输入数字:")
i=int(i)
for j in fun(i):
    print(j)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-27 15:20:22 | 显示全部楼层
  1. def fun():
  2.     n2 = 1
  3.     n3 = 1
  4.     while True:
  5.         a = 2**n2
  6.         b = 3**n3
  7.         x = a if a < b else b
  8.         yield x
  9.         if a < b:
  10.             n2 += 1
  11.         else:
  12.             n3 += 1

  13. for i in fun():
  14.     print(i)
  15.     input()
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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