因为JAVA是上世纪90年代以来伴随着互联网发展最成功的WEB应用语言,所以JAVA在中国互联网市场上仍是需求量巨大的。
然而,随着ML、DL科研的需求,python兴起,一系列python相关的DL、ML包都出来了。
因此,在开展新技术研究和应用落地过程中,常存在python科研探索,JAVA落地应用,或者两者混合的情况,如何平衡两者之间语法的区别,减少混淆,是本文的出发点。
本文将从整体区别和系列区别两个方面对比Python和JAVA的差异性和一致性。
两种语言的相同之处不在骜诉,但是不同之处还是很有混淆性的。
类型 | Java | Python |
---|---|---|
变量类型 | 静态类型。java所有变量的类型必须被明确定义,且只能赋予相同类型的值,否则会类型异常。java集合对象(如:Vector和ArrayList)里面可以保存了通用类型对象,但是无法保存基本类型,如int等。要保存int到Vector,你必须先要转换int到Integer(注:这里指的1.5版以前的java)。同样的,当你要从集合中取出一个对象时,已经不记得对象的类型,必须显示转换为期望的类型。 | 动态类型。Python里面变量的类型根据赋值的变化,可以是任意类型。如果变量已经被赋予某个类型对象,之后还可以被赋予另外一个不同类型的对象。Python的集合对象(如:lists和dictionaries)里面可以保存任意类型的对象,包括数字和lists。当你从集合中取出一个对象是,他仍然记得这个对象的类型,所以无需进行类型转换。 |
代码结构 | 冗长,必须使用{}管理语句体,使用;结束语句,所有变量使用前需要预先定义且注意作用域。 | 简洁,无需多余的{}和;语句就能完成目标,强制要求缩进正确。紧凑,在新的黑客字典里,Eric S. Raymond给予了“紧凑”这样的定义:Compact adj. 在设计中,描述有价值的特性并能够被人们立马理解。 |
下表中数据类型划分为基本数据类型和引用数据类型,该划分方式遵循的是JAVA的语法划分方式,Python并不特意区分,都称之为标准数据类型,Python3 中有六个标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)、Dictionary(字典)。但是,python区分可变数据类型和不可变数据类型,其中,不可变数据:Number(数字)、String(字符串)、Tuple(元组);可变数据:List(列表)、Dictionary(字典)、Set(集合)。python不可变数据类型的本质和JAVA的基本数据类型相近,因此,沿用。
数据类型 | Java | Python |
---|---|---|
基本数据类型 | Java 有八种基本数据类型,包括 boolean、char、byte、short、int、long、float 和 double | Python3 中不可变数据类型:Number(数字)(整型int、浮点型float、复数complex,python3的整型没有限制大小,可以当作Long类型使用,且布尔bool是整型的子类型)、String(字符串)(英文双引号或英文单引号括起来的内容,被定义为字符串)、Tuple(元组) |
引用数据类型 | 对象(最常见的字符串)、接口和数组等 | 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。 |
由此可见,Python中的String更为普通,不如JAVA中的细化和复杂。
数据结构 | Java | Python |
---|---|---|
字符串 | String s = “XXX” | s = “XXX” |
静态数组 | T[] dirs = new T[5] [0]*5 | |
动态数组 | ArrayList | [] |
链表 | LinkedList | N/A |
OrderedSet | TreeSet | N/A |
OrderedMap | TreeMap | N/A |
HashSet | HashSet | set() |
HashMap | HashMap | dict() |
堆 | PriorityQueue | []/heapq.* |
队列 | Queue | collections.deque() |
双端队列 | Deque | collections.deque() |
栈 | Stack | []/collections.deque() |
由此可见,Python中的其他数据结构更为简单,不如JAVA中的细化和复杂。
字符串方法 | Java | Python |
---|---|---|
字符串 | String s = “XXX” | s = “XXX” |
创建字符串 | String s = “XXX” | s = “XXX” |
将指定的子串str1替换为目标子串str2 | s.replace(str1,str2) | s.replace(str1,str2) |
切片 | s.substring(3)/s.substring(3,5) | s[3:]/s[3:5] |
查找子串位置 | s.indexOf(str,x) | s.find(str,x) |
大小写方法 | s.toUpperCase()/s.toLowerCase() | s.title()/s.lower()/s.upper() |
去除空白方法 | s.trim() | s.strip()/s.lstrip()/s.rstrip() |
判断是否以指定子串开头 | s.startsWith(str) | s.startswith(str) |
判断是否以指定子串结尾 | s.endsWith(str) | s.endswith(str) |
获取指定索引的字符 | s.charAt(x) | s[x] |
数组方法 | Java | Python |
---|---|---|
创建静态数组(字面量) | int []a = new int[]{1,2,3} | a = [1,2,3] |
创建一维动态数组 | int []a = new int[n]/Array.fill(a,x) | a = [x]*n |
创建二维动态数组 | int [][]a = new int[m][n]/for (int []row:a){Array.fill(row,x)} | a = [[x]*n for _ in range(m)] |
添加元素 | a.Add(x) | a.append(x)/a.extend(x) |
删除元素 | a.remove() | a.remove()/del a[x] |
Java条件语句
public class IfStatement {
public static void main(String args[]) {
int grades = 99;
if(grades >= 60 && grades<= 70) {
System.out.println("及格");
} else if(grades > 70 && grades<= 80){
System.out.println("一般");
} else if(grades > 80 && grades<= 90){
System.out.println("优秀");
}else if(grades > 90){
System.out.println("牛");
}else {
System.out.println("不及格");
}
}
}
Python条件语句
if __name__ == '__main__':
if age >= 18:
print('已经成年,可以上网')
else:
print('未成年,不能独立上网')
Java while 和for 循环语句
public class WhileDemo02 {
public static void main(String[] args) {
//输出1+2+3+...+100=
int i = 0;
int sum = 0;
while (i <100) {
i++;
sum = sum + i;
}
System.out.println(sum);
}
}
public class ForDemo01 {
public static void main(String[] args) {
//初始化//判断条件//迭代
for(int i=1;i<=100;i++){
System.out.println(i);
}
System.out.println("for循环结束");
// 在IDEA中 100.for可快速生成for循环
}
}
python while 和for 循环语句
if __name__=='__main__':
i = 1 #初始化一个变量
m = 0
while i <= 100:
m += i
i += 1
print(m)
for 循环是python中的另外一种循环语句,提供了python中最强大的循环结构,它可以循环遍历多种序列项目,如一个列表或者一个字符串(sequence可以试列表元组集合,如果是字典只能遍历keys,无法遍历values)
语法:
for <variable> in <sequence>:
<statements>
else:
<statements>
例如:
list01 = ['joe','susan','jack','tom']
for i in list01: #遍历list01列表,将列表中元素依次赋值给变量i
print(i) #输出i直到将所有的元素遍历完毕停止遍历
以上显示的python for循环是直接遍历元素的,当然,也可以通过index的方式访问,那就是需要通过range(0,len(arr)),获得元素列表,然后用for item in range(0,len(arr)):来执行。
JAVA类定义
[修饰符] class 类名 [extends 父类名] [implements 接口名]{
// 类体,包括类的成员变量和成员方法
[修饰符] 数据类型 变量名 [ = 值];
[修饰符] [返回值类型] 方法名([参数类型 参数名1,参数类型 参数名2,...]){
//方法体
...
return 返回值; //当方法的返回值类型为void时,return及其返回值可以省略
}
[修饰符] 构造方法名与类名一致([参数类型 参数名1,参数类型 参数名2,...]){
//方法体
...
}
}
JAVA类的实例
public class Person {
int age = 10; // 类中定义的变量被称作成员变量
string name;
void speak() {
System.out.println("我今年" + this.age + "岁了!");
}
public Person(string name,int age){
this.age=age;
this.name=name;
}
//提供了内部的静态方法,这个方法是不会被实例化的,python中也有staticmethod注解
public static void main(string[] args){
Person xiaomingPerson=new Person("xiaoming",18);
xiaomingPerson.speak()
}
}
Python类定义
class 类名(继承的父类名):
变量名 [ = 值]
def 方法名([参数类型 参数名1,参数类型 参数名2,...]):
pass
def __init__(self):
pass
JAVA类的实例
class Person:
age = 10; # 类中定义的变量被称作成员变量
name;
def speak(self):
print("我今年" + age + "岁了!")
def __init__(self,name,age):
self.age=age
self.name=name
if __name__ == '__main__':
xiaomingPerson=Person("xiaoming",18)
xiaomingPerson.speak()
python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束,python的类是可以写任意个方法的,定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有什么方法。
#抽象类加抽象方法就等于面向对象编程中的接口
from abc import ABCMeta,abstractmethod
class interface1(object):
__metaclass__ = ABCMeta #指定这是一个抽象类
@abstractmethod #抽象方法
def Lee(self):
pass
def Marlon(self):
pass
class RelalizeInterfaceLee(interface1):#必须实现interface中的所有函数,否则运行会报错
def __init__(self):
print '这是接口interface的实现'
def Lee(self):
print '实现Lee功能'
def Marlon(self):
pass
class RelalizeInterfaceMarlon(interface1): #必须实现interface中的所有函数,否则运行会报错
def __init__(self):
print '这是接口interface的实现'
def Lee(self):
pass
def Marlon(self):
print "实现Marlon功能"
1)bit(比特)
比特作为信息技术的最基本存储单位,非常小,但大名鼎鼎的比特币就是以此命名的,它的简写为小写字母“b”。
同学们都知道,计算机是以二进制存储数据的,二进制的一位,就叫做 1 比特,也就是说,比特要么为 0 要么为 1。
2)Byte(字节)
通常来说,一个英文字符是一个字节,一个中文字符是两个字节。字节与比特的换算关系是:1 字节 = 8 比特。
在往上的单位就是 KB,并不是 1000 字节,因为计算机只认识二进制,因此是 2 的 10 次方,也就是 1024 个字节。(终于知道 1024 和程序员的关系了吧?)
小黄最近手头非常宽裕,花重金购买了一辆 P90D 特斯拉,我们暂且给这车取名叫 “小P” ,这辆车和隔壁老王家的车(车名叫 “小 王”)是一模一样的,无论是型号、外表还是价格都一样,是同批次生产的。这里我们可以说 “小P” 和"小王"是两辆一模一样的、相等的(euqal),但本质上这是两个不同的对象。有一天小君给他的爱车又取了一个网名叫 “爱驹”,当我们说 “小P” 的时候其实就是在讨论 “爱驹”,因为本质上两个名字指的是同一个对象,这里我们把 “小P” 和 “爱驹” 称为完全相等的(identical)。
在 Python 中,”==” 和 “is” 的区别可类比这个例子 ,前者是相等性比较,比较的是两个对象中的值是否相等,后者是一致性比较,比较的是两个对象的内存空间地址是否相同。
显然,如果内存地址相同,那么他们的值肯定也是一样的,因此,如果 “is” 返回 True,那么 “==” 一定也返回 True,反之却不成立。
————————————————
版权声明:本文为CSDN博主「豆几宝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_30575925/article/details/113649379
https://www.codenong.com/cs105425560/
https://www.iteye.com/blog/xflykkk-1337444
https://www.lmlphp.com/user/58370/article/item/1674566/
https://blog.csdn.net/qing_gee/article/details/104388158/