非常傳統(tǒng)的題目,計(jì)算機(jī)語(yǔ)言的三大核心語(yǔ)法要素的一部分:
??1. 運(yùn)算符;
??2. 流程控制;
同時(shí)建立程序的概念。
主題二:數(shù)據(jù)運(yùn)算與流程控制
目標(biāo)
-
應(yīng)用目標(biāo)
- 階段實(shí)戰(zhàn):利用各種計(jì)算、條件控制、循環(huán)控制等知識(shí),實(shí)現(xiàn)各種圖形繪制應(yīng)用程序;
-
綜合實(shí)戰(zhàn):
- 完成股票信息的完整數(shù)據(jù)查詢。
- 完成完整的信息輸入模塊。
-
資費(fèi)管理系統(tǒng)
字符界面的系統(tǒng)
-
股票信息查詢系統(tǒng)
字符界面的查詢系統(tǒng)
-
技能目標(biāo)
- 1. 能實(shí)現(xiàn)流程復(fù)雜的應(yīng)用模塊
-
2. 基本技術(shù)應(yīng)用能力。
能使用運(yùn)算符;能根據(jù)條件控制流程;能在開(kāi)發(fā)中使用循環(huán)控制程序流程;能在循環(huán)中停止程序的循環(huán)流程;
-
知識(shí)點(diǎn)目標(biāo)
-
1. 掌握運(yùn)算符語(yǔ)法、功能與應(yīng)用;
掌握算術(shù)運(yùn)算符號(hào);掌握條件運(yùn)算符號(hào);掌握邏輯運(yùn)算符號(hào);掌握位運(yùn)算符號(hào);掌握復(fù)合運(yùn)算符號(hào);掌握其他運(yùn)算符號(hào);掌握表達(dá)式與運(yùn)算符號(hào)的優(yōu)先級(jí);-
掌握常見(jiàn)數(shù)據(jù)的運(yùn)算;數(shù)值運(yùn)算;邏輯值運(yùn)算;序列值運(yùn)算;字符串值運(yùn)算;字典值運(yùn)算;集合值運(yùn)算;
掌握調(diào)用符號(hào);掌握函數(shù)調(diào)用符號(hào);
-
2. 掌握程序流程控制的語(yǔ)法與流程控制過(guò)程
掌握條件控制的語(yǔ)法-if;掌握條件控制的應(yīng)用-if;掌握循環(huán)控制的語(yǔ)法-while;掌握循環(huán)控制的應(yīng)用-while;掌握循環(huán)控制的語(yǔ)法-for;掌握循環(huán)控制的應(yīng)用-for;掌握循環(huán)中斷控制語(yǔ)法-continue與break;了解其他流程控制語(yǔ)法;
-
1. 掌握運(yùn)算符語(yǔ)法、功能與應(yīng)用;
運(yùn)算符語(yǔ)法、功能與應(yīng)用
??掌握好運(yùn)算符號(hào),從四個(gè)方面掌握:
- 運(yùn)算符號(hào)的使用語(yǔ)法
- 運(yùn)算符號(hào)的功能(作用)
- 運(yùn)算符號(hào)參與運(yùn)算的數(shù)據(jù)要求(數(shù)據(jù)類型,數(shù)據(jù)個(gè)數(shù))
- 運(yùn)算符號(hào)的返回?cái)?shù)據(jù)類型
??特別需要注意的是,在某些運(yùn)算中,還存在數(shù)據(jù)類型轉(zhuǎn)換。
算術(shù)運(yùn)算符號(hào)
-
語(yǔ)法
算術(shù)運(yùn)算都是二目運(yùn)算(需要兩個(gè)數(shù)據(jù)值參與運(yùn)算)
數(shù)據(jù)1 運(yùn)算符 數(shù)據(jù)2
說(shuō)明:運(yùn)算符在中間,數(shù)據(jù)在運(yùn)算符兩邊(前面的數(shù)據(jù)成為:被運(yùn)算數(shù)【比如:被加數(shù)】,后面成為運(yùn)算數(shù)【比如:加數(shù)】),這種運(yùn)算的表達(dá)方式,也稱表達(dá)式,俗稱中繼表達(dá)式。
-
算術(shù)運(yùn)算的運(yùn)算符
- + :加運(yùn)算
- - :減運(yùn)算
- *:乘運(yùn)算
- / :除運(yùn)算
- //:整除運(yùn)算
- %:求余運(yùn)算
- **:冪運(yùn)算(指數(shù)運(yùn)算,乘方運(yùn)算)
# 熟悉運(yùn)算符的功能與使用語(yǔ)法
print(20 + 30)
print(40 - 30)
print(10 * 5)
print(17 / 5)
print(18 // 7)
print(25 % 6)
print(8 ** 2)
50
10
50
3.4
2
1
64
- 運(yùn)算數(shù)的數(shù)據(jù)類型
- 加減法
- 對(duì)整數(shù),小數(shù) ,邏輯值,復(fù)數(shù)都可以運(yùn)算。
- 邏輯值True=1,F(xiàn)alse=0
- 所有運(yùn)算的結(jié)果與數(shù)學(xué)知識(shí)一致。
# + -
print(30 + 30)
print(30 + 88.88)
print(30 + True)
print(30 + (30 + 45.8J) )
print(False + True )
60
118.88
31
(60+45.8j)
1
-
乘除法
對(duì)整數(shù),小數(shù) ,邏輯值,復(fù)數(shù)都可以運(yùn)算。
邏輯值True=1,F(xiàn)alse=0
所有運(yùn)算的結(jié)果與數(shù)學(xué)知識(shí)一致。
注意:除法中除數(shù)不能為0。
# 乘除
print(30 * 30)
print(30 * 88.88)
print(30 * True)
print(30 * (30 + 45.88888J) )
print(False * True )
print("---------------")
print(30 / 30)
print(30 / 88.88)
print(30 / True)
print(30 / (30 + 45.8J) )
print(False / True )
900
2666.3999999999996
30
(900+1376.6664j)
0
---------------
1.0
0.33753375337533753
30.0
(0.3002361857994957-0.45836057698723004j)
0.0
- 整除
對(duì)整數(shù),小數(shù) ,邏輯值都可以運(yùn)算,對(duì)復(fù)數(shù)不能運(yùn)算,因?yàn)閺?fù)數(shù)不能取整(floor運(yùn)算)
邏輯值True=1,F(xiàn)alse=0
所有運(yùn)算的結(jié)果與數(shù)學(xué)知識(shí)一致。
注意:整除中除數(shù)不能為0。
# 整除
print(30 // 30)
print(30 // 88.88)
print(30 // True)
# print((30 + 45J) // 5 ) # TypeError: can't take floor of complex number.
print(False // True )
print(86.8 // 67.8)
1
0.0
30
0
1.0
- 乘方
對(duì)整數(shù),小數(shù) ,邏輯值,復(fù)數(shù)都可以運(yùn)算
邏輯值True=1,F(xiàn)alse=0
所有運(yùn)算的結(jié)果與數(shù)學(xué)知識(shí)一致。
# 整除
print(30 ** 2)
print(30 ** 2.5)
print(30 ** True)
print((30 + 45J) ** 3 ) # TypeError: can't take floor of complex number.
print(False ** True )
print(86.8 ** 67.8)
print(2 ** (4.3 + 3J))
900
4929.503017546495
30
(-155250+30375j)
0
2.7017015190288315e+131
(-9.592967312139688+17.20460459222708j)
- 返回類型
??邏輯值作為整數(shù)在處理;返回類型的規(guī)則
- 整數(shù) op 整數(shù) -> 整數(shù)(op:+ - * // % **)
- 整數(shù) / 整數(shù) -> 小數(shù) (就算能整除,也是小數(shù))
print(type(16/3))
<class 'float'>
- 整數(shù) op 小數(shù) -> 小數(shù)
- 小數(shù) op 小數(shù) -> 小數(shù)
print(type(4.5//3.5))
print(type(4//3.0))
print(type(4//3))
<class 'float'>
<class 'float'>
<class 'int'>
- 整數(shù) op 復(fù)數(shù) -> 復(fù)數(shù)
- 小數(shù) op 復(fù)數(shù) -> 復(fù)數(shù)
- 提示:復(fù)數(shù)有可能虛部為 0
print(23 * (4 + 5J))
print( (4 + 5J) / (4 + 5J))
print( (4 + 5J) * (4 - 5J) )
(92+115j)
(1+0j)
(41+0j)
- 對(duì)序列的運(yùn)算
列表包含三類:元組,列表,字符串
-
有列表支持的算術(shù)運(yùn)算
-
復(fù)制:整數(shù) * 列表:
整數(shù) * 列表或者列表 * 整數(shù) -
連接:列表 + 列表:
列表 + 列表
-
復(fù)制:整數(shù) * 列表:
其他的運(yùn)算符都不支持
注意:只有同類型才能連接
print( (1, 2, 3) * 3 )
print( 3 * (1, 2, 3))
print( [1, 2, 3] * 3 )
print( 3 * [1, 2, 3])
print('hello'* 3 )
print( 3 * 'world')
print( [1, 2, 3] + [4, 5, 6])
# print( (1, 2, 3) + [4, 5, 6]) # 不同類型:TypeError: can only concatenate tuple (not "list") to tuple
print( (1, 2, 3) + (1, 2, 3))
print( 'hello' + 'world')
# print( 3 * {1, 2, 3}) # unsupported operand type(s) for *: 'int' and 'set'
(1, 2, 3, 1, 2, 3, 1, 2, 3)
(1, 2, 3, 1, 2, 3, 1, 2, 3)
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
hellohellohello
worldworldworld
[1, 2, 3, 4, 5, 6]
(1, 2, 3, 1, 2, 3)
helloworld
- 對(duì)字典/集合的運(yùn)算
- 算術(shù)運(yùn)算中的任何運(yùn)算符,都不支持對(duì)字典/集合的運(yùn)算;
dt = {'name': 'Louis', 'age': 20}
print(dt + dt) # TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-128-d6eb1a53c94e> in <module>()
1 dt = {'name': 'Louis', 'age': 20}
----> 2 print(dt + dt) # TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
- 關(guān)于@運(yùn)算
- 在Python中提供了一個(gè)
@運(yùn)算,我們總是把他歸為算術(shù)運(yùn)算,實(shí)際這個(gè)運(yùn)算對(duì)內(nèi)置類型都沒(méi)有實(shí)現(xiàn),但這個(gè)運(yùn)算符提供了Python的發(fā)展方向與期望的強(qiáng)項(xiàng):數(shù)值計(jì)算。因?yàn)檫@個(gè)運(yùn)算是面向大學(xué)線性代數(shù)中的運(yùn)算:內(nèi)積運(yùn)算。 - 該運(yùn)算方式在NumPy提供了實(shí)現(xiàn)。
- 在Python中提供了一個(gè)
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
a @ b
32
關(guān)系運(yùn)算符號(hào);
-
語(yǔ)法
- 關(guān)系運(yùn)算是二目運(yùn)算
- 運(yùn)算數(shù) 關(guān)系運(yùn)算符 運(yùn)算數(shù)
-
條件運(yùn)算的運(yùn)算符
- < :小于比較運(yùn)算
- <= :小于等于比較運(yùn)算
- > :大于比較運(yùn)算
- >= :大于等于比較運(yùn)算
- == :相等比較運(yùn)算
- != :不等比較運(yùn)算
-
返回的類型
- 返回類型都是邏輯型。
print(45 < 50)
print(45 <= 50)
print(45 > 50)
print(45 >= 50)
print(45 == 50)
print(45 != 50)
True
True
False
False
False
True
- 運(yùn)算數(shù)的數(shù)據(jù)類型
- 整數(shù),小數(shù),邏輯類型
數(shù)值類型的比較容易理解
數(shù)值類型包含True。
注意:不支持復(fù)數(shù)的比較(這個(gè)符合我們高中的數(shù)學(xué)知識(shí))
print(True > False)
True
- 所以類型
- 所有類型都支持 : == 與 !=
- 這兩個(gè)關(guān)系運(yùn)算符,在不同數(shù)據(jù)類型的實(shí)現(xiàn)的含義不同。
- 對(duì)大部分對(duì)象而言,指的是兩個(gè)變量是否是同一個(gè)內(nèi)存空間。
- 對(duì)數(shù)值類型而言,指的是內(nèi)容值是否相等。
- 對(duì)數(shù)值類型而言,首先判斷類型是否相同,然后再判定值是否相同。(默認(rèn)實(shí)現(xiàn):地址相等判定)
print((4 + 5J)==complex(4 , 5))
print((4 + 5J)!=(4 + 5J))
True
False
print([1,2,3] == [1, 2, 3])
print([1,2,3] == (1, 2, 3))
True
False
# 類型同,值同,但變量的內(nèi)存空間不同(地址不同)
a = {1, 2, 3}
b = set([1, 2, 3])
print('0X%X'%id(a), '0X%X'%id(b) )
print(a == b)
0X111655748 0X111E85AC8
True
# 另外一種對(duì)象相同,返回的不是邏輯類型,而是邏輯數(shù)組。
import numpy as np
a = np.array([1,2,3])
b = np.array([1,2,3])
print(a==b)
[ True True True]
# 地址相等
class A:
pass
oa = A()
ob = A()
print(oa == ob) # 判定的是地址相等
False
- 序列類型
- 按照字典排序比較,返回除相等外的第一個(gè)元素的比較結(jié)果。
- 這種比較基本上沒(méi)有意義,如果想實(shí)現(xiàn)比較,需要自己實(shí)現(xiàn)。
print( [6,3,5] <= [6, 2, 5] )
print( [6,2,5] <= [6, 2, 5] )
print( [6,3,5] <= [6, 2, 5,] )
print( [6,2,5] <= [6, 2, 5, 0] )
print('hello' <= 'hEllo') # 每個(gè)字符作為ASCII碼比較
False
True
False
True
False
邏輯運(yùn)算符號(hào);
-
語(yǔ)法
- 邏輯運(yùn)算有二目運(yùn)算,也有一目運(yùn)算
- 二目運(yùn)算:
運(yùn)算數(shù)邏輯運(yùn)算符運(yùn)算數(shù) - 一目運(yùn)算:邏輯運(yùn)算符
運(yùn)算數(shù)
-
邏輯運(yùn)算的運(yùn)算符
- 二目運(yùn)算:
and or - 一目運(yùn)算:
not
- 二目運(yùn)算:
-
邏輯運(yùn)算返回值
- 返回:邏輯類型
print(True and False)
print(True or False)
print(not False)
False
True
True
- 邏輯運(yùn)算的數(shù)據(jù)類型
- 實(shí)際上邏輯值是0與1兩個(gè)整數(shù)表示,在Python的邏輯運(yùn)算中,其他類型會(huì)自動(dòng)轉(zhuǎn)換為邏輯類型后,進(jìn)行邏輯運(yùn)算。
- 整數(shù)的邏輯運(yùn)算
- 所有整數(shù)當(dāng)成邏輯值處理(0:False,非0:True)
print(not -2)
print(not -0)
print(2 and -2)
print(2 or -2)
print(2 and False )
print(2 or False )
False
True
-2
2
False
2
- 小數(shù)的邏輯運(yùn)算
- 小數(shù)與整數(shù)一樣,也直接作為邏輯值使用(0:False,非0:True)
print(not 2.0 )
print(not 0.0 )
print(2.5 and -0.0)
print(1.8 or -2.3)
print(2.8 and False )
print(2.8 or False )
False
True
-0.0
1.8
False
2.8
- 字符串的邏輯運(yùn)算
- 字符串也當(dāng)成邏輯值處理:('':False,非'':True)
print(not 'hello')
print(not '')
print('' and 'world') #第一個(gè)為False,返回第一個(gè)
print('Hello' and 'world') #第一個(gè)為True,返回第二個(gè)
print('hello' or 'world')
# 為什么不直接返回True或者False。
False
True
world
hello
- 列表的邏輯運(yùn)算
- 列表也當(dāng)成邏輯值處理:([],():False,非[]:True)
- 元組(0)也是當(dāng)作False處理。這個(gè)與元組的語(yǔ)法有關(guān)。
print(not [] )
print(not [0] )
print([1, 2, 3] and -0.0)
print(1.8 or [1,2,3])
print(2.8 and [1,2,3] )
print('--------------')
print(not () )
print(not (0) )
print(not (0,2,3))
print((1, 2, 3) and -0.0)
print(1.8 or (1,2,3))
print(2.8 and (1,2,3) )
True
False
-0.0
1.8
[1, 2, 3]
--------------
True
True
False
-0.0
1.8
(1, 2, 3)
- 字典與集合的邏輯運(yùn)算
- 字典也當(dāng)成邏輯值處理:({}:False,非{}:True)
print(not {})
print(not {0})
print({1, 2, 3} and -0.0)
print(1.8 or {1,2,3})
print(2.8 and {1,2,3} )
True
False
-0.0
1.8
{1, 2, 3}
- 對(duì)象的邏輯運(yùn)算
對(duì)象作為邏輯值使用:對(duì)象不存在None表示False,對(duì)象存在表示True
class A:
pass
a = A()
print(not a)
# 對(duì)象默認(rèn)為True
False
- 無(wú)窮大與非數(shù)值,None的邏輯運(yùn)算
- 無(wú)窮大與非數(shù)值默認(rèn)是True(因?yàn)榉?)
- None當(dāng)作False使用。
nan = float('NaN')
inf = float('Inf')
n = None
print(not n)
print(not nan)
print(not inf)
True
False
False
- 在其他的一些實(shí)現(xiàn)中,也可能實(shí)現(xiàn)邏輯運(yùn)算發(fā),其運(yùn)算規(guī)則需要看實(shí)現(xiàn)文檔。
import numpy as np
na = np.array([1,2,3])
print(na)
print(not na.all()) # 多值,產(chǎn)生歧義:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# ndarray數(shù)組對(duì)象,不能直接做邏輯值使用,需要做處理。
[1 2 3]
False
位運(yùn)算符號(hào)
- 位運(yùn)算符分成兩類:
- 位移運(yùn)算符:對(duì)數(shù)據(jù)的位進(jìn)行移動(dòng),從而改變數(shù)據(jù)的值。
- 位算術(shù)運(yùn)算符:對(duì)數(shù)據(jù)的位進(jìn)行且,或,異或,否運(yùn)算。
位移運(yùn)算符號(hào)
-
語(yǔ)法:
- 位移運(yùn)算符是二目運(yùn)算符
- 語(yǔ)法: 被位移數(shù) 位移運(yùn)算符 位移的位數(shù)
-
位移運(yùn)算的運(yùn)算符
- << :左移
- >> :右移
print(10<<2)
print(10>>2)
print(10<<1000)
40
2
107150860718626732094842504906000181056140481170553360744375038837035105112493612249319837881569585812759467291755314682518714528569231404359845775746985748039345677748242309854210746050623711418779541821530464749835819412673987675591655439460770629145711964776865421676604298316526243868372056680693760
- 運(yùn)算類型
位移的位數(shù)必須是整數(shù),不支持小數(shù)
邏輯值可以當(dāng)成整數(shù)處理True當(dāng)成1,F(xiàn)alse當(dāng)成0
被位移數(shù)也必須是整數(shù)
因?yàn)槠渌麛?shù)據(jù)位移會(huì)破壞數(shù)據(jù)類型與數(shù)據(jù)結(jié)構(gòu)。
print(10<<True)
# print(10<<2.0) 錯(cuò)誤
# print(2.0<<2) 錯(cuò)誤
print(True<<2)
20
4
- 返回類型
- 位移返回類型與被位移的整數(shù)一樣的類型。
位算術(shù)運(yùn)算符號(hào)
-
語(yǔ)法
- 位算術(shù)運(yùn)算符,也分成單目運(yùn)算與二目運(yùn)算:
- 二目位算術(shù)運(yùn)算:整數(shù) 位運(yùn)算符 整數(shù)
- 單目位算術(shù)運(yùn)算:整數(shù) 位運(yùn)算符
-
位算術(shù)運(yùn)算的運(yùn)算符
- 單目運(yùn)算:
- ~:每個(gè)位取反
- 二目運(yùn)算:
- &:每個(gè)位做且運(yùn)算(都是1,為1,否則為0)
- | :每個(gè)位做或運(yùn)算(一個(gè)為1,為1,否則為0)
- ^:每個(gè)位做異或運(yùn)算(同為0,不同為1)
- 單目運(yùn)算:
- 返回類型:
- 返回的也是整數(shù)(可以當(dāng)邏輯值使用)
print(10 & 5)
print(10 | 5)
print(10 ^ 5)
print(~ 5)
0
15
15
-6
- 位運(yùn)算的經(jīng)典應(yīng)用
- IP計(jì)算:IP地址是4字節(jié)整數(shù),一般表示成數(shù)點(diǎn)格式:192.168.1.128
- 顏色計(jì)算:顏色就是一個(gè)像素,在計(jì)算機(jī)種使用4字節(jié)整數(shù)表示(這是模擬全真色,還有其他格式),可以通過(guò)位運(yùn)算取出R,G,B,Alpha四個(gè)顏色分量。
r = 200
g = 100
b = 20
a = 255
print("把三原色+透明度合成一個(gè)像素:", r<< 24 | g << 16 | b << 8 | a)
把三原色+透明度合成一個(gè)像素: 3362002175
color = 3362002175
print('紅色:', color >> 24)
print('綠色:', color >> 16 & 255)
print('藍(lán)色:', color >> 8 & 255)
print('透明:', color & 255)
紅色: 200
綠色: 100
藍(lán)色: 20
透明: 255
field1 = 192
field2 = 168
field3 = 1
field4 = 128
print("表示IP地址的整數(shù)", field1<< 24 | field2 << 16 | field3 << 8 | field4)
表示IP地址的整數(shù) 3232235904
ip = 3232235904
field1 = ip >> 24 & 255
field2 = ip >> 16 & 255
field3 = ip >> 8 & 255
field4 = ip >> 0 & 255
print(F'IP地址數(shù)點(diǎn)格式:{field1}.{field2}.{field3}.{field4}')
IP地址數(shù)點(diǎn)格式:192.168.1.128
復(fù)合運(yùn)算符號(hào);
- 符合運(yùn)算指的是:=與前面某些運(yùn)算符號(hào)結(jié)合的運(yùn)算符號(hào)。有點(diǎn)人成為增值運(yùn)算;
-
語(yǔ)法:
- 被運(yùn)算變量 符合運(yùn)算符 運(yùn)算數(shù)
-
復(fù)合運(yùn)算的運(yùn)算符號(hào)
+= :遞加
-= :遞減
*= :遞乘
/= :遞除
//= :遞整除
%= :遞求余
**= :遞冪
@= :遞內(nèi)積(Python對(duì)內(nèi)置類型沒(méi)有實(shí)現(xiàn))
&= :遞位且
|= :遞位或
^= :遞位異或
>>= :遞右移
<<= :遞左移
- **注意:** 符合運(yùn)算符號(hào)有一個(gè)顯著的特征:
- 被運(yùn)算數(shù)必須是變量(因?yàn)?有賦值的含義,這個(gè)只對(duì)變量有效)。對(duì)數(shù)值無(wú)效。
- 復(fù)合運(yùn)算符的運(yùn)算說(shuō)明:
- a +=2 效果上等價(jià)于 a = a + 2,其他依次類推。
- 性能上復(fù)合運(yùn)算比對(duì)等的單一運(yùn)算要好(運(yùn)算量要少)。
i = 20
i += 20
# 3 += 20 # 錯(cuò)誤
其他運(yùn)算符號(hào);
- ():優(yōu)先級(jí)運(yùn)算,參數(shù)傳遞等。
- []:下標(biāo)運(yùn)算
- .:成員調(diào)用運(yùn)算
- in:列表元素判定運(yùn)算(使用與序列:tuple,list,string, set)
- is:判定兩個(gè)變量是否同一個(gè)內(nèi)存
- 值1 if 條件 else 值2:條件表達(dá)式運(yùn)算
- + -除了在二目運(yùn)算作為加減運(yùn)算,如果作為一目運(yùn)算表示取正與負(fù)
print(8 * (2 + 3 )) # 改變優(yōu)先級(jí)
print((1,2,3,4)[1]) # 取列表中的第二個(gè)元素
import math
print(math.pi) # 調(diào)用math模塊的成員:圓周率
print( 20 in [1 ,2, 3, 20, 4])
print( 20 in {1 ,2, 3, 20, 4})
print( 'name' in {'name':'Louis', 'age':20 }) # 對(duì)key判定
print( 20 in {'name':'Louis', 'age':20 }) # 不對(duì)value判定
print( 20 is '20')
print( 'ok' if 20>30 else 'not ok' )
a = 20
print(+a)
print(-a)
40
2
3.141592653589793
True
True
True
False
False
not ok
20
-20
表達(dá)式與運(yùn)算符號(hào)的優(yōu)先級(jí);
- 運(yùn)算符可以多個(gè)連續(xù)使用,形成表達(dá)式。
1 + 3 * 2 / 5**2-10 % 3 == 1 +3
False
- 表達(dá)式因?yàn)槭褂枚鄠€(gè)運(yùn)算符,每個(gè)運(yùn)算符存在運(yùn)算的優(yōu)先級(jí)情況。
- 下面是運(yùn)算優(yōu)先級(jí)
| 運(yùn)算符說(shuō)明 | Python運(yùn)算符 | 優(yōu)先級(jí) |
|---|---|---|
| 'expression,...' | 字符串轉(zhuǎn)換 | 24 |
| {key:datum,...} | 字典顯示 | 23 |
| [expression,...] | 列表顯示 | 22 |
| (experession,...) | 綁定或元組顯示 | 21 |
| f(arguments...) | 函數(shù)調(diào)用 | 20 |
| 索引運(yùn)算符 | x[index]或x[index:index2[:index3]] | 18、19 |
| 屬性訪問(wèn) | x.attrbute | 17 |
| 乘方 | ** | 16 |
| 按位取反 | ~ | 15 |
| 符號(hào)運(yùn)算符 | +或- | 14 |
| 乘、除 | *、/、//、% | 13 |
| 加、減 | +、- | 12 |
| 位移 | >>、<< | 11 |
| 按位與 | & | 10 |
| 按位異或 | ^ | 9 |
| 按位或 | | 8 | |
| 比較運(yùn)算符 | ==、!=、>、>=、<、<= | 7 |
| is運(yùn)算符 | is、is not | 6 |
| in運(yùn)算符 | in、not in | 5 |
| 邏輯非 | not | 4 |
| 邏輯與 | and | 3 |
| 邏輯或 | or | 2 |
- 定制運(yùn)算優(yōu)先級(jí)
- 上面的優(yōu)先級(jí)是Python解釋器默認(rèn)優(yōu)先級(jí)。
- 可以使用()優(yōu)先級(jí)運(yùn)算符,改變上述運(yùn)算的優(yōu)先級(jí)。
(1 + 3) * 2 / (5**(2-10 % 3) ) == (1 + 3)
False
下標(biāo)運(yùn)算
下標(biāo)運(yùn)算主要在序列數(shù)據(jù)類型的運(yùn)算中使用,用來(lái)定位序列中的元素。
-
語(yǔ)法:
序列數(shù)據(jù)值[開(kāi)始位置:結(jié)束位置:步長(zhǎng)];
其中的位置從0開(kāi)始。
下面是具體的使用方式。
按照位置取列表中的值
v1 = (1,2,3,4,5,6,7,8)
v2 = [1,2,3,4,5,6,7,8]
v3 = 'abcdefgh'
# 取值
print (v1[1])
print (v2[2])
print (v3[1])
# 修改值
# v1[1]=88 # 元組只取值,不賦值
v2[1]=88
# v3[1]='X' # 字符串只取值,不賦值
print(v1)
print(v2)
print(v3)
# 釋放值
# del v1[1] # 元組值不能修改
del v2[1]
# del v3[1] # 字符串值不能修改
print(v2)
2
3
b
(1, 2, 3, 4, 5, 6, 7, 8)
[1, 88, 3, 4, 5, 6, 7, 8]
abcdefgh
[1, 3, 4, 5, 6, 7, 8]
- 取區(qū)間的值
- 區(qū)間使用的是[ ... )
v1 = (1,2,3,4,5,6,7,8)
v2 = [1,2,3,4,5,6,7,8]
v3 = 'abcdefgh'
# 取值
print (v1[1:4]) # 不包含位置4
print (v2[1:4])
print (v3[1:4])
(2, 3, 4)
[2, 3, 4]
bcd
- 指定步長(zhǎng)
v1 = (1,2,3,4,5,6,7,8)
v2 = [1,2,3,4,5,6,7,8]
v3 = 'abcdefgh'
# 取值
print (v1[1:6:2]) # 不包含位置4
print (v2[1:6:2])
print (v3[1:6:2])
v2[1:6:2]= [77,88,99] #長(zhǎng)度要匹配
print(v2)
(2, 4, 6)
[2, 4, 6]
bdf
[1, 77, 3, 88, 5, 99, 7, 8]
- 負(fù)值的使用
- 其中的開(kāi)始位置,結(jié)束位置,步長(zhǎng)都可以取負(fù)值,負(fù)值表示位置計(jì)算從結(jié)束位置開(kāi)始
v1 = (1,2,3,4,5,6,7,8)
v2 = [1,2,3,4,5,6,7,8]
v3 = 'abcdefgh'
# 取值
print(v1[-1])
print(v1[-5:-1]) # 從倒數(shù)第5個(gè),到倒數(shù)第1個(gè)
print(v1[-1:-5:-1]) # 從倒數(shù)第1個(gè),到倒數(shù)第5個(gè)。反序。
8
(4, 5, 6, 7)
(8, 7, 6, 5)
- 下標(biāo)中的默認(rèn)值
- 下標(biāo)中每一個(gè)值可以使用默認(rèn)值
v1 = (1,2,3,4,5,6,7,8)
v2 = [1,2,3,4,5,6,7,8]
v3 = 'abcdefgh'
# 取值
#print(v1[]) # 必須要一個(gè)值
print(v1[:]) # 開(kāi)始位置,默認(rèn)是0,結(jié)束位置默認(rèn)是-1的下一個(gè)。
print(v1[::]) # 步長(zhǎng)默認(rèn)是1。
print(v1[2:]) # 開(kāi)始位置,默認(rèn)是0,結(jié)束位置默認(rèn)是-1的下一個(gè)。
print(v1[:3:]) # 步長(zhǎng)默認(rèn)是1。
print(v1[::2]) # 步長(zhǎng)默認(rèn)是1。
print(v1[::-1]) # 步長(zhǎng)默認(rèn)是1。
(1, 2, 3, 4, 5, 6, 7, 8)
(1, 2, 3, 4, 5, 6, 7, 8)
(3, 4, 5, 6, 7, 8)
(1, 2, 3)
(1, 3, 5, 7)
(8, 7, 6, 5, 4, 3, 2, 1)
成員調(diào)用符號(hào)
-
運(yùn)算符
.有兩個(gè)使用場(chǎng)景-
.用于包與模塊的路徑。 -
.用于對(duì)象的成員調(diào)用。
-
-
語(yǔ)法:
包.包包.模塊-
模塊.類或者模塊.函數(shù)或者模塊.變量 對(duì)象 .成員
import math
print(math.pi)
print(math.sin(math.pi/60))
3.141592653589793
0.05233595624294383
from datetime import *
dt = date.today()
print(dt.year)
print(dt.month)
print(dt.day)
2019
3
6
函數(shù)調(diào)用符號(hào);
- 語(yǔ)法
返回值變量 = 函數(shù)名(參數(shù),參數(shù),參數(shù) ,......)
from math import *
print(sin(3.14159262/6))
0.49999999515173094
程序流程控制的語(yǔ)法與流程控制過(guò)程
- 程序的執(zhí)行是按照代碼的先后執(zhí)行的(線性性),需要的時(shí)候,可以改變程序執(zhí)行的流程,我們稱為流程控制。
- 常規(guī)來(lái)說(shuō),在語(yǔ)言層面可以控制程序的流程提供兩種改變方式:
- 執(zhí)行還是不執(zhí)行:根據(jù)條件選在是否執(zhí)行,我們稱為條件控制
- 反復(fù)執(zhí)行:根據(jù)條件反復(fù)執(zhí)行指定的代碼。我們稱為循環(huán)控制
- 循環(huán)的結(jié)束,我們稱為中斷控制。
- 條件控制與循環(huán)控制的語(yǔ)法:
使用是塊的方式控制,語(yǔ)法:-塊頭 + 塊體
塊頭:每種類型的塊頭都不一樣。
塊體:由代碼構(gòu)成,所有代碼縮行數(shù)相同的代碼都是同一個(gè)塊體。直到縮行數(shù)不同,表示當(dāng)前塊結(jié)束,另外一個(gè)塊開(kāi)始。
注意:默認(rèn)Python程序有一個(gè)頂層塊,頂層塊是不用縮行的。
掌握條件控制的語(yǔ)法-if;
- 語(yǔ)法一:一個(gè)塊構(gòu)成
- 條件控制頭 :
if 邏輯值 : - 說(shuō)明:條件為真,塊得到執(zhí)行。條件為假,塊不會(huì)執(zhí)行。
- 條件控制頭 :
if True :
print('被執(zhí)行---1')
print('被執(zhí)行---2')
被執(zhí)行---1
被執(zhí)行---2
if False : # 不會(huì)被執(zhí)行
print('被執(zhí)行---1')
print('被執(zhí)行---2')
- 語(yǔ)法二:兩個(gè)塊構(gòu)成
if 邏輯值 :
語(yǔ)句
...
else:
語(yǔ)句
....
-
說(shuō)明:
- else塊不能單獨(dú)使用,必須與if塊一起使用。if塊可以不使用else塊。
- 當(dāng)if為假執(zhí)行else的塊,真就執(zhí)行if的塊。
if True :
print('被執(zhí)行---1')
print('被執(zhí)行---2')
else:
print('被執(zhí)行---其他1')
print('被執(zhí)行---其他2')
被執(zhí)行---1
被執(zhí)行---2
if False:
print('被執(zhí)行---1')
print('被執(zhí)行---2')
else:
print('被執(zhí)行---其他1')
print('被執(zhí)行---其他2')
被執(zhí)行---其他1
被執(zhí)行---其他2
- 語(yǔ)法三:
if 邏輯值:
語(yǔ)句
...
elif 邏輯值:
語(yǔ)句
...
elif 邏輯值:
語(yǔ)句
...
...
a = 80
if a==100:
print('滿分')
elif a >=90:
print('優(yōu)秀')
elif a >=80:
print('良')
elif a >=70:
print('中')
elif a >=60:
print('及格')
elif a<60:
print('不及格')
良
- 語(yǔ)法四:
if 邏輯值:
語(yǔ)句
...
elif 邏輯值:
語(yǔ)句
...
elif 邏輯值:
語(yǔ)句
...
else:
...
a = 40
if a==100:
print('滿分')
elif a >=90:
print('優(yōu)秀')
elif a >=80:
print('良')
elif a >=70:
print('中')
elif a >=60:
print('及格')
else:
print('不及格')
不及格
掌握條件控制的應(yīng)用-if;
??除了直接使用邏輯值,還可以使用如下形式的邏輯值,會(huì)自動(dòng)轉(zhuǎn)換。
- 使用關(guān)系運(yùn)算
- 因?yàn)殛P(guān)系運(yùn)算直接返回邏輯值
a = input('輸入選擇 (ok: 接受,其他:不接受) ')
if a == 'ok':
print('你選擇了接受!')
else:
print('你選擇了拒絕!')
輸入選擇 (ok: 接受,其他:不接受) ok
你選擇了接受!
- 直接使用數(shù)值,對(duì)象作為條件
- 這些數(shù)值對(duì)象可以直接轉(zhuǎn)換為邏輯條件
a = input('輸入選擇 (任何輸入: 接受,不輸入:不接受) ')
if a :
print('你選擇了接受!')
else:
print('你選擇了拒絕!')
輸入選擇 (任何輸入: 接受,不輸入:不接受)
你選擇了拒絕!
a =(1,2,3,4)
if a :
print('你選擇了接受!')
else:
print('你選擇了拒絕!')
你選擇了接受!
a = 20
if a :
print('你選擇了接受!')
else:
print('你選擇了拒絕!')
你選擇了接受!
- 使用in,is等運(yùn)算符
a = input('輸入選擇 (只能選擇1,2,3,4) ')
if type(a) is str:
print('輸入的是str')
else:
print('輸入的是非str')
輸入選擇 (只能選擇1,2,3,4) 1
輸入的是str
a = input('輸入選擇 (只能選擇1,2,3,4) ')
if a in ('1' , '2', '3', '4'):
print('選擇正確')
else:
print('選擇不對(duì)')
輸入選擇 (只能選擇1,2,3,4) 1
選擇正確
- 使用not改變條件
a = input('輸入選擇 (只能選擇1,2,3,4) ')
print(a)
if a not in ('1' , '2', '3', '4'):
print('選擇不對(duì)')
else:
print('選擇正確')
輸入選擇 (只能選擇1,2,3,4) 1
1
選擇正確
a = input('輸入選擇 (只能選擇1,2,3,4) ')
print(a)
if not a in ('1' , '2', '3', '4'):
print('選擇不對(duì)')
else:
print('選擇正確')
輸入選擇 (只能選擇1,2,3,4) 4
4
選擇正確
掌握循環(huán)控制的語(yǔ)法-while;
??while用來(lái)對(duì)塊中代碼循環(huán)執(zhí)行。
- 語(yǔ)法一:
while 邏輯值:
語(yǔ)句
...
-
注意:
邏輯值為True,就執(zhí)行塊,塊執(zhí)行完畢,再重新回到while,繼續(xù)判定邏輯值是否為True。
邏輯值為False,塊就不執(zhí)行。
-
與if的差別在于:
- if執(zhí)行完塊,就繼續(xù)執(zhí)行。
- while執(zhí)行完塊,會(huì)回到while處繼續(xù)判定。
i = 10
while I:
print(i)
i -= 1
10
9
8
7
6
5
4
3
2
1
- 語(yǔ)法二:
while 邏輯值:
語(yǔ)句
....
else:
語(yǔ)句
....
- 當(dāng)while的條件為False,else會(huì)得到執(zhí)行。
-
說(shuō)明:
- while支持else,但不支持與elif塊配合。
i = 10
while i != 0:
print(i)
i -= 1
else:
print('循環(huán)沒(méi)有執(zhí)行了')
10
9
8
7
6
5
4
3
2
1
循環(huán)沒(méi)有執(zhí)行了
掌握循環(huán)控制的應(yīng)用-while;
- while中的條件使用其他非邏輯值
i = 10
while I:
print(i)
i -= 1
else:
print('循環(huán)沒(méi)有執(zhí)行了')
10
9
8
7
6
5
4
3
2
1
循環(huán)沒(méi)有執(zhí)行了
- while中只有一個(gè)語(yǔ)句行
- 如果一行,可以在while于else后面直接寫語(yǔ)句
- 為了在一行上,編寫多個(gè)語(yǔ)句,可以使用;分隔。
i = 10
while i:print(i);i -= 1
else:print('循環(huán)沒(méi)有執(zhí)行了')
10
9
8
7
6
5
4
3
2
1
循環(huán)沒(méi)有執(zhí)行了
# 只有一行才能在while后面直接寫,多行不行。
i = 10
while i:print(i)
i -= 1
else:print('循環(huán)沒(méi)有執(zhí)行了')
File "<ipython-input-19-db0f5eefeb21>", line 4
i -= 1
^
IndentationError: unexpected indent
- 避免陷入死循環(huán)
- 需要使用變量來(lái)控制while后的條件改變,并有機(jī)會(huì)得到True的值。
- 一般為了避免while死循環(huán),有如下編程套路
- 在while外面定義一個(gè)變量,并設(shè)置一個(gè)初始值
- 在while的邏輯值處,就是用該變量產(chǎn)生。
- 在while內(nèi)部,根據(jù)情況,改變變量,需要退出,就讓變量的值改變,以至于使得while邏輯值處的條件得到False的結(jié)果。
i = 0
while i <=10 :
print(i)
i += 1
0
1
2
3
4
5
6
7
8
9
10
掌握循環(huán)控制的語(yǔ)法-for;
- for是專門對(duì)列表與字段等可以迭代的數(shù)據(jù)設(shè)計(jì)的專用循環(huán)語(yǔ)句。
- 語(yǔ)法一:
for 標(biāo)識(shí)字 in 序列數(shù)據(jù):
語(yǔ)句
......
-
for執(zhí)行流程說(shuō)明:
- for語(yǔ)句每次會(huì)從序列數(shù)據(jù)開(kāi)始位置取一個(gè)值,并使用標(biāo)識(shí)字定義各一個(gè)標(biāo)量,把取出的值存入變量,然后執(zhí)行塊中語(yǔ)句。
- 當(dāng)塊語(yǔ)句執(zhí)行完畢,會(huì)回到for位置,并取第二個(gè)值放入定義的變量,然后重復(fù)執(zhí)行塊中語(yǔ)句;
- ....
- 直到序列數(shù)據(jù)中數(shù)據(jù)都取玩位置,直接跳出塊執(zhí)行。
# 循環(huán)list
for d in [1,2,3,4]:
print(d)
1
2
3
4
# 循環(huán)字符串
for d in 'abcdefg':
print(d)
a
b
c
d
e
f
g
# 循環(huán)元組
for d in (1,2,3,4):
print(d)
# 元組的另外表示
for d in 1,2,3,4:
print(d)
1
2
3
4
1
2
3
4
# 循環(huán)集合
for d in {1,2,3,4}:
print(d)
1
2
3
4
# 循環(huán)字典
for d in {'name': 'louis','age':18}:
print(d)
name
age
# 循環(huán)呢字典的值
v = {'name': 'louis','age':18}
for d in v:
print(d, v[d], sep=':')
name:louis
age:18
- for語(yǔ)法二:
for 變量 in 序列:
語(yǔ)句
......
else:
語(yǔ)句
......
-
說(shuō)明:
- 當(dāng)列表循環(huán)完畢后,else得到執(zhí)行。
# 循環(huán)list
for d in [1,2,3,4]:
print(d)
else:
print('循環(huán)結(jié)束。')
1
2
3
4
循環(huán)結(jié)束。
掌握循環(huán)控制的應(yīng)用-for;
- 使用range創(chuàng)建序列
- Python提供了一個(gè)函數(shù),用來(lái)創(chuàng)建序列。
| - range(stop) -> range object
| - range(start, stop[, step]) -> range object
# 創(chuàng)建序列范圍: [ 0 - 4 )
for v in range(4):
print(v)
0
1
2
3
# 創(chuàng)建序列范圍: [ start - end )
for v in range(1, 5):
print(v)
1
2
3
4
# 創(chuàng)建序列范圍: [ start - end ), step = 2
for v in range(1, 5, 2):
print(v)
1
3
掌握循環(huán)中斷控制語(yǔ)法-continue與break;
??為了結(jié)束循環(huán),目前只有等到每次循環(huán)結(jié)束,重新判定循環(huán)條件。Python語(yǔ)言提供了在循環(huán)中,可以直接結(jié)束循環(huán)的語(yǔ)法,使用特殊的語(yǔ)句完成。
break與continue的理解與使用
-
中斷循環(huán)的兩種方式:
- 直接結(jié)束循環(huán)
- 結(jié)束當(dāng)前次循環(huán)后面代碼的執(zhí)行,重新開(kāi)始循環(huán)的條件判別。
-
循環(huán)的中斷的語(yǔ)法:
- break :直接結(jié)束循環(huán);
- continue :結(jié)束當(dāng)前循環(huán);
注意:中斷語(yǔ)句只能用于循環(huán):for與while,不能用于其他塊中。
# break的使用
for v in range(5):
print(v)
break
print('break后')
0
# continue的使用
for v in range(5):
print(v)
continue
print('break后')
0
1
2
3
4
在多重循環(huán)中使用break與continue
??Python的中斷語(yǔ)句與其他語(yǔ)言有些差異,不提供標(biāo)簽,用來(lái)中斷到指定位置。
??對(duì)于多重循環(huán)來(lái)說(shuō),中斷只影響到最近的循環(huán),對(duì)外層循環(huán)沒(méi)有影響,需要單獨(dú)寫代碼使用中斷繼續(xù)中斷。
# continue的在多層循環(huán)中使用
for y in range(3):
print('外層:', y)
for x in range(3):
print('\t內(nèi)層:', x)
continue
print('\t內(nèi)層后')
print('外層后')
外層: 0
內(nèi)層: 0
內(nèi)層: 1
內(nèi)層: 2
外層后
外層: 1
內(nèi)層: 0
內(nèi)層: 1
內(nèi)層: 2
外層后
外層: 2
內(nèi)層: 0
內(nèi)層: 1
內(nèi)層: 2
外層后
for y in range(3):
print('外層:', y)
for x in range(3):
print('\t內(nèi)層:', x)
break
print('\t內(nèi)層后')
print('外層后')
外層: 0
內(nèi)層: 0
外層后
外層: 1
內(nèi)層: 0
外層后
外層: 2
內(nèi)層: 0
外層后
了解其他流程控制語(yǔ)法;
- 其他影響流程執(zhí)行的方式還有:
- 結(jié)束程序:
sys.exit(狀態(tài)碼)- 結(jié)束函數(shù)模塊
return 值- 對(duì)象自動(dòng)釋放
with ... : 語(yǔ)句 ...- 異常發(fā)生
try: 語(yǔ)句 ...... catch ...: : 語(yǔ)句 .... finally: 語(yǔ)句 ......
階段應(yīng)用實(shí)戰(zhàn)
- 任務(wù)描述
- 使用循環(huán)與條件實(shí)現(xiàn)集合圖形的輸出
- 使用循環(huán)與條件實(shí)現(xiàn)反復(fù)輸入,直到滿足條件才結(jié)束輸入。
- 顯示系統(tǒng)某個(gè)目錄下的文件列表
- 關(guān)聯(lián)知識(shí)點(diǎn):
- 變量定義
- 輸入語(yǔ)句
- 輸出語(yǔ)句
- 類型轉(zhuǎn)換
- 數(shù)據(jù)運(yùn)算(算術(shù)、比較、邏輯計(jì)算等)
- 循環(huán)控制
- 條件控制
- 循環(huán)中斷控制
- 數(shù)學(xué)思維方式
綜合應(yīng)用實(shí)戰(zhàn)
- 實(shí)現(xiàn)一個(gè)錄入模塊,提示是否繼續(xù)錄入,根據(jù)選擇,來(lái)決定繼續(xù)錄入,還是退出錄入。
-
實(shí)現(xiàn)股票歷史數(shù)據(jù)反復(fù)查詢,并顯示多條歷史數(shù)據(jù)。
查詢系統(tǒng)的界面要求
思考題目
- 判定下面語(yǔ)法是否正確
a = 1
b = 2
a++b
a++++++++b
3


