天天看點

Python學習3--運算符

運算符:有特殊計算規則的符号

參與運算的資料:操作數

N元運算符:取決于使用的操作數的數量。

運算符和操作數結合起來----表達式

一、 算數運算符

+(加) -(減) *(乘) /(除) % (取餘) //(整除) **(幂)

1、整除(//)

商是向下取整(即往數小的方向取)

注意-10//3和int(-3.3)的差別:int是向0取整,相當于舍掉小數點

print(10//3)
print(-10//3)
print(int(-3.3))
           

輸出結果是:

3

-4

-3

2、取模(%)

注意:商向下取整(即往數小的方向取)

計算原理:餘數 = 被除數-商*除數

print(10%3)
print(10%-3)
print(-10%3)
print(-10%-3)
           

結果分别為:1、-2、2、-1

計算過程如下:

Python學習3--運算符

總結可知:取模運算的符号和除數的符号一緻 且結果是整型

3、取餘

格式為math.fmod 取餘運算:商向0取整 且結果是浮點數

import math
print(math.fmod(10,3))
print(math.fmod(10,-3))
print(math.fmod(-10,3))
print(math.fmod(-10,-3))
           

結果是:1.0 1.0 -1.0 -1.0

Python學習3--運算符

總結可知:取餘的結果符号和被除數的符号一緻

4、求幂 mn=m的n次幂

二、比較運算符(關系運算符)

傳回布爾類型:布爾類型(True False)

== 内容相等 != 内容不等 >大于 <小于 >= <=

對于所有的資料類型來說,内容相等 == 傳回True,對象不一定相等

數值、字元串、位元組:== 和is幾乎一樣。

支援鍊式比較,如以下格式:

print(1<x<5)
print(1<x>5)
           

鍊式比較也支援短路,按從左到右的順序,先比較第一個表達式,

如果第一個表達式傳回False,則後面的比較不再進行 相當于and操作符

3. 身份運算符

is is not

is代表對象是否是一個(記憶體位址是否是一個)

Is如果是True。==一定是 True

==是True , is不一定是True

a = 1
b = 1
print(a == b,a is b)
           

輸出結果為True,True

id(o)–傳回對象的記憶體位址

輸出:1927965760 1927965760

做如下測試:

a = 1
b = 1
c = a
print(a == b, a == c,b == c)
print(a is b,a is c,b is c)

li1 = []
li2 = []
li3 = li2
print(li1 == li2,li1 == li3,li2 == li3)
print(li1 is li2,li1 is li3,li2 is li3)
           

結果為:

True True True

True True True

True True True

False False True

總結為:對于數值、字元串、位元組這種不可變類型(基于記憶體的類型)來說,相同的内容是同一個對象

四、 邏輯運算符

1、傳回值:布爾類型,也可能是計算值

and(與 ),x and y: 如果x和y同時為True,則傳回值為True

or(或) ,x or y: 如果x和y中有任意一個為True, 則傳回值為True

not(非): 原來True not x ,結果變為False

2、短路現象

and: 第一個表達式為False的時候,第二個表達式不再執行

or ; 第一個表達式為True,第二個表達式不再執行

False and print("and 測試t")
False or print("or 測試t")
           

輸出:

or 測試t

3、傳回計算值

1、and或者or運算符左右兩側都是True、False(都是布爾表達式);

2、and 和or左右兩側是其他類型

如下:

print(0 and "abc")
print(3 and "abc")
print(3 or "abc")
print(0 or "abc")
           

輸出:

abc

3

abc

對于and而言,如果第一個表達式為False,則會列印第一個表達式,因為第一個表達式已經決定了整個表達式的值,否則列印第二個表達式

對于or而言,如果第一個表達式為Ture,則會列印第二個表達式,因為整個表達式的值取取決于第二個表達式,否則列印第一個表達式

輸出:

False-aaaa

None

由于or的左側為False無法決定整個表達式的值,是以會執行print語句,同時print語句的傳回值是None,是以列印None

五、位運算符

1、概述

正數:原碼反碼補碼都是相同 ,都是二進制原碼

對于負數:

原碼:正數的二進制碼,最高位取1

反碼:除符号位以外,其餘取反

補碼:反碼+1

把補碼變回原碼:取反碼+1

計算機中存儲以及運算過程的全部都是補碼

運算也全部都是使用補碼進行運算,是以要注意,運算的結果,最高位如果是1,一定要計算原碼。

位運算符:

&(位與)  : 都是1的時候,結果為1

| (位或) :都是0的時候,結果為0

^ (異或) :都一樣的時候為0,不一樣為1

~(取反) : 包括符号位一起取反

2、為何需要補碼

Python學習3--運算符

如上表所示:以1+(-1)為例:

Python學習3--運算符

3、位運算

1)& 按位與 如果都是1,傳回1,否則傳回0

a=0b10011
b=0b01101
print(bin(a&b))
           

輸出:

0b1

運算過程:

Python學習3--運算符

可以用位與0b1111來顯示補碼,如:

print(bin(2&0b1111))
print(bin(-2&0b1111))
           

輸出:

0b10

0b1110

任意一個數跟-1與運算得到的是自身,如:

print(-20&-1)
print(20&-1)
           

輸出:

-20

20

可自行手寫運算,需注意的是,負數要用補碼進行運算,如果得到結果是負數,還需通過反碼加1的運算得到原碼才是結果。

2)|按位或 如果都是0,傳回0,否則傳回1

a=0b10011
b=0b01101
print(bin(a|b))
           

輸出:

0b11111

3)^異或:相同為0 不同為1

輸出:

-0b1

4)~ 按位取反,包括符号位

輸出:

0b0

5)<< 左位移 右側以0填充,左側在64位機上不會溢出

左位移一位,相當于*2

a =15
print(a<<1)
b = -15
print(b<<1)
           

輸出:

30

-30

6)>> 右位移 最高位正數填充0,負數填充1

如果能夠整除,則相當于 /2,如果不能整除,相當于/2後向下取整

a=15
print(15>>1)
b=-15
print(-15>>1)
           

輸出:

7

-8

六、指派運算符

= ; +=; -=; *=; /=; %=; **=

七、 成員運算符

in、not in: 判斷元素是否在序列中

傳回值,布爾類型

s = "abc"
print("a" in s)
print("ab" in s)
print("abc" in s)
           

輸出:

True

True

True

八、運算符的優先級

算數運算符> 比較運算符 >邏輯運算符 >其他運算符 > 指派運算符

可以用()調整優先級,python中沒有[] 也沒有{}

計算機中的運算符,做運算的時候 ,展現的是結合性,不是運算性

y=1==3 or 2==2
print(y)
           

輸出:

True