文章目錄
計算控制流
計算機內部運行過程
基本步驟
- 控制器從存儲器中取出程序語句和額外數據;
- 數據齊全的語句交給運算器進行算術或者邏輯運算;
- 運算結果再存回存儲器;
- 控制器確定下一條程序語句,回到步驟1繼續。
控制流:條件分支語句(if)
- 基本要素
1:預設的判斷條件
2:達成條件後執行的語句 - 擴展要素
1:當條件不滿足時執行的語句
2:多條件時哪個滿足執行哪個的條件 - 條件語句
Python中條件分支的實現
if <邏輯表達式>:
<語句塊1>
……
else:
<語句塊2>
if和else都是“保留字”
“邏輯表達式”是指所有運算的結果爲邏輯類型(True或False)的表達式
“語句塊”就是條件滿足後執行的一組語句
冒號表示語句層次
語句塊縮進
各種類型中某些值會自動被轉換爲False,其它值則是True:
None, 0, 0.0, ‘’, [], (), {}, set()
使用elif語句進行判定
if <邏輯表達式1>:
<語句塊1>
elif <邏輯表達式2>:
<語句塊2>
elif <邏輯表達式3>:
<語句塊3>
… …
else:
<語句塊n>
控制流:條件循環(while)
- 讓計算機執行冗長單調的重複性任務
根據需要對一系列操作進行設定次數或者設定條件的重複,這樣的控制流程,就稱作循環結構 - 作用
能持續對大量數據進行處理
在長時間裏對一些未知狀況進行連續監測循環結構 - 基本要素
循環前提和執行語句 - 循環前提的類型
從某個容器或者潛在的數據集中逐一獲取數據項,什麼時候取不到數據項了,循環的前提就消失
只要邏輯表達式計算結果爲真(True),循環的前提就存在,什麼時候邏輯表達式計算結果爲假(False),循環的前提就消失了
- 擴展要素
當循環前提消失,停止執行這組語句的時候,執行一次另一組語句 (但是注意使用break退出就不再執行另外的一組語句)
while <邏輯表達式>:
<語句塊>
break #跳出循環
continue #略過餘下循環語句
<語句塊>
else: #條件不滿足退出循環,則執行
<語句塊>
while、else:保留字
邏輯表達式:指所有運算的結果爲邏輯類型(True或False)的表達式
else 語句塊:一組語句
- 對比下面倆段代碼
n = 5
while n > 0:
n = n - 1
if n < 2:
break
print(n)
else:
print("END")
print("==========")
n = 5
while n > 0:
n = n - 1
if n < 2:
continue
print(n)
else:
print("END")
- 由while處的循環前提判斷結束會執行else語句 但是由break額技術循環不會執行else語句
控制流:迭代循環(for)
- 迭代循環語句
Python語言中的for語句實現了循環結構的一種 (注意else語句和while一樣性質 如果是break退出就不執行)
for <循環變量> in <可迭代對象>:
<語句塊1>
break #跳出循環
continue #略過餘下循環語句
else: #迭代完畢,則執行
<語句塊2>
for循環語法
for、in和else都是“保留字”
可迭代對象表示從這個數據對象中可以逐個取出數據項賦值給“循環變量”
可迭代對象有很多類型,如字符串、列表、元組、字典、集合等,也可以有後面提到的生成器、迭代器等
- 如下面代碼
for n in range(5):
print(n)
print("============")
alist = ["a", 123, "b", 'v']
for m in alist:
print(m)
print("============")
adic = {"name": "listen", "age": 20, "grade": 100}
for k, v in adic.items():
print(k, v)
print("============")
# 這裏的item只是獲取字典的key
for item in adic:
print(item, adic[item])
- range函數
range函數
range(<終點>)
返回一個從0開始到終點的數列 (左閉右開)
range(<起點>,<終點>)
從0以外的任何整數開始構建數列
range(<起點>,<終點>,<步長>)
修改數列的步長,通過將步長設置爲負數能夠實現反向數列
range構建的數列,包含起點整數,而不包含終點整數
- range類型的對象
直接當做序列轉換爲list或者tuple等容器類型
驗證3x+1問題
%從任意一個正整數開始,重複對其進行下面的操作:
%如果這個數是偶數,把它除以 2 ;
%如果這個數是奇數,則把它擴大到原來的 3 倍後再加 1
%你會發現,序列最終總會變成 4, 2, 1, 4, 2, 1, … 的循環。
接下來我們就利用代碼驗證
我們驗證的方式就是 只要這個數字能到1 那麼這個數字就成功驗證3x+1問題
for i in range(1, 1000):
n = i
step = 0
while n != 1:
if n % 2 == 0:
n = n / 2
else:
n = n * 3 + 1
step = step +1
else:
print(i, "是", step, "步")
給定n,計算1+2!+3!+…+n!的值
- 從1~n計算每個數的階乘 然後累加
def func(n):
sum = 0
num = 1
for i in range(1, n + 1):
num *= i
sum += num
return sum
print(func(5))
代碼組織塊
代碼組織:函數(def)
- 定義與調用函數
定義函數
用def語句創建一個函數
用return關鍵字指定函數返回的值
def <函數名> (<參數表>):
<縮進的代碼段>
return <函數返回值> 〉
調用函數 <函數名>(<參數>)
注意括號!
無返回值:<函數名>(<參數表>)
返回值賦值:v = <函數名>(<參數表>)
- 定義一個列表求和函數
def sum_list(alist):
sum_temp = 0
for i in alist:
sum_temp += i
return sum_temp
alist = [10, 20, 30, 40, 50]
sum = sum_list(alist)
print(sum)
變量的作用域
局部變量
在函數內部定義的參數以及變量只在該函數定義範圍內有效,函數外邊無法訪問到
全局變量
在函數外部定義的,作用域是整個代碼段
# 全局變量
num1 = 1
num2 = 2
def addNum():
# 局部變量
num1, num2 = 2, 3
return num1 + num2
print(addNum())
print(num1, num2)
局部變量和全局變量的無故不會互相產生影響
global關鍵字
Python雖然可以在一個函數內部得到某個全局變量的值, 但是無法對這個全局變量的值進行修改(如上面代碼),所以Python會在函數內部創建一個同名的局部變量 使用global關鍵字修飾就可以在函數中改變全局變量的值
num1 = 1
num2 = 2
def addNum():
global num1, num2
num1, num2 = 2, 3
return num1 + num2
print(addNum())
print(num1, num2)
函數小技巧
map()函數
- 有時需要對列表中每個元素做一個相同的處理,得到新列表
例如:所有數據乘以3
所有字符串轉換爲整數
兩個列表對應值相加
map(func, list1,list2…)
函數func有幾個參數,後面跟幾個列表
alist = [1, 2, 3, 4, 5]
blist = [1, 2, 3, 4, 5]
def addNUm(a, b):
return a + b
print(list(map(addNUm, alist, blist)))
匿名函數lambda
- 有時函數只用一次,其名稱也就不重要,可以無需費神去def一個
lambda表達式
返回一個匿名函數
lambda <參數表>:<表達式>
clist = [1, 2, 3, 4, 5]
dlist = [1, 2, 3, 4, 5]
print(list(map(lambda a, b: a + b, clist, dlist)))
代碼組織:函數的參數
形式參數與實際參數
參數:傳入到函數的值
當調用含參數的函數時,這些參數的值會被複制給函數中的對應參數
形式參數(parameter)
函數創建和定義過程中,函數名後面括號裏的參數
實際參數(argument)
函數在調用過程中傳入的參數
形式參數只是代表一個位置、一個變量名
實際參數是一個具體內容,賦值到變量的值
def add(a, b):
return a + b
print(add(1, 2))
定義函數的參數
- 定義函數時,參數可以有兩種
- 一種是在參數表中寫明參數名key的參數,固定了順序和數量的固定參數
def func(key1, key2, key3…):
下面這種較爲特殊 就是給他了一個,默認值 當然如果給key2了實參 默認值就不會存在
def func(key1, key2=value2…)
def printNum(num1, num2, num3=100):
print("num1 = %s, num2 = %s, num3 = %s" % (num1, num2, num3))
printNum("listen", "grade")
- 傳入num3 改變其默認值 並且python中如果使用參數名傳參就可以不管順序
- 如果混用,所有位置參數必須在前,關鍵字參數必須在後
def printNum(num1, num2, num3=100):
print("num1 = %s, num2 = %s, num3 = %s" % (num1, num2, num3))
printNum(num2="grade", num1="listen", num3=90)
2. 一種是定義時還不知道會有多少參數傳入 的可變參數
def func(*args): #不帶key的多個參數
def func(**kwargs): #key=val形式的多個參數 相當於傳入了字典容器
def func_test(*args):
for i in args:
print(i)
func_test(1, 2, 3, 4, "listen")
print("==========")
func_test("a", "b")
def func_test2(**kwargs):
for k, v in kwargs.items():
print(k, v)
func_test2(numa="listen", age=20, grade=100)
print("==========")
func_test2(numa="tom", age=20)
水仙花數判定
- 水仙花數:滿足如果這個數爲m位數,則每個位上的數字的m次冪之和等於它本身
- 結果返回True或者False
- 創建一個函數,接受一個參數max(max>=1000) 調用上題編寫的判斷函數,求 100到max之間的水仙花數
def func_flower(max):
if max <= 100:
return
for i in range(100, max):
a = int(i / 1 % 10) # 個位
b = int(i / 10 % 10) # 十位
c = int(i / 100 % 10) # 百位
if i == (a ** 3 + b ** 3 + c ** 3):
print(i)
func_flower(1000)