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

fro*_*die 62 python java

我的大部分编程背景都是用Java编写的,而且我仍然使用Java编写大部分编程.但是,我开始在工作中学习一些辅助项目的Python,我想学习它尽可能独立于我的Java背景 - 即我不想只用Python编写Java.我应该注意哪些事情?

一个简单的例子 - 当浏览Python教程时,我发现了一个函数(例如列表)的默认可变参数被持久化(从调用到调用时记住).这对我作为Java程序员来说是违反直觉的,很难让我理解.(如果您不理解该示例,请参见此处此处.)

有人还向我提供了这个列表,我觉得这个列表很有用,但很简短.任何人都有任何其他Java程序员可能会滥用Python的例子......?或者Java程序员会错误地假设或难以理解的东西?

编辑:好的,简要概述了我链接的文章所解决的原因,以防止答案中的重复(如比尔蜥蜴所建议的).(如果我在措辞方面犯了错误,请告诉我,我开始使用Python,所以我可能完全不了解所有概念.而且免责声明 - 这些将非常简短,所以如果你不明白它在检查链接时会得到什么.)

  • Java中的静态方法不能转换为Python类方法
  • Java中的switch语句转换为Python中的哈希表
  • 不要使用XML
  • 吸气剂和制定者是邪恶的(嘿,我只是引用:))
  • 代码重复通常是Java中必不可少的恶魔(例如方法重载),但在Python中则不然

(如果你觉得这个问题很有意思,那么请查看链接.:)非常好.)

Rya*_*rom 25

  • 不要把所有东西都放到课堂上.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?"
Run Code Online (Sandbox Code Playgroud)

  • Python使用"鸭子打字"的概念(或者在这种情况下是狗/猫打字:).如果将对象传递给期望它具有某个接口的方法,那么只要它具有该接口就可以了.由于极其紧密的耦合,继承有很多问题,所以只有在你真正需要时才使用它. (10认同)
  • 我知道我可能会遗漏一些简单的东西......但是你能解释一下你最后一点后面的"为什么"吗? (5认同)
  • @froadie:多态性隐含在动态语言中.继承恰好是告诉静态编译器类型相关的最简单方法.动态语言和廉价例外(大多数情况下)是不必要的. (5认同)
  • @froadie:并不是说Animal类是坏的,只是除非你想提供make_sound()的默认实现,否则完全没有必要. (4认同)
  • @froadie:你在Python中学到的东西都没有被"反弹回"到Java.他们是不同的语言.这不仅仅是不同的语法; 基本概念是不同的.Java的静态声明特性使它与Python完全不同. (3认同)

S.L*_*ott 23

引用的文章有一些很好的建议,很容易被误引和误解.还有一些不好的建议.

留下Java.重新开始."不要相信你的[基于Java]的直觉".说事情"反直觉"是任何编程学科的坏习惯.学习一门新语言时,重新开始,放弃自己的习惯.你的直觉一定是错的.

语言不同.否则,它们将是具有不同语法的相同语言,并且会有简单的翻译器.因为没有简单的翻译器,所以没有简单的映射.这意味着直觉无益且危险.

  • "Java中的静态方法不能转换为Python类方法." 这种事情真的有限且无益.Python有一个staticmethod装饰器.它还有一个classmethod装饰器,Java没有相应的东西.

    这一点,BTW,还包括更有帮助的建议,不要在课堂上不必要地包装所有内容."Java静态方法的惯用翻译通常是模块级函数".

  • Java switch中的Java 语句可以通过多种方式实现.首先,它最重要的是它通常是一个if elif elif elif结构.这篇文章在这方面没有任何帮助.如果您完全确定这太慢(并且可以证明它),您可以使用Python字典作为从值到代码块的稍快的映射.盲目地将开关转换为字典(不加思考)是非常糟糕的建议.

  • 不要使用XML.脱离背景时没有意义.在上下文中,它意味着不依赖于XML来增加灵活性.Java依赖于描述XML中的东西; 例如,WSDL文件重复从检查代码中可以明显看出的信息.Python依赖于内省而不是重写XML中的所有内容.

    但Python拥有出色的XML处理库.一些.

  • Python中不需要 Getters和setter ,因为它们在Java中是必需的.首先,您在Python中有更好的内省,因此您不需要getter和setter来帮助创建动态bean对象.(为此,您使用collections.namedtuple).

    但是,您有属性装饰器,它将getter(和setter)绑定到类似属性的构造中.关键是Python更喜欢裸露的属性; 必要时,我们可以将getter和setter捆绑出来,好像有一个简单的属性.

    此外,如果属性不够复杂,Python也有描述符类.

  • 代码重复通常是Java中必不可少的恶魔(例如方法重载),但在Python中则不然.正确.Python使用可选参数而不是方法重载.

    关于关闭的要点继续谈论; 这不如明智地使用默认参数值的简单建议有帮助.


Joh*_*n Y 14

Java中您可能习惯使用的一件事就是严格保密.这不是一件需要注意的事情,因为它是值得寻找的东西(当我开始时我搜索了一个等同于'私有'的Python多久我感到很尴尬!).相反,Python比Java更透明,更容易内省.这属于有时被描述为"我们都同意成年人在这里"的哲学.有一些约定和语言机制可以帮助防止意外使用"非公共"方法等等,但Python中几乎没有信息隐藏的整体思维模式.

  • 基本上,在我看来,在比较Java和Python时反复出现的主题是Python更信任你 - 它为你提供了更多的力量,同时也提供了更大的能力. (6认同)
  • Python的口号是"我们都是成年人".Python作为源分发.什么"私人"意味着你可以阅读来源?如有必要,您只需编辑源代码即可进行更改. (3认同)
  • ...我也认为"我们这里都是成年人"这句话是一把双刃剑.是的,它可以更容易地挖掘和查找/修改现有代码,但缺点是它会产生噪音.如果我下载一个包并且我想使用它,我会看到许多(无效)选项,除非包作者遵循可选的_convention_.在其他语言中,封装了与我无关的部分.我只是看到了班级的公共表面.不是说python在做一些不同的事情上很糟糕,只是因为它是一个带有缺点的选择. (2认同)

dsi*_*cha 10

我能想到的最大问题是不了解或不充分利用鸭子打字.在Java中,您需要预先指定非常明确和详细的类型信息.在Python中,输入既是动态的,也是隐含的.理念是你应该在比名义类型更高的层次上考虑你的程序.例如,在Python中,您不使用继承来模拟可替代性.由于鸭子打字,默认情况下可替代性.继承只是程序员重用实现的便利.

同样,Pythonic成语是"请求宽恕,不要求许可".明确的打字被认为是邪恶的.不要事先检查参数是否是某种类型.只是尝试做任何你需要做的参数.如果它不符合正确的接口,它将抛出一个非常明确的异常,您将能够非常快速地找到问题.如果有人传递了一个名义上意外但与你预期界面相同的类型的参数,那么你就可以免费获得灵活性.


Cal*_*ngh 7

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

接下来最重要的是你将不得不克服一个对象的类型控制它可能做什么的概念; 相反,代码控制哪些对象必须能够在运行时支持(这是由于鸭子类型).

哦,尽可能使用本机列表和dicts(不是自定义后代).


sat*_*esh 6

在Python中处理异常的方式与在Java中处理它们的方式不同.虽然在Java中,建议仅在异常条件下使用异常,而Python则不然.

在Python中,像Iterator这样的东西使用异常机制来表示没有更多的项目.但是这样的设计在Java中并不被认为是一种好的做法.

正如亚历克斯·马尔泰利(Alex Martelli)在他的书中介绍Python in a Nutshell一样 ,其他语言的异常机制(适用于Java)是LBYL(Look Before You Leap):在尝试操作之前提前检查所有可能导致操作无效.

与Python一样,方法是EAFP(要求宽恕比允许更容易)