我不知道为什么当我在 PyCharm 中以分步模式运行教程(下面的代码)时,每行都有一个断点(Shift+F9 开始,然后是 F8 每一步),我可以看到__iter__类被输入了myRange,但这是它进入__iter__类的方式MyGeneratorRange,我没有看到它 - 看起来好像main执行仍然在类中。
然而,如果你__iter__在这个类中放置一个调试打印,你可以看到它每次都应该出现。并且结果是正确的。很可能,我不知道 PyCharm 中的某些内容,但不清楚究竟是什么。请建议它可能是什么 - 类是相似的。
Chernyshov 教程中的代码(删除了不必要的行,代码是为几个示例设计的):https ://github.com/MADTeacher/python_basics/blob/master/part5/operations_overloading_3_1.py 。
class MyRange:
def __init__(self, start, stop, step=1):
self.start = start
self.stop = stop
self.step = step
self.count_value = 0
# Сюда вижу, как заходит
def __iter__(self):
self.count_value = self.start - self.step
return self
def __next__(self):
if self.count_value+self.step >= self.stop:
raise StopIteration
self.count_value += self.step
return self.count_value
class MyGeneratorRange:
def __init__(self, start, stop, step=1):
self.start = start
self.stop = stop
self.step = step
# А сюда не вижу, как заходит
def __iter__(self):
count_value = self.start - self.step
while count_value+self.step < self.stop:
count_value += self.step
yield count_value
if __name__ == "__main__":
test_range = MyRange(0, 3)
for firtst_it in test_range:
print(f'firtst_it = {firtst_it}')
for second_it in test_range:
print(f'second_it = {second_it}, '
f'firtst_it*second_it = {firtst_it*second_it}')
test_range = MyGeneratorRange(0, 3)
for firtst_it in test_range:
print(f'firtst_it = {firtst_it}')
for second_it in test_range:
print(f'second_it = {second_it}, '
f'firtst_it*second_it = {firtst_it*second_it}')
总的来说,为了在这种描述的情况下工作,我有必要按 F7 进入逐步模式,尽管断点设置在正确的位置,而且 F8 应该可以工作。同时,对于其他人来说,它与 F8 的工作方式相同。大概原因在于某些 PyCharm 设置。结论: