QQ登录

只需一步,快速开始

搜索
鱼C论坛笔记大赛成绩公示
查看: 316|回复: 17

[技术交流] Python:每日一题 98(前40楼答对有奖)

[复制链接]
最佳答案
445 
累计签到:661 天
连续签到:36 天
发表于 2017-9-10 12:31:12 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
我们知道range作为python的内置函数,可以接收1~3个参数,但与其他函数的缺省参数不同的是它可以省略掉第一个。
现在我们自己创建一个函数,模拟range,就叫它range2吧,接收1~3个参数返回生成器,可以这样使用:
  1. for i in range2(...):
复制代码

其实range本身是个类,如果你创建一个类来实现此功能更好。

公平起见,考虑到VIP可以看到答案,我就不把答案放上来了。

另答题加鱼币限制在40楼以内,望大家快快答题。

本帖被以下淘专辑推荐:

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
47 
累计签到:303 天
连续签到:10 天
发表于 2017-9-10 14:19:08 From FishC Mobile | 显示全部楼层
  1. def range2(*param):
  2.   if len(param)==3:
  3.     start,end,step=param
  4.   elif len(param)==2:
  5.     start,end=param
  6.     step=1
  7.   else:
  8.     end=param[0]
  9.     start,step=0,1
  10.   while start<end:
  11.     yield start
  12.     start+=step

  13. for i in range2(10):
  14.   print i
复制代码

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
1 
累计签到:250 天
连续签到:5 天
发表于 2017-9-10 15:04:23 | 显示全部楼层
本帖最后由 solomonxian 于 2017-9-10 15:10 编辑

感觉类比函数要多写很多啊,
类写得很少,动不动就无限递归
  1. class range2:
  2.     def __init__(self, start, stop=None, step=1):
  3.         if stop != None:
  4.             self.start = start-step
  5.             self.stop = stop
  6.         else:
  7.             self.start = -step
  8.             self.stop = start
  9.         
  10.         if step:
  11.             self.step = step
  12.         else:
  13.             raise ValueError("step不能为0")

  14.     def _stop(self):
  15.         if self.step >0:
  16.             if self.start >= self.stop:
  17.                 raise StopIteration("range2 已经被掏空")
  18.         else:
  19.             if self.start <= self.stop:
  20.                 raise StopIteration("range2 已经被掏空")

  21.     def __iter__(self):
  22.         return self
  23.    
  24.     def __next__(self):
  25.         self.start += self.step
  26.         self._stop()
  27.         return self.start
复制代码

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
4 
累计签到:102 天
连续签到:3 天
发表于 2017-9-10 15:38:41 | 显示全部楼层
  1. def range2(*params):
  2.   if len(params) >= 3:
  3.     start,end,step = params[0:3]
  4.   elif len(params) == 2:
  5.     start,end = param
  6.     step = 1
  7.   elif len(params) == 1:
  8.     end = params
  9.     start,step = 0,1
  10.    
  11.   while start<end:
  12.     yield start
  13.     start += step


  14. for i in range2(1,5,2,1):
  15.     print(i)
复制代码

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
2 
累计签到:3 天
连续签到:1 天
发表于 2017-9-10 21:52:42 From FishC Mobile | 显示全部楼层
def range2(a,b=None,c=None):
        if c==None:
            c=1
        if b==None:
            b,a=a,0
        x=[]
        if c > 0 and b >a:
            while b>a:
                x.append(a)
                a+=c
        elif c < 0 and b<a:
            while b<a:
                x.append(a)
                a+=c
        else:
            return(False)
        return(x)


print(range2(1,-10,-3))

不会用类  学的不好。。不知道这样 算不算

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:23 天
连续签到:1 天
发表于 2017-9-10 23:02:19 | 显示全部楼层
  1. def range2(*p):
  2.     result = []
  3.     n = 0
  4.     if len(p) == 1:
  5.         while n != p[0]:
  6.             result.append(n)
  7.             n += 1
  8.         return result
  9.     if len(p) == 2:
  10.         while n != p[1]:
  11.             result.append(n)
  12.             n += 1
  13.         return result[p[0]:n]
  14.     if len(p) ==3:
  15.         while n != p[1]:
  16.             result.append(n)
  17.             n += 1
  18.         return result[p[0]:n:p[2]]
  19.     else:
  20.         print('请输入3个参数')

  21. for i in range2(10):
  22.     print(i,end = ' ')
  23. print()

  24. for i in range2(2,10):
  25.     print(i,end = ' ')
  26. print()

  27. for i in range2(2,10,2):
  28.     print(i,end = ' ')
  29. print()
复制代码

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
3 
累计签到:83 天
连续签到:1 天
发表于 2017-9-11 14:38:46 | 显示全部楼层
还没有学到面向对象的知识,只能用笨办法了
  1. def range2(*a):
  2.   list0 = []
  3.   if(len(a)==1):
  4.      start=0
  5.      step=1
  6.      end=a[0]
  7.   elif(len(a)==2):
  8.      step=1
  9.      start=a[0]
  10.      end=a[1]
  11.   elif(len(a)==3):
  12.      start=a[0]
  13.      end=a[1]
  14.      step=a[2]
  15.   while(start<end):
  16.     list0.append(start)
  17.     start+=step
  18.   return list0

  19. for i in range2(1,5,2):
  20.     print(i)
复制代码

运行结果:
1
3

for i in range2(5):
    print(i)
0
1
2
3
4

for i in range2(1,5):
    print(i)
1
2
3
4

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:15 天
连续签到:2 天
发表于 2017-9-13 17:48:20 | 显示全部楼层
本帖最后由 wojiaojieer 于 2017-9-13 17:51 编辑

def range2(end,star = 0,step = 1):
    while star < end:
        yield star
        star += step
            
for i in range2(star = 3,end = 10,step = 3):
    print i

还有个小问题:请问下上面的鱼油和冬雪版主,我是个刚入Python 的小鱼儿。我看到楼上的大鱼们写的代码都很多。肯定是有原因的,能简单的说下我这个小鱼没有看出来为什么要写那么长的代码原因吗?感谢~

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:5 天
连续签到:1 天
发表于 2017-9-13 23:14:25 | 显示全部楼层
  1. def range2(*params):
  2.     if(len(params) == 3):
  3.         start = params[0]
  4.         end = params[1]
  5.         step = params[2]
  6.     elif(len(params) == 2):
  7.         start = params[0]
  8.         end = params[1]
  9.         step = 1
  10.     elif (len(params) == 1):
  11.         start = 0
  12.         end = params[0]
  13.         step = 1
  14.     else:
  15.         print ('param error')
  16.         return

  17.     while start < end:
  18.         yield start
  19.         start = start + step

  20. for i in range2(1,5):
  21.     print (i)
复制代码

评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:157 天
连续签到:2 天
发表于 2017-9-14 10:32:02 | 显示全部楼层
def range2(*param):
  if len(param) == 3:
    start,end,step = param
  elif len(param) == 2:
    step = 1
    start,end = param
   
  else:
    end= param[0]
    start,step = 0,1
  while start < end:
    yield start
    start += step


评分

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

查看全部评分

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:2 天
连续签到:1 天
发表于 2017-9-14 17:34:56 | 显示全部楼层
def range2(*param):
  if len(param)==3:
    start,end,step=param
  elif len(param)==2:
    start,end=param
    step=1
  else:
    end=param[0]
    start,step=0,1
  while start<end:
    yield start
    start+=step

for i in range2(10):
  print i

点评

怎么跟楼上的一样?  发表于 2017-9-15 16:56
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:94 天
连续签到:1 天
发表于 2017-9-15 13:38:35 | 显示全部楼层

def range2(*param):
  if len(param)==3:
    start,end,step=param
  elif len(param)==2:
    start,end=param
    step=1
  else:
    end=param[0]
    start,step=0,1
  while start<end:
    yield start
    start+=step

for i in range2(10):
  print i

点评

怎么跟楼上的一样?  发表于 2017-9-15 16:57
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
445 
累计签到:661 天
连续签到:36 天
 楼主| 发表于 2017-9-15 16:55:05 | 显示全部楼层
wojiaojieer 发表于 2017-9-13 17:48
def range2(end,star = 0,step = 1):
    while star < end:
        yield star

你的程序必需要使用者写上参数名,否则range2(1,3)就会出错。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:15 天
连续签到:2 天
发表于 2017-9-16 12:25:27 | 显示全部楼层
冬雪雪冬 发表于 2017-9-15 16:55
你的程序必需要使用者写上参数名,否则range2(1,3)就会出错。

版主,我也这样考虑过,但我发现直接把函数写成range2(3,1)就直接输出1,2了。所以才有上面的疑问。上面函数定义反了,只要反着写运行就是没有问题的。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
6 
累计签到:3 天
连续签到:1 天
发表于 2017-9-16 15:29:35 | 显示全部楼层
  1. class range2:
  2.     def __init__(self,start,stop,step=1):
  3.         self.start = start
  4.         self.stop = stop
  5.         self.step = step
  6.         self.current = self.start - self.step
  7.    
  8.     def __iter__(self):
  9.         return self
  10.         
  11.     def __next__(self):
  12.         if self.current >= self.stop:
  13.             raise StopIteration()
  14.         else:
  15.             self.current += self.step
  16.             return self.current
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
1 
累计签到:2 天
连续签到:1 天
发表于 2017-9-16 15:36:20 | 显示全部楼层
里面参数多少的判断是不是和matlab里面的nargin有点像
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-9-26 19:06 Powered by Discuz! X2.5 Theme by dreambred

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