作为一名学习Python的Java程序员,我应该注意什么?

作为一名学习Python的Java程序员,我应该注意什么?,java,python,Java,Python,我的大部分编程背景都是Java,我仍然在用Java进行大部分编程。然而,我开始为一些工作中的辅助项目学习Python,我希望学习它尽可能独立于我的Java背景,也就是说,我不想仅仅用Python编写Java程序。我应该注意些什么 一个简单的例子——在浏览Python教程时,我发现函数的默认可变参数(如列表)是持久化的(从一个调用到另一个调用都会记住)。作为一名Java程序员,这与我的直觉背道而驰,很难理解。(如果您不理解示例,请参阅和。) 有人也给了我一份清单,我觉得很有帮助,但很短。有没有其他

我的大部分编程背景都是Java,我仍然在用Java进行大部分编程。然而,我开始为一些工作中的辅助项目学习Python,我希望学习它尽可能独立于我的Java背景,也就是说,我不想仅仅用Python编写Java程序。我应该注意些什么

一个简单的例子——在浏览Python教程时,我发现函数的默认可变参数(如列表)是持久化的(从一个调用到另一个调用都会记住)。作为一名Java程序员,这与我的直觉背道而驰,很难理解。(如果您不理解示例,请参阅和。)

有人也给了我一份清单,我觉得很有帮助,但很短。有没有其他例子说明Java程序员可能会滥用Python。。。?或者Java程序员会错误地假设或难以理解的事情

编辑:好的,简要概述一下我链接到的那篇文章提出的防止答案重复的原因(如蜥蜴比尔所建议的)。(如果我在措辞上出错,请告诉我,我只是刚开始使用Python,所以我可能不完全理解所有的概念。还有一个免责声明——这些内容将非常简短,因此如果你不理解它的意思,请查看链接。)

  • Java中的静态方法不会转换为Python类方法
  • Java中的switch语句转换为Python中的哈希表
  • 不要使用XML
  • 能手和二传手都是邪恶的(嘿,我只是引用:)
  • 代码重复在Java中通常是一个必要的缺点(例如方法重载),但在Python中则不是

(如果你觉得这个问题很有趣,还是去看看链接吧。)

我能想到的最大问题是不理解或没有充分利用duck类型。在Java中,需要预先指定非常明确和详细的类型信息。在Python中,类型是动态的,并且基本上是隐式的。其理念是,您应该在比名义类型更高的层次上思考您的程序。例如,在Python中,您不使用继承来建模可替换性。默认情况下,可替换性是duck类型的结果。继承只是程序员重用实现的一种方便

类似地,python的成语是“乞求原谅,不要请求许可”。显式类型被认为是邪恶的。不要预先检查参数是否为某一类型。只要试着对参数做任何你需要做的事情。如果它不符合正确的接口,它将抛出一个非常明显的异常,您将能够很快找到问题。如果有人传递的参数类型名义上是意外的,但接口与您预期的相同,那么您就获得了免费的灵活性。

  • 不要把所有的东西都放在课堂上。Python的内置列表和字典将带您走得更远
  • 不要担心每个模块只保留一个类。按目的划分模块,而不是按类别划分模块
  • 将继承用于行为,而不是接口。不要为“Dog”和“Cat”创建要继承的“Animal”类,这样您就可以有一个通用的“make_sound”方法
只要这样做:

class Dog(object):
    def make_sound(self):
        return "woof!"

class Cat(object):
    def make_sound(self):
        return "meow!"

class LolCat(object):
    def make_sound(self):
        return "i can has cheezburger?"

在Java中,您可能会习惯于Python中找不到的一件事是严格的隐私。这与其说是值得注意的东西,不如说是不值得注意的东西(当我刚开始搜索一个相当于“private”的Python时,我感到很尴尬!)。相反,Python比Java更透明,更容易内省。这属于有时被描述为“我们在这里都是同意的成年人”的哲学。有一些约定和语言机制可以帮助防止意外使用“非公开”方法等等,但是Python中几乎没有信息隐藏的全部思想。

从Java POV来看,最重要的是,不必为所有内容都创建类是完全可以的。在许多情况下,程序方法更简单、更短

下一个最重要的事情是,你必须克服一个概念,即对象的类型控制着它可能做什么;相反,代码控制运行时必须支持的对象(这是通过duck类型实现的)


哦,尽量使用本机列表和dict(而不是自定义的子体)。

Python中处理异常的方式不同于 如何在Java中处理它们。在Java中,建议 仅在例外情况下使用例外,这不是 Python也是如此

在Python中,像迭代器这样的东西利用异常机制来表示没有更多的项了,但这种设计在Java中并不被认为是好的实践

正如Alex Martelli在书中所说 其他语言的异常机制(适用于Java) 是LBYL(三思而后行): 是在尝试操作之前,提前检查可能使操作无效的所有情况

与Python一样,这种方法是EAFP(请求原谅比请求许可更容易)

这是“不要将类用于一切”的一种佐证:回调

执行回调的Java方法依赖于传递实现回调接口的对象(例如
ActionListener
及其
actionPerformed()
方法)。Python中不需要这种类型的函数,您可以直接传递方法,甚至是本地定义的函数:

def handler():
   print("click!")
button.onclick(handler)
甚至兰巴斯:

button.onclick(lambda: print("click!\n")) 

参考文章中有一些很好的建议,很容易被错误引用和误解。还有一些不好的建议

把Java抛在脑后。重新开始。“不要相信你的[基于Java的]直觉”。说事情是