来自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)
然后我创建了一些它的实例:
uno = Node(1)    
due = Node(2)    
tri = Node(3)    
qua = Node(4)
现在,尝试打印其中一个对象时的预期行为是打印相关值.这也发生了.
print uno
产量
1
但是当我做以下事情时:
uno.neighbours.append([[due, 4], [tri, 5]])
然后
print uno.neighbours
我明白了
[[[<__main__.Node instance at 0x00000000023A6C48>, 4], [<__main__.Node instance at 0x00000000023A6D08>, 5]]]
在哪里我期待
[[2, 4], [3, 5]]
我错过了什么?还有什么其他令人讨厌的东西我在做什么?:)
我有这样一条线:
filter(lambda x: x == 1, [1, 1, 2])
Pylint正在显示警告:
W:  3: Used builtin function 'filter'
这是为什么?列表理解推荐的方法是什么?
当然我可以像这样重写:
[x for x in [1, 1, 2] if x == 1]
而且我没有收到任何警告,但我想知道是否有这样的PEP?
当我在对象数组而不是字符串数组上读取Python string.join(list)的问题时,我找到以下句子:
', '.join(str(x) for x in list)
我已经知道(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
同时,str.join(iterable)返回一个字符串,该字符串是iterable中字符串的串联.所以以下工作正常,我希望如此.
>>> ",".join((str(x) for x in [1,2,3]))
'123'
接下来是问题,为什么代码在下面工作得很好,为什么在函数调用中不需要括号.
', '.join(str(x) for x in [1,2,3])
毕竟,   str(x) for x in [1,2,3]它本身不是发电机.
>>> tmp = str(x) for x in [1,2,3]
  File "<stdin>", line 1
    tmp = str(x) …