鱼C论坛

 找回密码
 立即注册
查看: 1965|回复: 1

[作品展示] 实现range类

[复制链接]
发表于 2023-1-17 17:17:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 KeyError 于 2023-1-17 17:18 编辑
  1. >>> #shell
  2. >>> help(range)
  3. Help on class range in module builtins:

  4. class range(object)
  5. |  range(stop) -> range object
  6. |  range(start, stop[, step]) -> range object
  7. |  
  8. |  Return an object that produces a sequence of integers from start (inclusive)
  9. |  to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
  10. |  start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
  11. |  These are exactly the valid indices for a list of 4 elements.
  12. |  When step is given, it specifies the increment (or decrement).
  13. |  
  14. |  Methods defined here:
  15. |  
  16. |  __bool__(self, /)
  17. |      self != 0
  18. |  
  19. |  __contains__(self, key, /)
  20. |      Return key in self.
  21. |  
  22. |  __eq__(self, value, /)
  23. |      Return self==value.
  24. |  
  25. |  __ge__(self, value, /)
  26. |      Return self>=value.
  27. |  
  28. |  __getattribute__(self, name, /)
  29. |      Return getattr(self, name).
  30. |  
  31. |  __getitem__(self, key, /)
  32. |      Return self[key].
  33. |  
  34. |  __gt__(self, value, /)
  35. |      Return self>value.
  36. |  
  37. |  __hash__(self, /)
  38. |      Return hash(self).
  39. |  
  40. |  __iter__(self, /)
  41. |      Implement iter(self).
  42. |  
  43. |  __le__(self, value, /)
  44. |      Return self<=value.
  45. |  
  46. |  __len__(self, /)
  47. |      Return len(self).
  48. |  
  49. |  __lt__(self, value, /)
  50. |      Return self<value.
  51. |  
  52. |  __ne__(self, value, /)
  53. |      Return self!=value.
  54. |  
  55. |  __reduce__(...)
  56. |      Helper for pickle.
  57. |  
  58. |  __repr__(self, /)
  59. |      Return repr(self).
  60. |  
  61. |  __reversed__(...)
  62. |      Return a reverse iterator.
  63. |  
  64. |  count(...)
  65. |      rangeobject.count(value) -> integer -- return number of occurrences of value
  66. |  
  67. |  index(...)
  68. |      rangeobject.index(value) -> integer -- return index of value.
  69. |      Raise ValueError if the value is not present.
  70. |  
  71. |  ----------------------------------------------------------------------
  72. |  Static methods defined here:
  73. |  
  74. |  __new__(*args, **kwargs) from builtins.type
  75. |      Create and return a new object.  See help(type) for accurate signature.
  76. |  
  77. |  ----------------------------------------------------------------------
  78. |  Data descriptors defined here:
  79. |  
  80. |  start
  81. |  
  82. |  step
  83. |  
  84. |  stop
  85. >>>
复制代码


所以,我们今天来实现range类的基本功能

根据小甲鱼老师的生成器,代码显而易见

  1. >>> class range:
  2.     def __init__(self, stop, /):
  3.         self.stop = stop
  4.         self.num = -1
  5.     def __iter__(self):
  6.         return self
  7.     def __next__(self):
  8.         self.num += 1
  9.         if self.num >= self.stop:
  10.             raise StopIteration
  11.         return self.num
  12. >>>
复制代码


但是这样并不能传入开始值和步长

问题是如果只有一个参数,它应该是结束值,但有两个及以上,应该按开始值,结束值,步长的顺序传入。

两千年后,我终于想到了办法!

  1. class range:
  2.     def __init__(self, *args, /):
  3.         if len(args) == 1:
  4.             self.stop = args[0]
  5.             self.num = -1
  6.             self.add = 1
  7.         elif len(args) == 2:
  8.             self.stop = args[1]
  9.             self.num = args[0] - 1
  10.             self.add = 1
  11.          elif len(args) == 3:
  12.             self.stop = args[1]
  13.             self.num = args[0] - 1
  14.             self.add = args[2]
  15.          elif len(args) == 0:
  16.             raise TypeError("range expected at 1 argument, got 0")
  17.          else:
  18.             raise TypeError(f"range expexct ed at 3 argument, got {len(args)}")
  19.     def __iter__(self):
  20.         return self
  21.     def __next__(self):
  22.         self.num += self.add
  23.         if self.num >= self.stop:
  24.             raise StopIteration
  25.         return self.num
  26. >>>
复制代码
  1. >>> for i in range(1, 10, 2):
  2.         print(i)

  3. 1
  4. 3
  5. 5
  6. 7
  7. 9
  8. >>>
复制代码


完美!

评分

参与人数 1贡献 +2 收起 理由
sfqxx + 2

查看全部评分

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

使用道具 举报

发表于 2023-4-8 15:38:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 01:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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