来自Java背景,我明白__str__这就像是toString的Python版本(虽然我确实认识到Python是较旧的语言).
所以,我已经定义了一个小类以及__str__如下方法:
class Node:
def __init__(self, id):
self.id = id
self.neighbours = []
self.distance = 0
def __str__(self):
return str(self.id)
Run Code Online (Sandbox Code Playgroud)
然后我创建了一些它的实例:
uno = Node(1)
due = Node(2)
tri = Node(3)
qua = Node(4)
Run Code Online (Sandbox Code Playgroud)
现在,尝试打印其中一个对象时的预期行为是打印相关值.这也发生了.
print uno
Run Code Online (Sandbox Code Playgroud)
产量
1
Run Code Online (Sandbox Code Playgroud)
但是当我做以下事情时:
uno.neighbours.append([[due, 4], [tri, 5]])
Run Code Online (Sandbox Code Playgroud)
然后
print uno.neighbours
Run Code Online (Sandbox Code Playgroud)
我明白了
[[[<__main__.Node instance at 0x00000000023A6C48>, 4], [<__main__.Node instance at 0x00000000023A6D08>, 5]]]
Run Code Online (Sandbox Code Playgroud)
在哪里我期待
[[2, 4], [3, 5]]
Run Code Online (Sandbox Code Playgroud)
我错过了什么?还有什么其他令人讨厌的东西我在做什么?:)
我有这样一条线:
filter(lambda x: x == 1, [1, 1, 2])
Run Code Online (Sandbox Code Playgroud)
Pylint正在显示警告:
W: 3: Used builtin function 'filter'
Run Code Online (Sandbox Code Playgroud)
这是为什么?列表理解推荐的方法是什么?
当然我可以像这样重写:
[x for x in [1, 1, 2] if x == 1]
Run Code Online (Sandbox Code Playgroud)
而且我没有收到任何警告,但我想知道是否有这样的PEP?
当我在对象数组而不是字符串数组上读取Python string.join(list)的问题时,我找到以下句子:
', '.join(str(x) for x in list)
Run Code Online (Sandbox Code Playgroud)
我已经知道(str(x) for x in list)是一个生成器表达式,我也知道生成器是一个可迭代的.以下代码验证了我的视图的正确性.
>>> gen = (x for x in [1,2,3])
<generator object <genexpr> at 0x104349b40>
>>> from collections import Iterable
>>> isinstance(gen, Iterable)
True
Run Code Online (Sandbox Code Playgroud)
同时,str.join(iterable)返回一个字符串,该字符串是iterable中字符串的串联.所以以下工作正常,我希望如此.
>>> ",".join((str(x) for x in [1,2,3]))
'123'
Run Code Online (Sandbox Code Playgroud)
接下来是问题,为什么代码在下面工作得很好,为什么在函数调用中不需要括号.
', '.join(str(x) for x in [1,2,3])
Run Code Online (Sandbox Code Playgroud)
毕竟, str(x) for x in [1,2,3]它本身不是发电机.
>>> tmp = str(x) for x in [1,2,3]
File "<stdin>", line 1
tmp = str(x) …Run Code Online (Sandbox Code Playgroud)