|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 KeyError 于 2023-1-17 17:18 编辑
- >>> #shell
- >>> help(range)
- Help on class range in module builtins:
- class range(object)
- | range(stop) -> range object
- | range(start, stop[, step]) -> range object
- |
- | Return an object that produces a sequence of integers from start (inclusive)
- | to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
- | start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
- | These are exactly the valid indices for a list of 4 elements.
- | When step is given, it specifies the increment (or decrement).
- |
- | Methods defined here:
- |
- | __bool__(self, /)
- | self != 0
- |
- | __contains__(self, key, /)
- | Return key in self.
- |
- | __eq__(self, value, /)
- | Return self==value.
- |
- | __ge__(self, value, /)
- | Return self>=value.
- |
- | __getattribute__(self, name, /)
- | Return getattr(self, name).
- |
- | __getitem__(self, key, /)
- | Return self[key].
- |
- | __gt__(self, value, /)
- | Return self>value.
- |
- | __hash__(self, /)
- | Return hash(self).
- |
- | __iter__(self, /)
- | Implement iter(self).
- |
- | __le__(self, value, /)
- | Return self<=value.
- |
- | __len__(self, /)
- | Return len(self).
- |
- | __lt__(self, value, /)
- | Return self<value.
- |
- | __ne__(self, value, /)
- | Return self!=value.
- |
- | __reduce__(...)
- | Helper for pickle.
- |
- | __repr__(self, /)
- | Return repr(self).
- |
- | __reversed__(...)
- | Return a reverse iterator.
- |
- | count(...)
- | rangeobject.count(value) -> integer -- return number of occurrences of value
- |
- | index(...)
- | rangeobject.index(value) -> integer -- return index of value.
- | Raise ValueError if the value is not present.
- |
- | ----------------------------------------------------------------------
- | Static methods defined here:
- |
- | __new__(*args, **kwargs) from builtins.type
- | Create and return a new object. See help(type) for accurate signature.
- |
- | ----------------------------------------------------------------------
- | Data descriptors defined here:
- |
- | start
- |
- | step
- |
- | stop
- >>>
复制代码
所以,我们今天来实现range类的基本功能
根据小甲鱼老师的生成器,代码显而易见
- >>> class range:
- def __init__(self, stop, /):
- self.stop = stop
- self.num = -1
- def __iter__(self):
- return self
- def __next__(self):
- self.num += 1
- if self.num >= self.stop:
- raise StopIteration
- return self.num
- >>>
复制代码
但是这样并不能传入开始值和步长
问题是如果只有一个参数,它应该是结束值,但有两个及以上,应该按开始值,结束值,步长的顺序传入。
两千年后,我终于想到了办法!
- class range:
- def __init__(self, *args, /):
- if len(args) == 1:
- self.stop = args[0]
- self.num = -1
- self.add = 1
- elif len(args) == 2:
- self.stop = args[1]
- self.num = args[0] - 1
- self.add = 1
- elif len(args) == 3:
- self.stop = args[1]
- self.num = args[0] - 1
- self.add = args[2]
- elif len(args) == 0:
- raise TypeError("range expected at 1 argument, got 0")
- else:
- raise TypeError(f"range expexct ed at 3 argument, got {len(args)}")
- def __iter__(self):
- return self
- def __next__(self):
- self.num += self.add
- if self.num >= self.stop:
- raise StopIteration
- return self.num
- >>>
复制代码- >>> for i in range(1, 10, 2):
- print(i)
- 1
- 3
- 5
- 7
- 9
- >>>
复制代码
完美!
|
评分
-
查看全部评分
|