Python~(語言基礎二)計算控制流與代碼組織塊

計算控制流

計算機內部運行過程

基本步驟

  1. 控制器從存儲器中取出程序語句和額外數據;
  2. 數據齊全的語句交給運算器進行算術或者邏輯運算;
  3. 運算結果再存回存儲器;
  4. 控制器確定下一條程序語句,回到步驟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))

定義函數的參數

  • 定義函數時,參數可以有兩種
  1. 一種是在參數表中寫明參數名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)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章