Reputation: 14361
I've been writing Java for the last couple of years , and now I've started to write in python (in addition).
The problem is that when I look at my Python code it looks like someone tried to hammer Java code into a python format , and it comes out crappy because - well , python ain't Java.
Any tips on how to escape this pattern of "Writing Java in Python"?
Thanks!
Upvotes: 35
Views: 8674
Reputation: 155
Firstly, No programming language is either completely good or completely bad.
Now, it is not the language's job to complete the work or write the code or logic. Instead, I would say it is more the programmer.
If the programmer is not experienced they will write unnecessary steps, un-optimized code, and logic that can put a lot of bugs and can create chaos in the system while maintenance.
When you choose a language think about the language you are choosing:
And many other things...
Always remember it is not the Language that is good/bad, easy/tough. It is more about the programmer. No Language is perfect and that is the reason updates keep coming. Saying one is not good other is childish and shows inexperience.
Just for an example: I read most articles everyone compares Java and Python and etc. The problem with all these posts, no one tells you that Java is not used anymore to do application projects (I mean from scratch).In Java, programmers use Java Frameworks for application development (Application can be DesktopUI/CLI - picocli/WebUI - Vaadin/Serveless - Lambdas, etc). And every Java Framework is optimized, and Standardized to do specific jobs and to solve specific problems. There are hundreds of Java Frameworks in the market.
Another important thing: Almost every other language's performance depends on the hardware of the physical machine. While only Java runs on VM and VMs are coded there are a lot of VMs you can choose from depending on the framework and projects you have to do. These VMs are specifically optimized for a specific purpose and to use the hardware of the physical machine in an optimal way for VMs. And this cannot be done in any other language no matter what.
As for serverless programming in Java, the Java programmer uses Micronaut Framework with GraalVM which is optimized for serverless programming rather than using OpenJ9 VM or Hotspot VM. And it takes min. 0.03ms to start and execute and a max of 15 ms (depending on which JDK you choose. From my experience).
In my opinion, I choose languages according to the problem at hand. I will never use Java/Python/JS to make any static website I will suggest using WordPress.
Upvotes: 1
Reputation: 1776
1) Python supports many (but not all) aspects of object-oriented programming; but it is possible to write a Python program without making any use of OO concepts.
1) Java supports only object-oriented programming.
2) Python is designed to be used interpretively. A Python statement may be entered at the interpreter prompt
(>>>)
, and will be executed immediately. (Implementations make some use of automatic compilation into bytecodes (.pyc files).
2) Programs written in Java must be explicitly compiled into bytecodes (.class files), though an IDE may do this automatically in a way that is transparent to the user. Java does not support direct execution of statements - though there are tools like Dr. Java that support this.
3) Python is dynamically typed: • A variable is introduced by assigning a value to it. Example:
someVariable = 42
• A variable that has been assigned a value of a given type may later be assigned a value of a different type. Example:
someVariable = 42
someVariable = 'Hello, world'
3) Java is
statically typed
: • A variable must be explicitly declared to be of some type before assigning a value to it, though declaration and assignment may be done at the same time. Examples:
int someVariable;
int someVariable = 42;
• A variable that has been declared to be of a particular type may not be assigned a value of a different type.
4) Python supports the following built-in data types: Plain integers (normally 32-bit integers in the range -2147483648 through 2147483647). • Long integers (size limited only by memory size of the machine running on) • Booleans (False and True). • Real numbers. • Complex numbers. In addition, Python supports a number of types that represent a collection of values - including strings, lists, and dictionaries.
4) Java has two kinds of data types: primitive types and reference types. Java supports the following primitive data types: • byte - 8-bit integers • short - 16-bit integers • int - 32-bit integers • long - 64-bit integers (Java also supports a class java.math.BigInteger to represent integers whose size is limited only by memory) • float - 32-bit real numbers. • double - 32-bit real numbers. • boolean - (false and true). • char - a single character. In addition, Java supports arrays of any type as the reference types, and the API includes the class String and a large number of classes used for collections of values.
5)
Python is line-oriented:
statements end at the end of a line unless the line break is explicitly escaped with . There is no way to put more than one statement on a single line. Examples: this is a statement this is another statement this is a long statement that extends over more \ than one line
5)
Statements in Java always end with a
semicolon (;)
. It is possible for a statement to run over more than one line, or to have multiple statements on a single line. Examples: this is a statement; this is another statement; this is a long statement that extends over more than one line; a statement; another; another;
6)
Python comments begin with #
and extend to the end of the line. Example:
A new statement starts here
6) Java has two kinds of comments. A comment beginning with // extend to the end of the line (like Python comments). Comments can also begin with /* and end with */. These can extend over multiple lines or be embedded within a single line. Examples:
// 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. */
Statement starts /* comment */ then continues
7) Python strings can be enclosed in either single or double quotes (' or ""). A character is represented by a string of length 1. Examples:
'This is a string'
"This is also a string" # Equivalent
'c' # A string
"c" # An equivalent string
Python uses the following operators for constructing compound boolean expressions:
and, or and not. Example:
not(x > 0 and y > 0) or z > 0
7) Java strings must be enclosed in double quotes (""). A character is a different type of object and is enclosed in single quotes ('). Examples:
"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) In Python, the comparison operators
(>, <, >=, <=, == and !=) can be applied to numbers
, strings, and other types of objects), and compare values in some appropriate way (e.g. numeric order, lexical order) where possible.
8) In Java, most of the comparison operators ( >, <, >=, and <=) can be applied only to primitive types. Two (== and !=) can be applied to any object, but when applied to reference types they test for same (different) object rather than same (different) value.
9) There is no universally-accepted Python convention for naming classes, variables, functions etc.
9) By convention, most names in Java use mixed case. Class names begin with an uppercase letter; variable and function names begin with a lowercase letter. Class constants are named using all uppercase letters with underscores. Examples: AClassName aVariableName aFunctionName() A_CLASS_CONSTANT
10) Python definite looping statements have the form for variable in expression: Example:
for p in pixels:
something
10) Java has two kinds of definite looping statements. One has the form
for (variable in collection) Example:
for (p in pixels)
something;
11) Python uses the built-in function range() with for to loop over a range of integers. Examples:
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 uses a different form of the for to loop over a range of integers. Examples:
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 conditional statements have the form if condition: and an optional else part has the form else:. The form elif condition: is allowed as an alternative to an else: immediately followed by an if. Examples:
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 conditional statements have the form if (condition) and an optional else part has the form else (no colon) There is no elif form - else if is used directly. Examples:
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) The scope of a Python conditional or looping statement is denoted by indentation. (If multiple lines are to be included, care must be used to be sure every line is indented identically). Examples:
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) The scope of a Java conditional or looping statement is normally just the next statement. Indentation is ignored by the compiler (though stylistically it is still highly desirable for the benefit of a human reader). If multiple lines are to be included, the scope must be delimited by curly braces ({ , }). (Optionally, these can be used even if the scope is a single line.) Examples:
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;
Upvotes: 6
Reputation: 71939
If you want to see some fairly idiomatic Python that does non-trivial stuff, there's Dive Into Python, although Dive Into Python 3 is newer and might be a better source of style tips. If you're looking more for some points to review, there's Code Like a Pythonista.
Upvotes: 4
Reputation: 15811
You might consider immersing yourself in the Python paradigms. The best way is to first know what they are then explore the best practices by reading some literature and reviewing some code samples. I recommend Learning Python by Mark Lutz; great for beginners and advanced users.
You'll do yourself a great injustice if you program with Python and fail to leverage all of the built-in, developer-friendly, Pythonic syntax.
As my French teacher used to say, "French isn't just English with different words."
Upvotes: 25
Reputation: 2521
This is useful if you want to understand how to code to python in a more pythonic or correct way: http://www.python.org/dev/peps/pep-0008/
Upvotes: -3
Reputation: 12704
Try to find algorithms that you understand well and see how they are implemented in python standard libraries.
Persist. :)
Upvotes: 1
Reputation: 4960
Eat Python, Sleep Python and Drink Python. That is the only way........
Upvotes: 0
Reputation: 83033
Someone provided me with this list of how "Python is not Java" when I started Python after Java, and it was very helpful.
Also, check out this similar SO question that I posted a short time ago when in a similar position.
Upvotes: 2
Reputation: 26586
Some of the major ways in which Python differs from C/Java-like languages are:
List comprehensions.
Support for functional programming.
The use of certain Pythonic constructs instead of similar C-like constructs although both seem to work (list comprehensions can be argued to be a part of this, but there are others).
There are others, but these are the main ones that bugged me when I first started Python (and I had come from years of Java like you).
Before using any of these, it is helpful to understand why you should go for pythonic code rather than the usual C/Java way in Python, although both give you the same output.
For starters, Python provides some powerful features not available in C/Java that makes your code much clearer and simpler (although this is subjective, and might not look any better to someone coming from Java at first). The first two points fall into this category. For example, support for functions as first class objects and closures makes it easy to do things that would need all kinds of weird acrobatics with inner classes in Java.
But a major reason is that Python is an interpreted language, and certain constructs are much faster than the equivalent C/Java-like code. For example, list comprehensions are usually a lot faster than an equivalent for-loop that iterates over the indices of a list and accesses each item by index. This is a very objective benefit, and IMHO a lot of the "Python in way too slow" way of thinking comes from using Java-style code shoe-horned into Python.
One of the best ways to learn about pythonic code is to read other people's code. I actually learnt a lot by looking at Python code posted in answers to SO questions. These often come with explanations and it is usually obvious why it is better than non-pythonic code (speed, clarity, etc.).
Edit:
Of course, there are other ways of getting other people's code. You can also download and look through the code of any good open source Python project. Books are also a good resource, I would recommend O'Reilly Python Cookbook. It has lots of useful code examples and very detailed explanations.
Upvotes: 5
Reputation: 60604
If you are new to Python and coming from Java (or C#, or other similar statically typed OO language), these classic articles from PJ Eby and Ryan Tomayko are necessary reading:
Upvotes: 7
Reputation: 10050
Definitely not a panacea but I think you should try some code golf in Python. Obviously nobody should write "golfed" code IRL, but finding the most terse way to express something really forces you to exploit the built in functionality of the language.
Upvotes: 3
Reputation: 35178
You could start by reading The Zen of Python. It'll give you some insight into how Python code is supposed to be written, provided you understand the language enough to understand what it's talking about. :-)
Upvotes: 6
Reputation: 837996
You could post your code at Refactor my code to see if someone can show you a more Pythonic way to do it.
Upvotes: 3
Reputation: 74382
Learn a few other languages. It will help you make the difference between algorithms (the structure of processing, unchanged between languages) and the local syntaxic features of the language. Then you can "write Foo in Bar" for any combination of languages "Foo" and "Bar".
Upvotes: 0