|
|
答案其实非常简单:
取决于你是否在“直接调用方法”,还是 Python 在“间接调用”这些方法。
下面分两段代码解释。
一、为什么 return len(self) < len(other) 会显示结果?
你定义的是:
- def __lt__(self, other):
- return len(self) < len(other)
复制代码
然后执行:s1 < s2
注意:s1 < s2 是 Python 调用 s1.__lt__(s2) 的语法糖(直接调用)。
也就是说,这一句实际等价于:s1.__lt__(s2)
你写的是一个返回布尔值的函数,所以解释器必须把结果打印出来。
因此你会看到:False
这很正常,因为你“直接调用/触发”的是一个运算,其返回值需要展示。
二、为什么 return item 不会出现在输出?
来看你的迭代类:
- class C:
- def __next__(self):
- print("Next", end=' -> ')
- ...
- return item
复制代码
你运行的是:3 in c
这是重点:
3 in c 并不是直接调用 __next__,而是 Python 自己内部用循环来判断是否包含某元素。
它实际做的是:
- it = iter(c)
- for element in it:
- if element == 3:
- return True
- return False
复制代码
也就是说:你并没有直接打印 __next__() 的返回值
Python 只是内部使用这些值做比较,内部比较完了,只有最终结果 True 被打印出来
所以运行:3 in c
输出的是:Iter -> Next -> Next -> Next -> True
这里:
Iter 和 Next 来自你自己写的 print()
但 item 的值被 Python 拿去内部对比,并没有被自动打印。
因为你不是这样调用的:print(c.__next__())
三、为什么一个 return 会出现,一个不会?
s1 < s2 会 你触发了一个表达式,Python 必须显示其结果
3 in c 不会 Python 内部循环使用 return 值,但不会帮你打印
只有当你自己主动调用或打印方法时,return 才会显示。
例如:
- c = C([1, 2, 3])
- print(c.__next__())
复制代码
你就能看到 item 的值了。
四、验证:如何看到 item?
你只要自己调用就能看到:
- c = C([1, 2, 3, 4, 5])
- print(next(c))
复制代码
输出会是:Iter -> Next -> 1
这说明 return item 是正常返回的,只是你没有打印它。
return 的值是否显示出来,取决于你是否主动在表达式或 print 中调用方法。
Python 内部机制调用的方法(如迭代、in 运算)不会自动打印 return 的结果。 |
|