gpt4 book ai didi

python - Python 对象中的良好样式

转载 作者:行者123 更新时间:2023-11-28 19:25:32 26 4
gpt4 key购买 nike

在使用 Python 之前,我的大部分编程都是使用 C++ 或 Matlab 进行的。我没有 CS 学位(几乎完成了物理学博士学位),但已经完成了一些类(class)和大量实际编程。现在,我正在 Coursera 上学习算法类(class)(顺便说一下,这门类(class)很棒,是斯坦福大学的一位教授授课的)。我决定用 Python 来完成作业。然而,有时我发现自己想要的东西语言并不那么容易支持。我非常习惯在 C++ 中为事物创建类和对象,只是为了将数据组合在一起(即当没有方法时)。然而,在 Python 中,您可以动态添加字段,我基本上最终一直想要的是 Matlab 结构。我认为这可能是我没有使用好的风格和以“Pythonic”方式做事的标志。

下面是我对联合查找数据结构(针对 Kruskal 算法)的实现。尽管实现相对较短并且运行良好(没有太多的错误检查),但还是有一些奇怪的地方。例如,我的代码假定最初传递给 union-find 的数据是一个对象列表。但是,如果传入的是显式数据列表(即整数列表),则代码会失败。有没有更清晰、更 Pythonic 的方法来实现它?我曾尝试用谷歌搜索这个,但大多数示例都非常简单并且更多地与过程代码相关(即在 python 中执行 for 循环的“正确”方法)。

class UnionFind:
def __init__(self,data):
self.data = data

for d in self.data:
d.size = 1
d.leader = d
d.next = None
d.last = d

def find(self,element):
return element.leader

def union(self,leader1,leader2):
if leader1.size >= leader2.size:
newleader = leader1
oldleader = leader2
else:
newleader = leader2
oldleader = leader1

newleader.size = leader1.size + leader2.size

d = oldleader
while d != None:
d.leader = newleader
d = d.next

newleader.last.next = oldleader
newleader.last = oldleader.last

del(oldleader.size)
del(oldleader.last)

最佳答案

一般来说,以 Python 方式做这类事情意味着您试图让您的代码不关心提供给它的内容,至少不超过它确实需要的内容。

让我们以联合查找算法为例。 union-find 算法对您传递给它的值所做的唯一事情就是比较它们是否相等。因此,要制作一个普遍有用的 UnionFind 类,您的代码不应依赖于它接收到的值具有除了相等性测试之外的任何行为。特别是,您不应依赖于能够为值分配任意属性。

我建议解决这个问题的方法是让 UnionFind 使用包装器对象来保存给定值和使算法工作所需的任何属性。您可以使用 namedtuple正如另一个答案所建议的那样,或者制作一个小的包装类。当一个元素被添加到 UnionFind 时,你首先将它包装在这些对象之一中,并使用包装对象来存储属性 leadersize 等。访问被包装的东西的唯一时间是检查它是否等于另一个值。

在实践中,至少在这种情况下,假定您的值是可散列的应该是安全的,这样您就可以将它们用作 Python 字典中的键来查找与给定值对应的包装对象。当然,并非 Python 中的所有对象都必须是可哈希的,但不是的对象相对较少,而且要构建能够处理这些对象的数据结构还有很多工作要做。

关于python - Python 对象中的良好样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com