午夜精品人妻久久久-成年美女很黄的网站-在线看片免费人成视久网app-国产精品美女无遮挡一区二区-91精品国产综合久久久久-国产的免费视频又猛又爽又刺激-在线看片免费人成视久网app-久久香蕉国产精品视频-av一区二区三区高清

?程序的三種基本控制結(jié)構(gòu)

程序的三種基本控制結(jié)構(gòu)
程序的三種基本控制結(jié)構(gòu)
程序有三種基本的控制結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu) 。
順序結(jié)構(gòu):

?程序的三種基本控制結(jié)構(gòu)

文章插圖
選擇結(jié)構(gòu)(分支結(jié)構(gòu)):
?程序的三種基本控制結(jié)構(gòu)

文章插圖
循環(huán)結(jié)構(gòu):
?程序的三種基本控制結(jié)構(gòu)

文章插圖
3.1 條件語句
條件語句是通過判斷條件是否成立,根據(jù)條件表達(dá)式的結(jié)果做出決策,控制不同代碼塊的執(zhí)行 。
3.1.1 條件表達(dá)式
條件表達(dá)式由運(yùn)算符和操作數(shù)組成
例如:a<4,其中a、4都是操作數(shù),小于符號<是運(yùn)算符
判斷條件可以是具有布爾屬性的任意元素 , 包括數(shù)據(jù)、變量或由變量與運(yùn)算符組成的表達(dá)式,若其布爾屬性為True,條件成立;若布爾屬性為False,條件不成立 。
除了非空常量外 , Python還常使用關(guān)系操作符和成員運(yùn)算符構(gòu)成判斷條件。
條件表達(dá)式常用的運(yùn)算符有:
算術(shù)運(yùn)算符:+、-、*、/、//、%、**
關(guān)系運(yùn)算符:
?程序的三種基本控制結(jié)構(gòu)

文章插圖
Python支持通過保留字not、and和or對判斷條件進(jìn)行邏輯組合:
not,表示單個條件的“否”關(guān)系 。如果“條件”的布爾屬性為True,“not 條件”的布爾屬性就為False;如果“條件”的布爾屬性為False,“not 條件”的布爾屬性就為True 。and,表示多個條件之間的“與”關(guān)系 。當(dāng)且僅當(dāng)使用and連接的所有條件的布爾屬性都為True時 , 邏輯表達(dá)式的布爾屬性為True , 否則為False 。or , 表示多個條件之間的“或”關(guān)系 。當(dāng)且僅當(dāng)使用or連接的所有條件的布爾屬性都是False時,邏輯表達(dá)式的布爾屬性為False,否則為True 。3.1.2 單分支選擇結(jié)構(gòu)
?程序的三種基本控制結(jié)構(gòu)

文章插圖
若if語句中的判斷條件成立,執(zhí)行if語句后的代碼段;若判斷條件不成立 , 則跳過if語句后的代碼段 。單分支結(jié)構(gòu)中的代碼段只有“執(zhí)行”與“跳過”兩種情況 。
示例:使用單分支結(jié)構(gòu)判斷當(dāng)天是否是星期天 。
day = int(input("今天是工作日嗎(請輸入整數(shù)1~7)?"))
if day in [1,2,3,4,5]:
print("今天是工作日 。")
if day in [6,7]:
print("今天非工作日 。")3.1.3 雙分支選擇結(jié)構(gòu)
?程序的三種基本控制結(jié)構(gòu)

文章插圖
若if語句中的判斷條件成立 , 執(zhí)行代碼段1若判斷條件不成立,則執(zhí)行代碼段2
示例:使用二分支結(jié)構(gòu)判斷當(dāng)天是否是工作日 。
day = int(input("今天是工作日嗎(請輸入整數(shù)1~7)?"))
if day in [1,2,3,4,5]:
print("今天是工作日 。")
else:
print("今天非工作日 。")3.1.4 多分支選擇結(jié)構(gòu)
?程序的三種基本控制結(jié)構(gòu)

文章插圖

?程序的三種基本控制結(jié)構(gòu)

文章插圖
3.1.5 選擇結(jié)構(gòu)的嵌套
選擇結(jié)構(gòu)的嵌套是指選擇結(jié)構(gòu)的內(nèi)部包含選擇結(jié)構(gòu)
?程序的三種基本控制結(jié)構(gòu)

文章插圖

?程序的三種基本控制結(jié)構(gòu)

文章插圖
3.1.6 三元表達(dá)式
python中沒有c語言中的三目運(yùn)算符,但是可以通過以下的形式實(shí)現(xiàn)三目運(yùn)算符的功能
格式:條件判斷為真時的結(jié)果 if 判斷條件 else 條件為假時的結(jié)果
示例:x=x-1 if x>0 else x=x+1
等價于:
if x > 0:
x = x - 1
else:
x = x + 1
我們可以利用三元表達(dá)式來實(shí)現(xiàn)裴波那契數(shù)列:
def fun(n):
return n if n < 2 else fun(n - 1) + fun(n - 2)
還有一種用法,用bool方法選擇相應(yīng)的值,例如:
x = 1
print([2, 3][bool(x)])
x = 0
print([2, 3][bool(x)])
結(jié)果:
3
23.2 循環(huán)語句
在實(shí)際應(yīng)用中有些需要重復(fù)進(jìn)行的操作,可以用循環(huán)語句實(shí)現(xiàn) 。
循環(huán)語句有:
while、do while、for3.2.1 while循環(huán)
?程序的三種基本控制結(jié)構(gòu)

文章插圖
若循環(huán)條件為True,則循環(huán)執(zhí)行while循環(huán)中的代碼段;若循環(huán)條件為False,終止while循環(huán) 。若while循環(huán)的條件總是True,這種情況叫做死循環(huán)。
例如:使用while循環(huán)實(shí)現(xiàn)計算n的階乘
n = int(input("請輸入一個整數(shù):"))
fact = 1
i = 1
while i<= n:
fact = fact*i
i = i + 1
print("n!={}".format(fact))3.2.2 while else循環(huán)
Python的while循環(huán)也支持使用保留字else產(chǎn)生分支 。
示例2:使用while-else循環(huán)實(shí)現(xiàn)計算n的階乘
n = int(input("請輸入一個整數(shù):"))
fact = 1
i = 1
print("n!計算中……")
while i<= n:
fact = fact*i
i = i + 1
else:
print("n!計算完成,循環(huán)正常結(jié)束")
print("n!={}".format(fact))3.2.3 for 循環(huán)
?程序的三種基本控制結(jié)構(gòu)

文章插圖
目標(biāo)可以是字符串、文件、range()函數(shù)或組合數(shù)據(jù)類型等;循環(huán)變量用于保存本次循環(huán)中訪問到的遍歷結(jié)構(gòu)中的元素;for循環(huán)的循環(huán)次數(shù)取決于遍歷的目標(biāo)元素個數(shù) 。
示例1:遍歷字符串中的每個字符
string = input("請輸入一個字符串:")
for c in string:
print(c)3.2.4 for else循環(huán)
for....else循環(huán)的具體實(shí)現(xiàn)形式:
for 循環(huán)變量 in 目標(biāo):
循環(huán)體
else:
代碼塊
用法與while...else相同,如果循環(huán)體結(jié)束后沒有碰到break語句 , 就會執(zhí)行else語句塊,如果結(jié)束之前碰到了break語句,就會跳出整個for循環(huán),因此else語句塊也就不會執(zhí)行 。
3.3 循環(huán)控制語句
·在循環(huán)語句中 , 有時候需要達(dá)到中斷循環(huán),或者跳過本次循環(huán),執(zhí)行下次循環(huán)的情況 , 因此就需要有循環(huán)控制語句
python中使用break、continue語句控制循環(huán)的執(zhí)行過程
break用于跳出整個循環(huán)
continue用于跳出本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)3.3.1 break語句
?程序的三種基本控制結(jié)構(gòu)

文章插圖

?程序的三種基本控制結(jié)構(gòu)

文章插圖
3.3.2 continue語句
?程序的三種基本控制結(jié)構(gòu)

文章插圖

?程序的三種基本控制結(jié)構(gòu)

文章插圖
3.3.3 pass語句
pass的意思是過 , pass掉就是淘汰掉的意思 。
在python中,pass的意思是空語句,pass語句不做任何事情 , 只是為了保持程序結(jié)構(gòu)的完整性 。
3.4 迭代器
迭代器是訪問集合元素的一種方式 。迭代器從集合的第一個元素開始訪問,直到所有的元素被訪問完才結(jié)束 。
3.4.1 可迭代對象
可迭代對象和迭代器是不同的概念 。
python中,如果一個對象有iter() 和getitem()方法 , 則稱這個對象為可迭代對象 。
python中,用內(nèi)置函數(shù)dir(),查看對象的屬性、方法列表 。
例如 , 打印出元組對象的屬性和方法:
list_temp = ('a', 'b', 'c')
print(dir(list_temp))
輸出:
'__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '_ getitem`', 'getnewargs', 'gt', 'hash', 'init', 'initsubclass', '`iter`', 'le', 'len', 'lt', 'mul', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'rmul', 'setattr', 'sizeof', 'str', 'subclasshook__', 'count', 'index'] `
列表、元組、字典、字符串等數(shù)據(jù)類型都是可迭代的(這里注意集合不是可迭代對象)
例如,打印出集合對象的屬性和方法:
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
當(dāng)然,自定義的類中只要實(shí)現(xiàn)了iter() 和getitem()方法 , 就也是可迭代的 。
iter() :作用讓對象可循環(huán)遍歷
getitem():作用是可通過實(shí)例名[index]方式訪問實(shí)例中的元素3.4.2 迭代器的定義
在python中 , 如果一個對象有iter()和next()方法,則稱這個對象時迭代器 。
其中next()方法的作用是讓對象可通過該next(實(shí)例名)訪問下一個元素
列表、元組、字典、字符串等數(shù)據(jù)類型是可迭代的 , 但是都不是迭代器 , 因?yàn)槎紱]有next()方法 。
是不是迭代器 , 也可以通過python內(nèi)置函數(shù)isinstance進(jìn)行測試
例如:
from collections import Iterable
from collections import Iterator
# 列表、元組、字典、字符串都是可迭代的
print(isinstance([], Iterable))
print(isinstance((), Iterable))
print(isinstance({}, Iterable))
print(isinstance('', Iterable))
# 列表、元組、字典、字符串都不是迭代器
print('-----------------------')
print(isinstance([], Iterator))
print(isinstance((), Iterator))
print(isinstance({}, Iterator))
print(isinstance('', Iterator))
輸出:
True
True
True
True
-----------------------
False
False
False
False
迭代器都是可迭代的,但可迭代的不一定是迭代器
迭代器和可迭代對象的區(qū)別:
可迭代對象中提前存儲了所有的元素 , 而迭代器只有迭代到某個元素的時候,該元素才生成,迭代前可以不存在,迭代后可以銷毀 , 因此,迭代器在處理大量數(shù)據(jù)或無限數(shù)據(jù)時,具有加載數(shù)據(jù)快,內(nèi)存占用小的優(yōu)點(diǎn) 。3.4.3 迭代器的創(chuàng)建
1、內(nèi)建工廠函數(shù)
內(nèi)建工廠函數(shù)iter返回一個迭代器,可以將可迭代對象轉(zhuǎn)換為迭代器,例如:
a = [5, 6, 7, 8]
b = ('m', 'n', 'k')
c = 'hello'
print(iter(a))
print(iter(b))
print(iter(c))
d = iter(a)
print(next(d))
print(next(d))
print(next(d))
結(jié)果:
567還有自定義迭代器 , 用的不是太多 , 這里就不講了 , 用到的時候再講 。
3.5 生成器
列表在創(chuàng)建的時候會將所有的元素全部創(chuàng)建好 , 再供用戶使用,那如果你的元素有幾十億個 , python就要在內(nèi)存中開辟足夠的空間存儲 , 這就有可能導(dǎo)致內(nèi)存不夠的問題 。如果只需要訪問前面幾個數(shù)據(jù),那后面的絕大多數(shù)元素占用的空間就浪費(fèi)了 。
為了解決這種問題,python引入了生成器,根據(jù)事先設(shè)計好的規(guī)則開辟內(nèi)存空間,創(chuàng)建對象供用戶使用 。
3.5.1 生成器的定義
生成器是一種特殊的迭代器,通過調(diào)用一個返回迭代器的函數(shù)yield來實(shí)現(xiàn)迭代操作 。yeild相當(dāng)于為函數(shù)封裝了iter()和next() 。
3.5.2 生成器的創(chuàng)建
1、使用列表推導(dǎo)式定義列表
與列表推導(dǎo)式類似,只不過是[]換成()
# 使用列表推導(dǎo)式定義列表
list_a = [x for x in range(10)]
print(list_a)
# 使用生成器推導(dǎo)式定義生成器
generator_b = (x for x in range(10))
print(generator_b)
print(next(generator_b))
print(next(generator_b))
print(next(generator_b))
print('---------------------')
for n in generator_b:
print(n)
輸出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object
at 0x0000020D6D54ECA8>012---------------------34567892、使用yeild關(guān)鍵字
如果一個函數(shù)的定義中包含yeild關(guān)鍵字,那這個函數(shù)就不再是一個簡單的函數(shù)了,而是一個生成器 。
舉個例子,生成裴波那契數(shù)列的函數(shù)如下:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
fib(10)
輸出:
1
1
2
3
5
8
13
21
34
55
如果將代碼中的print(b)換成yeild(b),則這個fib函數(shù)就編程了生成器:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield (b)
a, b = b, a + b
n = n + 1
f = fib(10)
print(f)
for i in f:
print(i)
結(jié)果:
1
1
2
3
5
8
13
21
34
55
3.6 與條件語句、循環(huán)語句相關(guān)的內(nèi)置函數(shù)3.6.1 range函數(shù)
range的作用是返回一個可迭代對象,規(guī)則如下:
range([star,]end[,step])
其中star是初始位置 , 默認(rèn)從0開始,end是結(jié)束位置 , 但不包含end,計算區(qū)間是[star,end),step是步長,step也可以為負(fù)數(shù),反向遍歷,range對象可用list轉(zhuǎn)換成列表 。
a = range(10)
print(a)
b = list(range(5))
print(b)
print(list(range(1, 8, 2)))
print(list(range(8, 1, -2)))
結(jié)果:
range(0, 10)
[0, 1, 2, 3, 4]
[1, 3, 5, 7]
[8, 6, 4, 2]3.6.2 enumerate函數(shù)
enumerate函數(shù)返回的是一個enumerate對象 , 作用是枚舉可迭代對象的每一個元素 , 將他們組成一個索引序列,可以同時獲得索引和值 。
a = list(range(9, 1, -2))
print(a)
b = enumerate(a)
print(b)
for index, value in b:
print(index, value)
結(jié)果:
[9, 7, 5, 3]
0 91 72 53 33.6.3 reversed函數(shù)
reversed作用是進(jìn)行反向遍歷,該函數(shù)可接收各種序列(元組、列表、字符串、區(qū)間等),然后返回一個反向的課迭代對象,需注意該函數(shù)對參數(shù)本身沒有影響 。
a = list(range(9, 1, -2))
print(a)
b = reversed(a)
print(b)
c = list(reversed(a))
print(c)
結(jié)果:、
【?程序的三種基本控制結(jié)構(gòu)】[9, 7, 5, 3]
[3, 5, 7, 9]但是需要注意,如果第二次再使用reversed的,則會返回空置 。
3.6.4 zip函數(shù)
zip函數(shù)將多個可迭代對象打包乘一個元組,返回個zip對象
list_1 = ['a', 'b', 'c']
list_2 = [1, 2, 3]
print(list(zip(list_1)))
print('----------------')
a = zip(list_1, list_2)
print(a)
print(list(a))
print('----------------')
for (x, y) in zip(list_1, list_2):
print(x, y)
結(jié)果:
[('a',), ('b',), ('c',)]
----------------
[('a', 1), ('b', 2), ('c', 3)]----------------a 1b 2c 33.6.5 *zip函數(shù)
*zip是zip函數(shù)的反過程 , 將zip對象還原為組合前的數(shù)據(jù)
list_1 = ['a', 'b', 'c']
list_2 = [1, 2, 3]
a = zip(list_1, list_2)
print(a)
print(list(a))
c, d = zip(*zip(list_1, list_2))
print(c)
print(d)
結(jié)果:
[('a', 1), ('b', 2), ('c', 3)]
('a', 'b', 'c')
(1, 2, 3)
3.6.6 sorted函數(shù)
sorted函數(shù)可以對所有的可迭代對象進(jìn)行排序,返回的是一個新的可迭代對象,而不是在原來的基礎(chǔ)上進(jìn)行操作 。
list_1 = ['c', 'b', 'a']
print(list_1)
print(id(list_1))
b = sorted(list_1)
print(id(b))
print(b)
結(jié)果:
['c', 'b', 'a']
3044259629704
3044276555912
['a', 'b', 'c']
需注意sort和sorted的區(qū)別,sort主要用于列表,而sorted對所有課迭代對象都起作用 。
3.7 總結(jié)
本章介紹了python中的選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu) , 又介紹了迭代器和生成器,最后介紹了一些python的內(nèi)置函數(shù) 。