一、學(xué)習(xí)內(nèi)容概括
首先附上學(xué)習(xí)地址阿里云天池Python訓(xùn)練營(yíng)
學(xué)習(xí)內(nèi)容如下:
二囤官、具體學(xué)習(xí)內(nèi)容
1.注釋
為程序添加注釋可以提高程序的可讀性冬阳,Python中注釋分為單行注釋和多行注釋。同時(shí)党饮,注釋也是調(diào)試程序的一種重要方式肝陪,某些時(shí)候,我們不希望編譯刑顺、執(zhí)行程序中的某些代碼氯窍,這時(shí)就可以將這些代碼注釋掉。
-
單行注釋
單行注釋用一個(gè)井號(hào)#表示
# 這是一個(gè)注釋
print("Hello world")
# Hello world
-
多行注釋
多行注釋用三個(gè)單引號(hào)''' '''或者三個(gè)雙引號(hào)""" """表示
'''
這是多行注釋蹲堂,用三個(gè)單引號(hào)
這是多行注釋狼讨,用三個(gè)單引號(hào)
這是多行注釋,用三個(gè)單引號(hào)
'''
print("Hello china")
# Hello china
"""
這是多行注釋柒竞,用三個(gè)雙引號(hào)
這是多行注釋政供,用三個(gè)雙引號(hào)
這是多行注釋,用三個(gè)雙引號(hào)
"""
print("hello china")
# hello china
2.運(yùn)算符
- 算數(shù)運(yùn)算符
名稱 | 操作符 | 示例 |
---|---|---|
加 | + | 1+1 |
減 | - | 2-1 |
乘 | * | 3*4 |
除 | / | 3/4 |
整除 | // | 3//4 |
取余 | % | 3%4 |
冪 | ** | 2**3 |
print(1 + 1) # 2
print(2 - 1) # 1
print(3 * 4) # 12
print(3 / 4) # 0.75
print(3 // 4) # 0
print(3 % 4) # 3
print(2 ** 3) # 8
- 比較運(yùn)算符
名稱 | 操作符 | 示例 |
---|---|---|
大于 | > | 2>1 |
大于等于 | >= | 2>=4 |
小于 | < | 1<2 |
小于等于 | <= | 5<=2 |
等于 | == | 3==4 |
不等于 | !== | 3!=5 |
print(2 > 1) # True
print(2 >= 4) # False
print(1 < 2) # True
print(5 <= 2) # False
print(3 == 4) # False
print(3 != 5) # True
-
邏輯運(yùn)算符
與and
能犯、或or
鲫骗、非not
print((3 > 2) and (3 < 5)) # True
print((1 > 3) or (9 < 2)) # False
print(not (2 > 1)) # False
-
位運(yùn)算符
位運(yùn)算符可以直接操作數(shù)值的原始bit位,通常在圖形踩晶、圖像處理和創(chuàng)建設(shè)備驅(qū)動(dòng)等底層開發(fā)中使用执泰。Python支持位運(yùn)算符有一下6個(gè):
名稱 | 操作符 | 示例 |
---|---|---|
按位與 | & | 4&5 |
按位或 | 豎 | 4豎5 |
按位取反 | ~ | ~4 |
按位異或 | ^ | 4^5 |
左移 | << | 4<<2 |
右移 | >> | 4>>2 |
print(bin(4)) # 0b100
print(bin(5)) # 0b101
print(bin(~4), ~4) # -0b101 -5
print(bin(4 & 5), 4 & 5) # 0b100 4
print(bin(4 | 5), 4 | 5) # 0b101 5
print(bin(4 ^ 5), 4 ^ 5) # 0b1 1
print(bin(4 << 2), 4 << 2) # 0b10000 16
print(bin(4 >> 2), 4 >> 2) # 0b1 1
- 三元運(yùn)算符
也叫三目運(yùn)算符,通過if語(yǔ)句來實(shí)現(xiàn)渡蜻。
語(yǔ)法結(jié)構(gòu):
True_statements if expression else False_statements
運(yùn)算規(guī)則:
先對(duì)邏輯表達(dá)式expression進(jìn)行求職术吝,若為True
计济,則執(zhí)行并返回True_statements的值;若為False
排苍,則執(zhí)行并返回False_statements的值沦寂。
值得注意的是:
Python允許三元運(yùn)算符的True_statements或False_statements中放置多條語(yǔ)句,主要支持兩種放置方式淘衙。第一種传藏,多條語(yǔ)句用英文逗號(hào)隔開,每條語(yǔ)句都會(huì)執(zhí)行彤守,程序返回多條語(yǔ)句的返回值組成的元組毯侦;第二種,多條語(yǔ)句用英文分號(hào)隔開具垫,每條語(yǔ)句都會(huì)執(zhí)行侈离,程序只返回第一條語(yǔ)句的返回值。
a = 5
b = 3
st = print('5比3大'), 'a大于b' if a > b else 'a不大于b'
print(st)
#5比3大
#(None, 'a大于b')
因?yàn)?code>print函數(shù)沒有返回值筝蚕,所以返回一個(gè)None
- 其他運(yùn)算符
主要介紹兩組運(yùn)算符卦碾,一組是 is
和 not is
,另一組是 in
和not in
起宽。
in
和 not in
主要比較某個(gè)對(duì)象在不在某個(gè)序列對(duì)象中洲胖,比如字符串中是否包含了某個(gè)字母,列表中是否包含了某個(gè)元素等等燎含,比較簡(jiǎn)單宾濒。我們主要看下is
和 not is
。
比較的對(duì)象是不可變類型:
a = "hello"
b = "hello"
print(a is b, a == b) # True True
print(a is not b, a != b) # False False
比較的對(duì)象是可變類型:
a = ["hello"]
b = ["hello"]
print(a is b, a == b) # False True
print(a is not b, a != b) # True False
注意:
is
,is not
對(duì)比的是兩個(gè)變量的內(nèi)存地址==
,!=
對(duì)比的是兩個(gè)變量的值比較的兩個(gè)變量屏箍,指向的都是地址不可變的類型(
str
等)绘梦,那么is,is not
和==
赴魁,卸奉!=
是完全等價(jià)的。對(duì)比的兩個(gè)變量颖御,指向的是地址可變的類型(
list
榄棵,dict
,tuple
等)潘拱,則兩者是有區(qū)別的疹鳄。運(yùn)算符的優(yōu)先級(jí)
一元運(yùn)算符優(yōu)于二元運(yùn)算符。例如
3 ** -2
等價(jià)于3 ** (-2)
芦岂。先算術(shù)運(yùn)算瘪弓,后移位運(yùn)算,最后位運(yùn)算禽最。例如
1 << 3 + 2 & 7
等價(jià)于(1 << (3 + 2)) & 7
腺怯。邏輯運(yùn)算最后結(jié)合袱饭。例如
3 < 4 and 4 < 5
等價(jià)于(3 < 4) and (4 < 5)
。
print(-3 ** 2) # -9
print(3 ** -2) # 0.1111111111111111
print(1 << 3 + 2 & 7) # 0
print(-3 * 2 + 5 / -2 - 4) # -12.5
print(3 < 4 and 4 < 5) # True
三呛占、變量與數(shù)據(jù)類型
- 變量和賦值虑乖、輸出函數(shù)print()
Python是一門弱類型語(yǔ)言,弱類型語(yǔ)言有兩個(gè)典型特征:一是變量無需聲明即可直接賦值晾虑,對(duì)一個(gè)第一次使用的變量賦值就相當(dāng)于定義了一個(gè)新變量疹味;二是變量的數(shù)據(jù)類型可以動(dòng)態(tài)改變,取決于被賦值變量所引用的那個(gè)對(duì)象走贪。
關(guān)于print()
函數(shù):
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
將對(duì)象以字符串表示的方式格式化輸出到流文件對(duì)象file里佛猛。其中所有非關(guān)鍵字參數(shù)都按
str()
方式進(jìn)行轉(zhuǎn)換為字符串輸出;關(guān)鍵字參數(shù)
sep
是實(shí)現(xiàn)分隔符坠狡,比如多個(gè)參數(shù)輸出時(shí)想要輸出中間的分隔字符;關(guān)鍵字參數(shù)
end
是輸出結(jié)束時(shí)的字符遂跟,默認(rèn)是換行符\n
逃沿;關(guān)鍵字參數(shù)
file
是定義流輸出的文件,可以是標(biāo)準(zhǔn)的系統(tǒng)輸出sys.stdout
幻锁,也可以重定義為別的文件凯亮;關(guān)鍵字參數(shù)
flush
是立即把內(nèi)容輸出到流文件,不作緩存哄尔。三種簡(jiǎn)單的數(shù)據(jù)類型
整型(int
)
a = 1031
print(a, type(a))
# 1031 <class 'int'>
浮點(diǎn)型(float
)
print(1, type(1))
# 1 <class 'int'>
print(1., type(1.))
# 1.0 <class 'float'>
a = 0.00000023
b = 2.3e-7
print(a) # 2.3e-07
print(b) # 2.3e-07
對(duì)于浮點(diǎn)型假消,有時(shí)候我們想保留浮點(diǎn)型的小數(shù)點(diǎn)后 n
位×虢樱可以用decimal
包里的 Decimal
對(duì)象和 getcontext()
方法來實(shí)現(xiàn)富拗。
import decimal
from decimal import Decimal
a = decimal.getcontext()
print(a)
# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
# capitals=1, clamp=0, flags=[],
# traps=[InvalidOperation, DivisionByZero, Overflow])
getcontext()
顯示了 Decimal
對(duì)象的默認(rèn)精度值是 28 位 (prec=28
)
下面通過用 getcontext().prec
來調(diào)整精度
b = Decimal(1) / Decimal(3)
print(b)
# 0.3333333333333333333333333333
decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print(c)
# 0.3333
布爾型(bool
)
print(True + True) # 2
print(True + False) # 1
print(True * False) # 0
- 類型轉(zhuǎn)換
- 轉(zhuǎn)換為整型
int(x, base=10)
- 轉(zhuǎn)換為字符串
str(object='')
- 轉(zhuǎn)換為浮點(diǎn)型
float(x)
四、位運(yùn)算
- 原碼鸣戴、反碼啃沪、補(bǔ)碼
為了計(jì)算的方面(解決減法問題),計(jì)算機(jī)底層使用補(bǔ)碼的形式保存所有整數(shù)窄锅。參考博客原碼创千,反碼,補(bǔ)碼的深入理解與原理入偷。整數(shù)的原碼追驴、反碼、補(bǔ)碼都一樣疏之;負(fù)數(shù)的反碼是將原碼的符號(hào)位不變殿雪,其他位全部取反,補(bǔ)碼就是反碼+1体捏。(反碼的另外一種計(jì)算方式冠摄,將原碼自低位到高位糯崎,尾數(shù)的第一個(gè)‘1’及其右邊的‘0’保持不變,左邊的各位按位取反河泳,符號(hào)位不變沃呢。)
-
按位運(yùn)算
1.按位非操作 ~~
把num
的補(bǔ)碼中的 0 和 1 全部取反(0 變?yōu)?1,1 變?yōu)?0)有符號(hào)整數(shù)的符號(hào)位在~
運(yùn)算中同樣會(huì)取反拆挥。2.按位與操作 &
只有兩個(gè)對(duì)應(yīng)位都為 1 時(shí)才為 1
- 按位或操作 |
只要兩個(gè)對(duì)應(yīng)位中有一個(gè) 1 時(shí)就為 1
4.按位異或操作 ^
只有兩個(gè)對(duì)應(yīng)位不同時(shí)才為 1薄霜,異或滿足交換律和結(jié)合律
5.按位左移操作 <<
num << i
將num
的二進(jìn)制表示向左移動(dòng)i
位所得的值。6.按位右移操作 >>
num >> i
將num
的二進(jìn)制表示向右移動(dòng)i
位所得的值纸兔。
- 位運(yùn)算實(shí)現(xiàn)快速計(jì)算
1.計(jì)算2的倍數(shù)問題
n << 1 -> 計(jì)算 n*2
n >> 1 -> 計(jì)算 n/2惰瓜,負(fù)奇數(shù)的運(yùn)算不可用
n << m -> 計(jì)算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 計(jì)算 n/(2^m)汉矿,即除以 2 的 m 次方
1 << n -> 2^n
2.通過 a & (-a)
快速獲取a
的最后為 1 位置的整數(shù)崎坊。
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
- 位運(yùn)算實(shí)現(xiàn)整數(shù)集合
一個(gè)數(shù)的二進(jìn)制表示可以看作是一個(gè)集合(0 表示不在集合中,1 表示在集合中)洲拇。
比如集合 {1, 3, 4, 8}
奈揍,可以表示成 01 00 01 10 10
而對(duì)應(yīng)的位運(yùn)算也就可以看作是對(duì)集合進(jìn)行的操作。
元素與集合的操作:
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 從集合中刪除
a & (1<<i) -> 判斷 i 是否屬于該集合(零不屬于赋续,非零屬于)
集合之間的操作:
a 補(bǔ) -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
- Python中
bin()
的輸出
print(bin(3)) # 0b11
print(bin(-3)) # -0b11
print(bin(-3 & 0xffffffff))
# 0b11111111111111111111111111111101
print(bin(0xfffffffd))
# 0b11111111111111111111111111111101
print(0xfffffffd) # 4294967293
Python中bin
一個(gè)負(fù)數(shù)(十進(jìn)制表示)男翰,輸出的是它的原碼的二進(jìn)制表示加上個(gè)負(fù)號(hào).
Python中的整型是補(bǔ)碼形式存儲(chǔ)的。
Python中整型是不限制長(zhǎng)度的不會(huì)超范圍溢出纽乱。
所以為了獲得負(fù)數(shù)(十進(jìn)制表示)的補(bǔ)碼蛾绎,需要手動(dòng)將其和十六進(jìn)制數(shù)0xffffffff
進(jìn)行按位與操作,再交給bin()
進(jìn)行輸出鸦列,得到的才是負(fù)數(shù)的補(bǔ)碼表示租冠。