Python编程与Java编程

Yos*_*ale 31 python java

我在过去几年里一直在编写Java,现在我已经开始用python编写了(另外).

问题在于,当我查看我的Python代码时,看起来有人试图将Java代码破解成python格式,并且它变得蹩脚,因为 - 好吧,python不是Java.

关于如何摆脱"用Python编写Java"模式的任何提示?

谢谢!

Rya*_*rle 24

您可以考虑将自己沉浸在Python范例中.最好的方法是首先了解它们是什么,然后通过阅读一些文献和审查一些代码示例来探索最佳实践.我推荐Mark Lutz 学习Python ; 非常适合初学者和高级用户.

如果您使用Python编程并且未能利用所有内置的,开发人员友好的Pythonic语法,那么您将会非常不公平.

正如我的法语老师曾经说过的那样,"法语不仅仅是英语,还有不同的词汇."

  • 顺便说一句,我在法国有一个C .. :) (9认同)
  • 比用法语获得C++更好 (8认同)
  • +1:当我第一次学习Python时,我使用分号来使它更像Java和熟悉。我们花了一些时间才摆脱了一些 Java 主义。然而,我仍然喜欢抽象超类,尽管它们在 Python 中几乎毫无用处。 (2认同)

Cor*_*erg 7

如果您是Python新手并且来自Java(或C#或其他类似的静态类型OO语言),那么来自PJ Eby和Ryan Tomayko的这些经典文章是必读的:


Mic*_*fik 6

你可以从阅读The Zen of Python开始.它可以让您深入了解Python代码应该如何编写,前提是您已经足够理解语言以了解它所说的内容.:-)


Sar*_*hAk 6

1) Python 支持面向对象编程的许多(但不是全部)方面;但\n可以在不使用任何面向对象概念的情况下编写Python 程序。

\n\n

1) Java仅支持面向对象编程。

\n\n

2) Python 被设计为解释性使用。\n可以在解释器提示符下输入 Python 语句\n

\n\n
\n

(>>>)

\n
\n\n

,并将立即执行。(实现中使用了一些自动编译为字节码(.pyc 文件)的功能。

\n\n

2) 用 Ja​​va 编写的程序必须显式编译为字节码(.class 文件),尽管 IDE 可以以对用户透明的方式自动执行此操作。Java 不支持直接执行语句 - 尽管有像 Dr. Java 这样的工具支持这一点。

\n\n

3) Python 是动态类型的:\n\xe2\x80\xa2 通过给变量赋值\n来引入变量。例子:

\n\n
\n

一些变量 = 42

\n
\n\n

\xe2\x80\xa2 已被赋予给定类型值的变量稍后可能会被赋予不同类型的值。例子:

\n\n
someVariable = 42\nsomeVariable = \'Hello, world\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

3)Java是

\n\n
\n

静态类型

\n
\n\n

:\n\xe2\x80\xa2 变量在赋值之前必须显式声明为某种类型,\n尽管声明和赋值可以\n同时完成。例子:

\n\n
int someVariable;\nint someVariable = 42;\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa2 已声明为特定类型的变量\n不得分配\n不同类型的值。

\n\n

4) Python 支持以下内置数据\n类型:\n 普通整数(通常为 -2147483648 到\n2147483647 范围内的 32 位整数)。\n\xe2\x80\xa2 长整数(大小仅受内存限制) \n运行的计算机的大小)\n\xe2\x80\xa2 布尔值(False 和 True)。\n\xe2\x80\xa2 实数。\n\xe2\x80\xa2 复数。\n此外,Python支持多种表示值集合的类型 - 包括字符串、列表和字典。

\n\n

4)Java有两种数据类型:原始类型和引用类型。Java 支持\n以下基本数据类型:\n\xe2\x80\xa2 byte - 8 位整数\n\xe2\x80\xa2 Short - 16 位整数\n\xe2\x80\xa2 int - 32 位整数\n\xe2\x80\xa2 long - 64 位整数(Java 还支持\n类 java.math.BigInteger 来表示\n其大小仅受\n内存限制的整数)\n\xe2\x80\xa2 float - 32 位实数。\n\xe2\x80\xa2 双精度 - 32 位实数。\n\xe2\x80\xa2 布尔值 - (假和真)。\n\xe2\x80\xa2 字符 - 单值\n此外,Java 支持任何类型的数组\n引用类型,并且 API 包括\n类 String 和大量\n用于值集合的类。

\n\n

5)

\n\n
\n

Python 是面向行的:

\n
\n\n

除非用 显式转义换行符,否则语句在行的末尾结束。无法在一行上放置多个\n一条语句。\n示例:\n这是一条语句\n这是另一条语句\n这是一条长语句,\\\n 延伸超过一行

\n\n

5)

\n\n
Statements in Java always end with a\nsemicolon (;)\n
Run Code Online (Sandbox Code Playgroud)\n\n

。一条语句可能\n运行多行,或者在一行上\n有多个语句。\n示例:\n这是一条语句;\n这是另一条语句;\n这是一个延伸到的长语句多于一行;\n 语句;其他; 其他;

\n\n

6)

\n\n

Python 注释以 # 开头

\n\n

并延伸到\n行尾。例子:

\n\n

这是一条评论

\n\n

新的声明从这里开始

\n\n

6)Java有两种注释。以 // 开头的注释\n延伸到行尾\n(如 Python 注释)。注释\n也可以以 /* 开头并以 */ 结尾。这些\n可以延伸到多行或\n嵌入到单行中。例子:

\n\n
// This is a comment\nA new statement starts here\n/* This is also a comment */\n/* And this is also a comment, which is\n long enough to require several lines\n to say it. */\n
Run Code Online (Sandbox Code Playgroud)\n\n

语句开始 /* comment */ 然后继续

\n\n

7) Python 字符串可以用单引号或双引号(\' 或 "")括起来。字符由长度为 1 的字符串表示。示例:

\n\n
\'This is a string\'\n"This is also a string" # Equivalent\n\'c\' # A string\n"c" # An equivalent string\n
Run Code Online (Sandbox Code Playgroud)\n\n

Python 使用以下运算符来构造\n复合布尔表达式:

\n\n
and, or and not. Example:\nnot(x > 0 and y > 0) or z > 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

7) Java 字符串必须用双引号 ("") 括起来。字符是\n不同类型的对象,并用单引号 (\') 括起来。\n示例:

\n\n
"This is a String"\n\'c\' // A character, but not a String\nJava uses the following operators for\nconstructing compound boolean expressions:\n&&, ||, ! and ^ (meaning exclusive or)\nExample:\n! (x > 0 && y > 0) || z > 0 ^ w > 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

8)Python中的比较运算符

\n\n

(>、<、>=、<=、== 和 !=) 可应用于数字

\n\n

、\n字符串和其他类型的对象),并在可能的情况下以某种适当的方式(例如\n数字顺序、词汇顺序)比较值。

\n\n

8) 在 Java 中,大多数比较运算符(>、<、>= 和 <=)只能应用于基本类型。两个(== 和 !=)可以\n应用于任何对象,但当\n应用于引用类型时,它们会测试相同(不同)的对象,而不是相同(不同)的值。

\n\n

9) 没有普遍接受的 Python\n命名类、变量、\n函数等的约定。

\n\n

9) 按照惯例,Java 中的大多数名称都使用大小写混合。类名以大写\n字母开头;变量和函数名称以小写字母开头。类常量\n使用全部大写字母和下划线命名。\n示例:\nAClassName\naVariableName\naFunctionName()\nA_CLASS_CONSTANT

\n\n

10) Python 定循环语句具有 for 变量 in 表达式的形式: 示例:

\n\n
for p in pixels:\n something\n
Run Code Online (Sandbox Code Playgroud)\n\n

10) Java 有两种确定循环语句。一种具有以下形式

\n\n
for (variable in collection) Example:\nfor (p in pixels)\n something;\n
Run Code Online (Sandbox Code Playgroud)\n\n

11) Python 使用内置函数 range() 和\nfor 来循环整数范围。\n示例:

\n\n
for i in range(1, 10)\n something\n(i takes on values 1, 2, 3, 4, 5, 6, 7, 8, 9)\nfor i in range(1, 10, 2)\n something\n(i takes on values 1, 3, 5, 7, 9)\n
Run Code Online (Sandbox Code Playgroud)\n\n

11) Java 使用不同形式的 for 来循环一系列整数。例子:

\n\n
for (int i = 1; i < 10; i ++)\n something;\n(i takes on values 1, 2, 3, 4, 5, 6, 7, 8, 9)\nfor (int i = 1; i < 10; i += 2)\n something;\n(i takes on values 1, 3, 5, 7, 9)\n
Run Code Online (Sandbox Code Playgroud)\n\n

12) Python 条件语句的形式为\nif condition:,可选的 else 部分的形式为\nelse:。elif 条件: 的形式可以替代紧跟 if 的 else:\n。例子:

\n\n
if x < 0:\n something\nif x < 0:\n something\nelse:\n something different\nif x < 0:\n something\nelif x > 0:\n something different\nelse:\n yet another thing\n
Run Code Online (Sandbox Code Playgroud)\n\n

12) Java 条件语句的形式为\nif(条件),可选的 else 部分为\nelse 形式(无冒号)。没有 elif\n形式 - else if 直接使用。例子:

\n\n
if (x < 0)\n something;\nif (x < 0)\n something;\nelse\n something different;\nif (x < 0)\n something;\nelse if (x > 0)\n something different;\nelse\n yet another thing;\n
Run Code Online (Sandbox Code Playgroud)\n\n

13) Python 条件或循环语句的范围由缩进表示。(如果\n要包含多行,则必须\n小心确保每行缩进\n相同)。例子:

\n\n
if x < 0:\n do something\ndo another thing regardless of the value of x\nif x < 0:\n do something\n do something else\n do yet a third thing\ndo another thing regardless of the value of x\n
Run Code Online (Sandbox Code Playgroud)\n\n

13) Java 条件或循环语句的范围通常只是下一个语句。编译器会忽略缩进(尽管从风格上来说,为了人类读者的利益,缩进仍然是非常理想的)。如果\n要包含多行,则范围\n必须用大括号 ({ , }) 分隔。\n(即使范围是单行,\n也可以使用这些\n。)示例:

\n\n
if (x < 0)\n do something;\ndo another thing regardless of the value of x;\nif (x < 0)\ndo something; // Bad style-don\'t do this!\ndo another thing regardless of the value of x;\nif (x < 0)\n{\n do something;\n do something else;\n do yet a third thing;\n}\ndo another thing regardless of the value of x;\nif (x < 0)\n{\n do something;\n}\ndo another thing regardless of the value of x;\n
Run Code Online (Sandbox Code Playgroud)\n


MAK*_*MAK 5

Python与C/Java类语言不同的一些主要方式是:

  1. 列表理解.

  2. 支持函数式编程.

  3. 使用某些Pythonic构造而不是类似的C样构造虽然两者似乎都有效(列表推导可以被认为是其中的一部分,但还有其他的).

还有其他一些,但是这些是我第一次开始使用Python时遇到的主要问题(而且我来自像你这样多年的Java).

在使用其中任何一个之前,理解为什么你应该使用pythonic代码而不是Python中常用的C/Java方法是有帮助的,尽管两者都给你相同的输出.

对于初学者来说,Python提供了一些C/Java中没有的强大功能,这些功能使您的代码更加清晰和简单(虽然这是主观的,对于最初来自Java的人来说可能看起来不那么好).前两点属于这一类.例如,对作为第一类对象和闭包的函数的支持使得在Java中使用内部类需要各种奇怪的杂技的事情变得容易.

但一个主要原因是Python是一种解释型语言,某些构造比等效的类似C/Java的代码快得多.例如,列表推导通常比等效的for循环快得多,循环遍历列表的索引并按索引访问每个项目.这是一个非常客观的好处,而恕我直言,很多"Python太慢"的思维方式来自于使用Java风格的代码.

了解pythonic代码的最佳方法之一是阅读其他人的代码.通过查看SO问题答案中发布的Python代码,我实际上学到了很多东西.这些通常带有解释,并且通常很明显为什么它比非pythonic代码(速度,清晰度等)更好.

编辑:

当然,还有其他方法可以获取其他人的代码.您还可以下载并查看任何优秀的开源Python项目的代码.书籍也是一个很好的资源,我会推荐O'Reilly Python Cookbook.它有许多有用的代码示例和非常详细的解释.

  • 鸭子打字应该在差异列表中排在前3位,如果不是#1 (4认同)