Python编程与Java编程

问题描述 投票:31回答:13

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

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

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

谢谢!

java python
13个回答
24
投票

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

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

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


1
投票

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

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

2)Python旨在解释性地使用。可以在解释器提示符处输入Python语句

(>>>)

,并将立即执行。 (实现使用自动编译成字节码(.pyc文件)。

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

3)Python是动态类型的:•通过为其赋值来引入变量。例:

someVariable = 42

•已分配给定类型值的变量稍后可能会被分配不同类型的值。例:

someVariable = 42
someVariable = 'Hello, world'

3)Java是

静态打字

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

int someVariable;
int someVariable = 42;

•已声明为特定类型的变量可能未分配不同类型的值。

4)Python支持以下内置数据类型:普通整数(通常为-2147483648到2147483647范围内的32位整数)。 •长整数(大小仅受运行机器的内存大小限制)•布尔值(假和真)。 •实数。 •复数。此外,Python支持许多表示值集合的类型 - 包括字符串,列表和字典。

4)Java有两种数据类型:基本类型和引用类型。 Java支持以下原始数据类型:•byte - 8位整数•short - 16位整数•int - 32位整数•long - 64位整数(Java还支持类java.math.BigInteger来表示整数其大小仅受内存限制)•float - 32位实数。 •双 - 32位实数。 •boolean - (false和true)。 •char - 单个字符。此外,Java支持任何类型的数组作为引用类型,API包括类String和用于值集合的大量类。

5)

Python是面向行的:

除非明确地使用换行符,否则语句将在行尾结束。没有办法在一行上放置多个语句。示例:这是一个语句,这是另一个语句,这是一个长语句,延伸超过一行

5)

Statements in Java always end with a
semicolon (;)

。语句可以在多行上运行,或者在一行上有多个语句。示例:这是一个声明;这是另一个声明;这是一个冗长的陈述,延伸超过一行;一份声明;另一个;另一个;

6)

Python评论以#开头

并延伸到该行的末尾。例:

This is a comment

一个新的声明从这里开始

6)Java有两种注释。以//开头的注释扩展到行的末尾(如Python注释)。注释也可以以/ *开头,以* /结尾。这些可以扩展到多条线路或嵌入一条线路中。例子:

// This is a comment
A new statement starts here
/* This is also a comment */
/* And this is also a comment, which is
 long enough to require several lines
 to say it. */

声明开始/ *评论* /然后继续

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

'This is a string'
"This is also a string" # Equivalent
'c' # A string
"c" # An equivalent string

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

and, or and not. Example:
not(x > 0 and y > 0) or z > 0

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

"This is a String"
'c' // A character, but not a String
Java uses the following operators for
constructing compound boolean expressions:
&&, ||, ! and ^ (meaning exclusive or)
Example:
! (x > 0 && y > 0) || z > 0 ^ w > 0

8)在Python中,比较运算符

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

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

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

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

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

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

for p in pixels:
 something

10)Java有两种明确的循环语句。一个有形式

for (variable in collection) Example:
for (p in pixels)
 something;

11)Python使用内置函数range()和for循环一系列整数。例子:

for i in range(1, 10)
 something
(i takes on values 1, 2, 3, 4, 5, 6, 7, 8, 9)
for i in range(1, 10, 2)
 something
(i takes on values 1, 3, 5, 7, 9)

11)Java使用不同形式的for来循环遍历整数范围。例子:

for (int i = 1; i < 10; i ++)
 something;
(i takes on values 1, 2, 3, 4, 5, 6, 7, 8, 9)
for (int i = 1; i < 10; i += 2)
 something;
(i takes on values 1, 3, 5, 7, 9)

12)Python条件语句具有if条件的形式:并且可选的else部分具有以下形式:形式elif条件:允许作为else的替代:紧接着是if。例子:

if x < 0:
 something
if x < 0:
 something
else:
 something different
if x < 0:
 something
elif x > 0:
 something different
else:
 yet another thing

12)Java条件语句的形式为if(condition),另一个else部分的形式为else(无冒号)没有elif形式 - 否则直接使用。例子:

if (x < 0)
 something;
if (x < 0)
 something;
else
 something different;
if (x < 0)
 something;
else if (x > 0)
 something different;
else
 yet another thing;

13)Python条件或循环语句的范围由缩进表示。 (如果要包含多行,必须注意确保每一行都是相同的缩进)。例子:

if x < 0:
 do something
do another thing regardless of the value of x
if x < 0:
 do something
 do something else
 do yet a third thing
do another thing regardless of the value of x

13)Java条件语句或循环语句的范围通常只是下一个语句。编译器忽略缩进(虽然在风格上它仍然非常适合人类读者的利益)。如果要包含多行,则范围必须用花括号({,})分隔。 (可选,即使范围是单行,也可以使用这些。)示例:

if (x < 0)
 do something;
do another thing regardless of the value of x;
if (x < 0)
do something; // Bad style-don't do this!
do another thing regardless of the value of x;
if (x < 0)
{
 do something;
 do something else;
 do yet a third thing;
}
do another thing regardless of the value of x;
if (x < 0)
{
 do something;
}
do another thing regardless of the value of x;

0
投票

学习一些其他语言。它将帮助您区分算法(处理结构,语言之间不变)和语言的本地语法特征。然后,您可以为“Foo”和“Bar”语言的任何组合“写入Foo in Bar”。


0
投票

吃Python,睡眠Python和喝Python。那是唯一的方法........


-2
投票

如果您想要了解如何以更加pythonic或更正确的方式编写python代码,这非常有用:http://www.python.org/dev/peps/pep-0008/


7
投票

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


6
投票

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


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。它有许多有用的代码示例和非常详细的解释。


4
投票

如果你想看到一些相当惯用的Python做一些非平凡的东西,那就是Dive Into Python,虽然Dive Into Python 3更新,可能是更好的风格提示源。如果你正在寻找更多的点来评论,那就是Code Like a Pythonista


3
投票

您可以在Refactor my code上发布您的代码,看看是否有人可以向您展示更多Pythonic方式。


3
投票

绝对不是灵丹妙药,但我认为你应该在Python中尝试一些高尔夫代码。显然没有人应该编写“高尔夫”代码IRL,但找到最简洁的表达方式真的会迫使你利用语言的内置功能。


2
投票

当我在Java之后启动Python时,有人向我提供了"Python is not Java"的列表,这非常有用。

另外,请查看我在不久前发布的this similar SO question,当时处于类似位置。


1
投票

尝试找到您理解的算法,并了解它们是如何在python标准库中实现的。

坚持。 :)

© www.soinside.com 2019 - 2024. All rights reserved.