4.1 if條件判斷陳述句
4.1.1 if條件判斷陳述句單分支
◆單分支格式:if 判斷條件:
陳述句塊1……
else:
陳述句塊2……
?例:name=input('請輸入您的用戶名:')
if name == 'admin':
print('歡迎管理員用戶')
else:
print('歡迎普通用戶')#輸出:請輸入您的用戶名:
?例:num=10
if num>5:
print('請選擇物品進行兌換')
else:
print('積分不足')#輸出:請選擇物品進行兌換
4.1.2 if條件判斷陳述句多分支
◆多分支格式:if 判斷條件1:
陳述句塊1……
elif 判斷條件2:
陳述句塊2……
elif 判斷條件3:
陳述句塊3……
else:
陳述句塊n
?例:name=input('請輸入您的用戶名:')
if name == 'admin':
print('歡迎管理員用戶')
elif name == 'kitty':
print('歡迎kitty用戶')
else:
print('用戶不存在,請注冊')
4.1.3 if條件判斷陳述句的三目運算
◆三目運算基本格式:
name = input('請輸入您的用戶名:')
print ('在上海' if name == 'xiaowang' else '在深圳')
只適用于if條件判斷陳述句的單分支
?例:name = input('請輸入您的用戶名:')
print('香港') if name == '深圳' else print('廣東')#輸出請輸入您的用戶名:
?例:dict={'name':'老六','age':18}
if dict.__contains__('class') is True:
print(dict)
else:
dict['class']=1844
print(dict)#輸出{'name': '老六', 'age': 18, 'class': 1844}
換位三目運算:
→dict={'name':'老六','age':18}
print(dict) if dict.__contains__('class') is True else dict.setdefault('class',1844) and print(dict)
#輸出{'name': '老六', 'age': 18, 'class': 1844}
→dict={'name':'老六','age':18,'class':1999}
print(dict) if dict.__contains__('class') is True else dict.setdefault('class',1844) and print(dict)
#輸出{'name': '老六', 'age': 18, 'class': 1999}
?例:登錄功能實戰練習
→通過輸入函式/輸入用戶名/先判斷用戶名是否正確,用戶名正確則進行密碼判斷
# 如果用戶名錯誤則提示:"用戶名錯誤,請重新輸入"
密碼錯誤則提示"密碼錯誤,請重新輸入密碼"
輸入正確密碼則登錄成功
法1:username = input('請輸入你的用戶名:')
if username == 'admin':
password = input('123456')
if password == '123456':
print('登錄成功')
else:
print('您輸入的密碼有誤,請重新輸入')
else:
print('您輸入的用戶名有誤,請重新輸入')
法2:dict={'username':'admin','password':'123456'}
username=input('請輸入你的用戶名:')
if username==dict.get('username'):
password=input('請輸入你的密碼:')
if password==dict.get('password'):
print('登錄成功')
else:
print('您輸入的密碼有誤,請重新輸入')
else:
print('您輸入的密碼有誤,請重新輸入')
4.1.4 if陳述句之if的嵌套陳述句(if中包含if)
if 判斷條件1:
陳述句塊1
if 判斷條件2:
陳述句塊2
else:
陳述句塊3
else:
陳述句塊4
4.2 while回圈陳述句
◆while陳述句的格式:
while 條件運算式:
回圈體陳述句
◆while什么時候進入回圈?當回圈條件成立時,進入回圈
◆while什么時候退出回圈?當回圈條件不成立時,退出回圈
◆注意:在寫while回圈陳述句時一定要讓回圈條件發生變化,否認很容易陷入死回圈中
?例:使用回圈陳述句求出1—100的和
i=1
j=0
while i<101:
j=i+j
i+=1
print(j)#輸出5050
?例:使用回圈陳述句求出1—100之內的奇數之和
i=1
j=0
while i<=100:
j+=i
i+=2
print(j)#輸出2500
?例:使用回圈陳述句求出1—100之內的奇數之和減去偶數之和的結果
★ i=0
odd=0
even=0
while i<=100:
if i%2==0:
even+=i
else:
odd+=i
i+=1
print(odd-even)#輸出-50
4.3 for回圈陳述句
◆for回圈的語法格式如下:
for ... in ...
陳述句塊
◆遍歷(Traversal):是指沿著某條搜索路線,依次對樹(或圖)中每個節點均做一次訪問,訪問結點所做的操作依賴于具體的應用問題, 具體的訪問操作可能是檢查節點的值、更新節點的值等,不同的遍歷方式,其訪問節點的順序是不一樣的,遍歷是二叉樹上最重要的運算之一,是二叉樹上進行其它運算之基礎,
◆for回圈遍歷
字串、串列、字典、元組、集合均可遍歷,但不可遍歷整型,
1>遍歷字串
str='python'
for i in str:
print(i,end='')#輸出python
2>遍歷串列
list=[1,2,3,4,'a','b']
for i in list:
print(i,end='')#輸出1234ab
3>遍歷元組
tuple=(1,2,3,4,['a','b'])
for i in tuple:
print(i,end='')#輸出1234['a', 'b']
4>遍歷字典
dict={'name':'張三','age':18}
for i,j in dict.items():
print(i,j)#輸出name 張三 age 18
5>遍歷集合
test='python'
set=set(test)
for i in set:
print(i,end='')#輸出npotyh
6>遍歷整型(整型不能遍歷)
test=123
for i in test:
print(i)#TypeError: 'int' object is not iterable
?例:使用for回圈列印出字串hellokitty每個字符以及字符的索引值,并且進行格式化輸出
?str='hello'
for i,j in enumerate(str):
print(j,'對應的索引值是',i)
?str='hello'
for i in str:
print('%s對應的索引值是%d' % (i,str.index(i)))
#輸出h對應的索引值是0
e對應的索引值是1
l對應的索引值是2
l對應的索引值是2
o對應的索引值是4
?str = 'hello'
for i in str:
s=str.index(i)
print('字符:%s 對應的索引值是:%d' % (i, s))
#輸出字符:h 對應的索引值是:0
字符:e 對應的索引值是:1
字符:l 對應的索引值是:2
字符:l 對應的索引值是:2
字符:o 對應的索引值是:4
◆先熟悉下range()函式:如果需要遍歷一個數字序列,可以使用python中內建的函式range()
for i in range (10) #列印0到9、不包含10
for i in range (1,10) #列印1到9、不包含10
for i in range (0,10,2) #列印結果:0,2,4,6,8不包含10
?例:for i in range(10):
print(i)#輸出0123456789 縱向列印
print(i,end='')#輸出0123456789 end=''橫向列印
?例:for i in range(9,0,-1):
print(i)#輸出987654321縱向列印
?例:使用for回圈求1-100的和
sum=0
for i in range(1,101):
sum+=i
print(sum)#輸出5050
?例:使用for回圈求1-100的奇數之和
sum=0
for i in range(1,101,2):
sum+=i
print(sum)#輸出2500
?例:使用for回圈求1-100的偶數之和
sum=0
for i in range(1,101,2):
sum+=i+1
print(sum)#輸出2550
4.4 continue陳述句
◆用法:continue陳述句用來告訴Python跳過當前回圈的剩余陳述句,然后繼續進行下一輪回圈,
?list = [1,2,3,4,5,6,7,8,9]
for i in list:
if i==6:
continue
print (i,end='')
#輸出12345789
?for i in range(10):
if i==5:
continue
print(i,end='')
#輸出012346789
4.5 break陳述句
◆用法:陳述句會立即退出回圈,在其后邊的回圈代碼不會被執行,
?list = [1,2,3,4,5,6,7,8,9]
for i in list:
if i==6:
break
print (i,end='')
#輸出12345
?for i in range(10):
if i==5:
break
print (i,end='')
#輸出 01234
練習:求出1/1+1/3+1/5+...+1/99的和
?i=1
sum=0
for i in range(1,100,2):
sum+=1/i
print(sum)
?i=1
sum=0
while i<100:
sum+=1/i
i+=2
print(sum)
#輸出2.937774848474907
練習:用回圈陳述句計算2-10之間整數的回圈相乘的值
?i=2
sum=1
while i<11:
sum*=i
i=i+1
print(sum)
?sum=1
for i in range(2,11):
sum*=i
print(sum)#輸出3628800
4.6 排序方法
Python基本排序方法:選擇排序、插入排序、冒泡排序、快速排序、希爾排序、歸并排序、堆排序、基數排序、計數排序、桶排序,
4.6.1 冒泡排序
◆冒泡排序(Bubble Sort):是一種簡單直觀的排序演算法,它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,走訪數列的作業是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成,這個演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端,【這個演算法的來由是因為越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序),如同氣泡一樣最侄訓浮到液體頂端,故名冒泡排序,】
◆演算法思路:
從前到后(即下標較小的元素開始)依次比較相鄰元素的值,若發現比后一個值大,則交換位置,使值較大的元素逐漸從前向后移動

★例:
import numpy as np#匯入numpy整個模塊,并指定別名為np
pop_list = np.random.randint(100,size=6)#從0到100隨機取六位數【random()回傳隨機生成的一個實數,注意:random()是不能直接訪問的,需要匯入 random 模塊,然后通過 random 靜態物件呼叫該方法,random.randint() 方法回傳指定范圍內的整數】
count=len(pop_list)#使用len函式獲取串列長度
for i in range(count-1):#串列長度減一,控制回圈次數
for j in range(count-i-1):#控制索引取值范圍
if pop_list[j]>pop_list[j+1]:
pop_list[j],pop_list[j+1]=pop_list[j+1], pop_list[j]
print('排序好之后的位置為:',pop_list)
#輸出'排序好之后的位置為: [ 4 6 7 35 62 69]'
4.6.2 遞回方法
◆遞回方法(recursion algorithm):在數學與計算機科學中,是指在函式的定義中使用函式自身的方法,【遞回就是一個函式在它的函式體內呼叫它自身】
4.6.2.1 遞回的組成部分
◆終止條件:回傳函式值,以防止進入一直呼叫函式的無限遞回中,如果沒有了遞回條件,函式就變成了無限呼叫)
◆遞回步驟:遞回函式每步引數之間的關聯
第一步:找出終止條件:當時間是最后一天,即第十天結束
第二步:確定遞回步驟:今天桃子的數量除以2再減去1,就是明天桃子的數量
第三步:將公式進行變形,再更換成具體天數
今天桃子的數量/2-1=明天桃子的數量,
今天桃子的數量=(明天桃子的數量+1)*2
第1天桃子數量=(第2天桃子數量+1)*2
第2天桃子數量=(第3天桃子數量+1)*2 .......
第四步:創建一個函式并將函式引數設定為天數
每次呼叫函式時進行天數的判斷,如果天數達到終止條件,則直接設定桃子的數量為1
如果不是第十天即不是最后一天,需要根據遞回步驟公式進行計算
?【例】猴子吃桃:第一天猴群吃掉了桃子所有的1/2又多一個,第二天猴群吃掉了剩余桃子的1/2又多一個,按照這樣的吃法,直到第10天,猴群發現只剩下一個桃子,問猴子一共摘了多少只桃子?
#for回圈陳述句求解 x=1
for i in range(1,10):
x=(x+1)*2
print('猴子一共摘桃子總數為:',x)
#while陳述句求解
x=0
y=1
d=9
while d>0:
x=(y+1)*2
y=x
d-=1
print(x)
#輸出猴子一共摘桃子總數為: 1534
#遞回方法求解
def peach(day):
if day==10:
num=1
else:
num=(peach(day+1)+1)*2
return num
print(peach(1))#輸出1534
?例:遞回的階乘>>求5!
def fn(num):
if num==1:
return 1#滿足終止條件直接回傳1
else:
return num*fn(num-1)
print(fn(5))#輸出120
遞回程序(為了明確遞回程序,現對5!進行程序分解)
def p(n):
if n==0:
return
print('遞回前->',n)
p(n-1)
print('遞回后->',n)
p(5)
fn(5) #第1次呼叫使用5
5*fn(4) #第2次呼叫使用4
5*(4*fn(3)) #第3次呼叫使用3
5*(4*(3*fn(2))) #第4次呼叫使用2
5*(4*(3*(2*fn(1)))) #第5次呼叫使用1
5*(4*(3*(2*1))) #從第5次呼叫回傳
5*(4*(3*2)) #從第4次呼叫回傳
5*(4*6) #從第3次呼叫回傳
5*24 #從第2次呼叫回傳
120 #從第1次呼叫回傳
★注意:當num = 998時能輸出正確答案,但當num=999及更大數字時,就出現下面的錯誤了:
RecursionError: maximum recursion depth exceeded in comparison
這是由于默認的Python有一個可用的遞回深度的限制,以避免耗盡計算機中的記憶體,默認是999,
?例:1,1,2,3,5,8,13,21,34,55,試判斷數列第十五個數是哪個?
def f(n):
if n<=2:
v=1
return v
else:
v=f(n-1)+f(n-2)
return v
print(f(15))#輸出610
4.6.2.2 遞回演算法主要應用范圍
遞回演算法一般用于解決三類問題:
(1)資料的定義是按遞回定義的,(比如Fibonacci函式)
(2)問題解法按遞回演算法實作,(回溯)[]
(3)資料的結構形式是按遞回定義的,(比如樹的遍歷,圖的搜索)
4.6.2.3 遞回的特點
1、必須有一個明確的結束條件
2、每次進入更深一層遞回時,問題規模(計算量)相比上次遞回都應有所減少
3、遞回效率不高,遞回層次過多會導致堆疊溢位(在計算機中,函式呼叫是通過堆疊(stack)這種資料結構實作的,每當進入一個函式呼叫,堆疊就會加一層堆疊幀,每當函式回傳,堆疊就會減一層堆疊幀,由于堆疊的大小不是無限的,所以,遞回呼叫的次數過多,會導致堆疊溢位)
【拓展】
堆疊作為一種資料結構,是一種只能在一端進行插入和洗掉操作的特殊線性表,它按照后進先出的原則存盤資料,先進入的資料被壓入堆疊底,最后的資料在堆疊頂,需要讀資料的時候從堆疊頂開始彈出資料(最后一個資料被第一個讀出來),堆疊具有記憶作用,對堆疊的插入與洗掉操作中,不需要改變堆疊底指標,
堆疊是允許在同一端進行插入和洗掉操作的特殊線性表,允許進行插入和洗掉操作的一端稱為堆疊頂(top),另一端為堆疊底(bottom);堆疊底固定,而堆疊頂浮動;堆疊中元素個數為零時稱為空堆疊,插入一般稱為進堆疊(PUSH),洗掉則稱為退堆疊(POP),堆疊也稱為先進后出表,
堆疊可以用來在函式呼叫的時候存盤斷點,做遞回時要用到堆疊,
以上定義是在經典計算機科學中的解釋,
在計算機系統中,堆疊則是一個具有以上屬性的動態記憶體區域,程式可以將資料壓入堆疊中,也可以將資料從堆疊頂彈出,在i386機器中,堆疊頂由稱為esp的暫存器進行定位,壓堆疊的操作使得堆疊頂的地址減小,彈出的操作使得堆疊頂的地址增大,
堆疊在程式的運行中有著舉足輕重的作用,最重要的是堆疊保存了一個函式呼叫時所需要的維護資訊,這常常稱之為堆疊幀或者活動記錄,堆疊幀一般包含如下幾方面的資訊:
1.函式的回傳地址和引數
2. 臨時變數:包括函式的非靜態區域變數以及編譯器自動生成的其他臨時變數,

堆疊的模型
4.6.2.4 遞回優缺點
?優點:遞回使代碼看起來更加整潔、優雅;可以用遞回將復雜任務分解成更簡單的子問題;使用遞回比使用一些嵌套迭代更容易
?缺點:遞回的邏輯很難除錯、跟進;遞回演算法解題的運行效率較低,在遞回呼叫的程序當中系統為每一層的回傳點、區域量等開辟了堆疊來存盤,遞回次數過多容易造成堆疊溢位等,
★遞回函式就是把每次的呼叫壓入到堆疊里面,當你呼叫p(5)時,我們會把p(5)壓到堆疊里面,因為前面有遞回的流程,遞回流程還沒有結束.p(5)等待,接著呼叫p(4)、p(3)、p(2)、p(1),當呼叫到p(1)時,遞回前面到遞回前面的部分還是會被列印出來,緊接著就p(n-1),也就是1-1=0滿足了終止條件,遞回結束,堆疊的話是后進先出的,先會執行p(1)....最后執行p(6)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/502458.html
標籤:其他
下一篇:漫談測驗成長之探索——缺陷分析
