java和python语法特点比较----运算符,打印,基本特性
基本对比
1、python是一个缩进检查的语言,java不是
在python中每一个空白符号,都会被python解释器所识别,用于定义代码的层次结构,类似于java当中的大括号({})
例:
1 //java代码 2 if(a=b){ 3 if(a>2){ 4 i+=2; 5 }else{ 6 i+=1; 7 } 8 }else{ 9 i--; 10 }
1 #python 2 if(a=b): 3 if(a>2): 4 i=i+2 5 else: 6 i=i+1 7 8 else: 9 i=i-1
在python中的空白字符有制表符(TAB),空格,换行符(\n),回车(\r),,虽然4个空格的长度和一个制表符是相等的,但是python解释器并不认为一个制表符等于4个空格,所以在缩进时应注
意一个TAB+4个空格的缩进,和4个空格+1个TAB的缩进是不同的,为了避免这个问题,建议将自己的IDE(代码编辑工具)中的TAB改为4个空格,在编写代码的时候统一使用空格。
2、注释
单行注释
1 //我是一个java单行注释 2 #我是一个python单行注释 3 4 /* 5 * 我是一个java多行注释 6 */ 7 8 ''' 9 我是python多行注释 10 ''' 11 12 13 /** 14 * 我是java文档注释 15 * 16 */ 17 18 python !! 卧槽,我没有文档注释
java中的注释主要使用 //、/* 和 /**。python中主要使用 #、""",''',其中""" 和 '''是相同的python并没有文档注释
3、java强类型,python弱类型
java是个强类型语言,即声明变量的时候,必须指定类型。python并不是一个强类型语言,在声明变量时是不需要指定类型的。
注意这里不需要指定类型是指变量的声明不需要指定类型,并不代码python中就没有类型,熟悉java的同学应该知道,变量是显式的指定类型,而字面量的类型是隐式指定的。
例如: String str="hello word" //hello word"这个字面量,隐式的属于String类型,而str这个变量被显式声明为String,
该代码在python中应该这样书写
str="hello word" #"hello word"属于String类型,但是,str的类型并没有显式声明,他可以根据字面量的值在运行时动态决定这个变量的类型。
以上代码可以带来很大的方便性,例如在声明一个浮点数时,在java中需要根据长度,事先定义这个数时float还是double,而在python中可以根据这个数的具体数值,在运行时决定长度。
同时以上代码的写法也带来了一些排错上的问题,在一段程序出现异常的时候,拿到的变量可能并非是你需要的那个类型的变量。java程序员在进行理解的时候可以认为所有的变量都被声明为Object类型了。
4、运算符
4.1.算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ |
加法运算,将运算符两边的操作数增加。 | a + b = 31 |
- |
减法运算,将运算符左边的操作数减去右边的操作数。 | a – b = -11 |
* |
乘法运算,将运算符两边的操作数相乘 | a * b = 210 |
/ |
除法运算,用右操作数除左操作数 | b / a = 2.1 |
% |
模运算,用右操作数除数左操作数并返回余数 | b % a = 1 |
** |
对运算符进行指数(幂)计算 | a ** b ,表示10 的21 次幂 |
// |
地板除 - 操作数的除法,其结果是删除小数点后的商数。 但如果其中一个操作数为负数,则结果将被保留,即从零(向负无穷大)舍去 | 9//2 = 4 , 9.0//2.0 = 4.0 , -11//3 = -4 , -11.0//3 = -4.0 |
4.2、比较运算符
运算符 | 描述 | 示例 |
---|---|---|
== |
如果两个操作数的值相等,则条件为真。 | (a == b) 求值结果为 false |
!= |
如果两个操作数的值不相等,则条件为真。 | (a != b) 求值结果为 true |
> |
如果左操作数的值大于右操作数的值,则条件成为真。 | (a > b) 求值结果为 false |
< |
如果左操作数的值小于右操作数的值,则条件成为真。 | (a < b) 求值结果为 true |
>= |
如果左操作数的值大于或等于右操作数的值,则条件成为真。 | (a >= b) 求值结果为 false |
<= |
如果左操作数的值小于或等于右操作数的值,则条件成为真。 | (a <= b) 求值结果为 true |
4.3、赋值运算符
运算符 | 描述 | 示例 |
---|---|---|
= |
将右侧操作数的值分配给左侧操作数 | c = a + b 表示将a + b 的值分配给c |
+= |
将右操作数相加到左操作数,并将结果分配给左操作数 | c + = a 等价于c = c + a |
-= |
从左操作数中减去右操作数,并将结果分配给左操作数 | c -= a 等价于 c = c - a |
*= |
将右操作数与左操作数相乘,并将结果分配给左操作数 | c *= a 等价于 c = c * a |
/= |
将左操作数除以右操作数,并将结果分配给左操作数 | c /= a 等价于 c = c / a |
%= |
将左操作数除以右操作数的模数,并将结果分配给左操作数 | c %= a 等价于 c = c % a |
**= |
执行指数(幂)计算,并将值分配给左操作数 | c **= a 等价于 c = c ** a |
//= |
运算符执行地板除运算,并将值分配给左操作数 | c //= a 等价于 c = c // a |
注意:python中没有++,-- ,这两种自增长运算
4.4、逻辑运算符
运算符 | 描述 | 示例 |
---|---|---|
and |
如果两个操作数都为真,则条件成立。 | (a and b) 的结果为False |
or |
如果两个操作数中的任何一个非零,则条件成为真。 | (a or b) 的结果为True |
not |
用于反转操作数的逻辑状态。 | not(a and b) 的结果为True 。 |
4.5、位运算符
运算符 | 描述 | 示例 |
---|---|---|
& |
如果它存在于两个操作数中,则操作符复制位到结果中 | (a & b) 结果表示为 0000 1100 |
![]() |
如果它存在于任一操作数,则复制位。 | (a![]() 0011 1101 |
^ |
二进制异或。如果它是一个操作数集合,但不是同时是两个操作数则将复制位。 | (a ^ b) = 49 (结果表示为 0011 0001 ) |
~ |
二进制补码,它是一元的,具有“翻转”的效果。 | (~a ) = -61 有符号的二进制数,表示为1100 0011 的补码形式。 |
<< |
二进制左移,左操作数的值由右操作数指定的位数左移。 | a << 2 = 240 (结果表示为 1111 0000 ) |
>> |
二进制右移,左操作数的值由右操作数指定的位数右移。 | a >> 2 = 15 (结果表示为0000 1111 ) |
4.6、成员运算符
运算符 | 描述 | 示例 |
---|---|---|
in |
如果在指定的序列中找到一个变量的值,则返回true ,否则返回false 。 |
- |
not in |
如果在指定序列中找不到变量的值,则返回true ,否则返回false 。 |
- |
4.7、身份运算符
运算符 | 描述 | 示例 |
---|---|---|
is |
如果运算符任一侧的变量指向相同的对象,则返回True ,否则返回False 。 |
|
is not |
如果运算符任一侧的变量指向相同的对象,则返回True ,否则返回False 。 |
- |
具体优先级这里不做对比,建议大家在使用的时候以括号为主。
补充:python中是支持字符串的乘法的。
5、system.out.print() VS print()
Java中如果你使用过log4j或者longback一定对他们打印日志时的方便所倾倒,在log4j中打印日志,可以使用占位符的方式进行字符串拼接,所幸,python中本身从字符串层面就支持这种方式。
例如:
java代码
logger.info("My name is {} , {} is a scientist","sivern","LuBenWei")
//log4j可以根据占位符的方式,填充字符串。
python代码
print "My name is %s , %s is a scientist !" %("sivern","LuBenWei")
//%s代码使用一个字符串进行占位
当然python还包含一些其他的占位符%r,%s,%d等
%r 和 %s 有什么不同?
%r 用来做 debug 比较好,因为它会显示变量的原始数据(raw data),例如一个中文 “是”使用%r进行占位输出,输出的会是他的编码。
>>> print "%r" %("是") '\xca\xc7' >>> print "%s" %("是") 是