鱼C论坛

 找回密码
 立即注册
查看: 3820|回复: 21

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

[复制链接]
发表于 2017-9-10 12:31:12 | 显示全部楼层 |阅读模式

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

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

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

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

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

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

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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

查看全部评分

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

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)就会出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-16 12:25:27 | 显示全部楼层
冬雪雪冬 发表于 2017-9-15 16:55
你的程序必需要使用者写上参数名,否则range2(1,3)就会出错。

版主,我也这样考虑过,但我发现直接把函数写成range2(3,1)就直接输出1,2了。所以才有上面的疑问。上面函数定义反了,只要反着写运行就是没有问题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-16 15:36:20 | 显示全部楼层
里面参数多少的判断是不是和matlab里面的nargin有点像
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-16 10:14:03 | 显示全部楼层
本帖最后由 776667 于 2017-10-16 10:38 编辑
  1. class range2:
  2.     def __init__(self,a,b=None,c=None):
  3.         self.gap = c if not c is None else 1
  4.         self.start = a-self.gap if not b is None else -1
  5.         self.end = b if not b is None else a

  6.     def __iter__(self):
  7.         return self

  8.     def __next__(self):
  9.         self.start += self.gap
  10.         if ((self.gap < 0) and (self.start <= self.end)) or ((self.gap > 0) and (self.start >= self.end)):
  11.             raise StopIteration()
  12.         return self.start
复制代码

楼上有的胖友忽略了第三个参数是负数的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 22:33:42 | 显示全部楼层
#range2 = functools.partial
def range2(num1, num2 = 0, num3 = 1):
    if num1 > num2 and num3 > 0:
        return Error
    elif num1 < num2 and num3 < 0:
        return Error
    if num1 < num2:
        while num1 < num2:
            yield num1
            num1 += num3
    elif num1 > num2 :
        while num1 > num2:
            yield num1
            num1 -= num3
        #yield num1
for i in range2(1, 5):
    print(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 15:30:49 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2019-8-18 15:36 编辑
  1. def xrange(*var):
  2.         for i in var:
  3.                 if type(i)!=int:raise TypeError(f'{str(type(8))[7:-1]} object cannot be interpreted as an integer')
  4.         k=len(var)
  5.         if k>3 or k==0:raise TypeError(f'xrange expected 1 arguments, got {k}')
  6.         elif k==3:
  7.                 if var[2]==0:raise ValueError('xrange() arg 3 must not be zero')
  8.                 start=var[0];stop=var[1];step=var[2]
  9.         elif k==2:start=var[0];stop=var[1];step=1
  10.         else:start=0;stop=var[0];step=1
  11.         while start<stop if step>0 else start>stop:yield start;start+=step
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-19 17:45:11 From FishC Mobile | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 21:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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