Python基礎之函數


一、函數定義

  

  

二、作用:提高代碼的可重用性和可維護性(代碼層次結構更清晰)。

三、函數返回值:

  

四、實例

  

# 定義根據月份,判斷季節的方法.
def get_season(month): if month < 1 or month > 12: return "輸入有誤"
    if month <= 3: return "春天"
    if month <= 6: return "夏天"
    if month <= 9: return "秋天"
    return "冬天"

print(get_season(5)) print(get_season(15)) # 練習:定義檢查列表是否具有相同元素的方法
def is_repeating(list_target): for r in range(len(list_target) - 1): for c in range(r + 1, len(list_target)): if list_target[r] == list_target[c]: return True # 退出方法(可以退出兩層循環)
    return False re01 = is_repeating([3,44,5]) re01 = is_repeating([3,44,5,44]) print(re01) #練習:定義在控制台中顯示直角三角形的函數
def print_triangle(height,char): """ 打印三角型 :param height: 三角形高度 :param char: 組成三角型的字符 :return: """
    for r in range(height): for c in range(r+1): print(char, end="") print() print_triangle(8,"*") print_triangle(5,"#") print_triangle(4,"?") # 練習:定義在控制台中顯示矩形的函數 
def print_rect(r_count,c_count,char): for r in range(r_count):# 0 1 2
        for c in range(c_count):#01234 01234 01234
            print(char,end = "") # 在一行輸出
        print() # 換行
 print_rect(2,3,"*") print_rect(5,2,"#") # 參數:變量 # 函數調用者  告訴 函數定義者的信息

 

# 1. 參照下列代碼,定義判斷是否是奇數的方法. # number = int(input("請輸入整數:")) # if number % 2 == 1: # print("奇數") # else: # print("偶數")

def is_uneven(number): # 方法1:傳統方法
    # if number % 2 == 1:
    # return True
    # else:
    # return False
    # 方法2:條件表達式
    # return True if number % 2 == 1 else False
    # 方法3:bool表達式
    return number % 2 == 1 re = is_uneven(6) print(re)
# 2.參照下列代碼,定義根據月份返回天數的方法. # 要求:考慮2月,如果是閏年返回29天,否則返回28天. # month = int(input("請輸入月份:")) # if month < 1 or month > 12: # print("輸入有誤") # elif month == 2: # print("28天") # elif month == 4 or month == 6 or month == 9 or month == 11: # print("30天") # else: # print("31天")

# 向外返回的結果return,其類型應該統一. # 方法1:傳統方法: # def get_day_by_month(year,month): # if month < 1 or month > 12: # return 0 # elif month == 2: # if year % 4 == 0 and year % 100 != 0 or year % 400 ==0: # return 29 # else: # return 28 # elif month == 4 or month == 6 or month == 9 or month == 11: # return 30 # else: # return 31



# 方法2:定義函數嵌套法+條件表達式精簡代碼

def is_leap_year(year): return year % 4 == 0 and year % 100 != 0 or year % 400 == 0 def get_day_by_month(year, month): if month < 1 or month > 12: return 0 if month == 2: return 29 if is_leap_year(year) else 28
    if month in (4, 6, 9, 11): return 30
    return 31 day = get_day_by_month(2019,13) print(day)
# 3.參照下列代碼,定義獲取最小值方法. # min = list01[0] # for i in range(1, len(list01)): # # 發現更大的,則替換假設的. # if min > list01[i]: # min = list01[i] # print(min)

def get_min(list_target): min = list_target[0] for i in range(1, len(list_target)): if min > list_target[i]: min = list_target[i] return min min = get_min([2, 3, 45, 1, 9, 3]) print(min)
# 4. 定義函數,判斷字符串中存在的中文字符數量. # 中文編碼范圍:0x4E00 ord(字符) 0x9FA5


def get_chinese_char_count(str_target): count = 0 for item in str_target: if 0x4E00 <= ord(item) <= 0x9FA5: count += 1
    return count count = get_chinese_char_count("a你sid你f好ln") print(count)
# 5. 擴展練習(定義函數,返回指定范圍內的素數) # 例如:1--100  


# 方法1:傳統方法 # def get_prime(bengin,end): # list_prime = [] # for number in range(bengin,end+1): # if number < 2: # pass # else: # for i in range(2, number): # if number % i == 0: # break # 如果有結論了,就不需要在和后面的數字比較了 # else: # list_prime.append(number) # return list_prime


# 方法2:自定義函數相互之間嵌套法
def get_prime(bengin, end): """ 生成指定范圍內的所有素數 :param bengin: 開始 :param end: 結束 :return: 范圍內的所有素數 """ list_prime = [] for number in range(bengin, end + 1): if is_prime(number): list_prime.append(number) return list_prime def is_prime(number): """ 判斷是否為素數 :param number: 需要判斷的數 :return: 是不是素數 """
    if number < 2: return False # 不是素數
    # 判斷能否被中間的數字整除
    for i in range(2, number): if number % i == 0: return False # 不是素數
    return True # 是素數
 primes = get_prime(5, 100) print(primes) primes = get_prime(-5, 50) print(primes)

 五、函數重構代碼思想

  

  案例:未重構前代碼如下

  

shang_pin_info = { 101: {"name": "屠龍刀", "price": 10000}, 102: {"name": "倚天劍", "price": 10000}, 103: {"name": "九陰白骨爪", "price": 8000}, 104: {"name": "九陽神功", "price": 9000}, 105: {"name": "降龍十八掌", "price": 8000}, 106: {"name": "乾坤大挪移", "price": 10000} } ding_dan = [] def gou_wu(): """ 購物 :return: """
    while True: item = input("1鍵購買,2鍵結算。") if item == "1": for key, value in shang_pin_info.items(): print("編號:%d,名稱:%s,單價:%d。" % (key, value["name"], value["price"])) while True: cid = int(input("請輸入商品編號:")) if cid in shang_pin_info: break
                else: print("該商品不存在") count = int(input("請輸入購買數量:")) ding_dan.append({"cid": cid, "count": count}) print("添加到購物車。") elif item == "2": zong_jia = 0 for item in ding_dan: shang_pin = shang_pin_info[item["cid"]] print("商品:%s,單價:%d,數量:%d." % (shang_pin["name"], shang_pin["price"], item["count"])) zong_jia += shang_pin["price"] * item["count"] while True: qian = float(input("總價%d元,請輸入金額:" % zong_jia)) if qian >= zong_jia: print("購買成功,找回:%d元。" % (qian - zong_jia)) ding_dan.clear() break
                else: print("金額不足.") gou_wu()

    重構后代碼如下:

    

dict_commodity_info = { 101: {"name": "屠龍刀", "price": 10000}, 102: {"name": "倚天劍", "price": 10000}, 103: {"name": "九陰白骨爪", "price": 8000}, 104: {"name": "九陽神功", "price": 9000}, 105: {"name": "降龍十八掌", "price": 8000}, 106: {"name": "乾坤大挪移", "price": 10000} } list_order = [] def select_menu(): """ 菜單選擇  """
    while True: item = input("1鍵購買,2鍵結算。") if item == "1": buying() elif item == "2": settlement() def settlement(): """ 結算 :return: """ print_order() total_price = get_total_price() pay(total_price) def pay(total_price): """ 支付 :param total_price: 需要支付的價格 :return: """
    while True: money = float(input("總價%d元,請輸入金額:" % total_price)) if money >= total_price: print("購買成功,找回:%d元。" % (money - total_price)) list_order.clear() break
        else: print("金額不足.") def print_order(): """ 打印訂單 :return: """
    for item in list_order: commodity = dict_commodity_info[item["cid"]] print("商品:%s,單價:%d,數量:%d." % (commodity["name"], commodity["price"], item["count"])) def get_total_price(): """ 計算總價 :return: """ total_price = 0 for item in list_order: commodity = dict_commodity_info[item["cid"]] total_price += commodity["price"] * item["count"] return total_price def buying(): """ 購買 :return: """ print_commodity() order = create_order() list_order.append(order) print("添加到購物車。") def create_order(): """ 創建訂單 :return: """
    while True: cid = int(input("請輸入商品編號:")) if cid in dict_commodity_info: break
        else: print("該商品不存在") count = int(input("請輸入購買數量:")) return {"cid": cid, "count": count} def print_commodity(): """ 打印商品 :return: """
    for key, value in dict_commodity_info.items(): print("編號:%d,名稱:%s,單價:%d。" % (key, value["name"], value["price"])) # 程序入口
select_menu()

  注:雖然代碼量變大了,但是在項目編程時,邏輯更清晰,維護更便捷

 

六、函數內存圖示例(即可變/不可變類型在傳參時的區別)

      

    示例1:

    

""" 內存圖1.0 不可變對象傳參 """


def fun01(num01): num01 = 2
    print("num01:" + str(num01))# 2
 number01 = 1
# 調用方法,在內存中開辟空間(棧幀) # 棧幀中定義該方法內部創建的變量 # 方法執行完畢后,棧幀立即釋放.
fun01(number01) print("number01:" + str(number01))# 1

    

     示例2:

      

""" 內存圖2.0 可變對象傳參 """

def fun01(list_target): list_target[0] = 2
    print("list_target[0]:" + str(list_target[0])) list_number = [1,2] fun01(list_number) print("list_number:" + str(list_number[0]))

    

      示例3

      

def fun01(a,b,c): a = 100
    # 修改的是列表對象,
    b[0] = 200
    # 修改的是棧幀中的變量
    c = 300 num01 = 1 list01 = [2] list02 = [3] fun01(num01,list01,list02) print(num01)#? 1
print(list01)#? [200]
print(list02)#? [3]

    

七、2048核心算法:

  

"""
    2048 核心算法:降維
"""

# 練習1:定義函數,將零元素移動到末尾
# [2,0,2,0] --> [2,2,0,0]
# [0,2,2,0]  --> [2,2,0,0]
# [0,4,2,4]  --> [4,2,4,0]


""" 方案1
def zero_to_end(list_target):
    # 1.將傳入的列表中非零元素,拷貝到新列表中.
    # [2, 0, 2, 0] --> [2,2] --> [2,2,0,0]
    # [0, 4, 2, 4]  -->[4, 2, 4] -->[4, 2, 4 ,0]
    # 2. 根據為零元素的數量,在新列表中添加零元素
    # [2, 0, 2, 0] --> [2,2]
    new_list = [item for item in list_target if item != 0]
    # [2, 2] --> [2,2,0,0]
    new_list += [0] * list_target.count(0)
    # 3. 將新列表中元素賦值給傳入的列表
    list_target[:] = new_list
"""
# 方案2
def zero_to_end(list_target):
    # 從后往前判斷,如果零元素,則刪除,在末尾追加零元素
    # [2, 0, 2, 0] --> [2, 2]  --> [2, 2,0,0]
    for i in range(len(list_target) - 1, -1, -1):
        if list_target[i] == 0:
            del list_target[i]
            list_target.append(0)


# list01 = [2, 0, 2, 0]
# zero_to_end(list01)
# print(list01)

# 練習2:定義合並函數
# [2,2,0,0] --> [4,0,0,0]
# [2,0,2,0] --> [4,0,0,0]
# [2,0,0,2] --> [4,0,0,0]
# [2,2,2,0] --> [4,2,0,0]

def merge(list_target):
    # [2,0,2,0] --> [2,2,0,0]       [2,2,2,0]
    zero_to_end(list_target)
    # [2,2,0,0] --> [4,0,0,0]       [4,0,2,0]
    for i in range(len(list_target) -1):
        # 相鄰且相同
        if list_target[i] == list_target[i+1]:
            list_target[i] += list_target[i+1]
            list_target[i+1] = 0
    zero_to_end(list_target)# [4,0,2,0] --> [4,2,0,0]

# list01 = [2,2,2,0]
# merge(list01)
# print(list01)

# 練習3:將二維列表,以表格的格式顯示在控制台中  
list01 = [
    [2,0,0,2],
    [2,2,0,0],
    [2,0,4,4],
    [4,0,0,2],
]
def print_map(map):
    for r in range(len(map)):
        for c in range(len(map[r])):
            print(map[r][c],end = " ")
        print()

# print_map(list01)

#練習4:定義向左移動函數.11:50
"""
    [2,0,0,2]           [4,0,0,0] 
    [2,2,0,0]           [4,0,0,0]
    [2,0,4,4]           [2,8,0,0]
    [4,0,0,2]           [4,2,0,0]
"""
def move_left(map):
    # 獲取第行
    for r in range(len(map)):
        # 從左往右獲取行
        # 交給merge進行合並
        merge(map[r])

def move_right(map):
    # 獲取第行
    for r  in range(len(map)):
        # 從右往左獲取行
        # 交給merge進行合並
        list_merge = map[r][::-1]
        merge(list_merge)
        map[r][::-1] = list_merge

# 作業1:定義向上移動函數
# 從上往下獲取列
# 交給合並方法
# 還給原列

# 作業2:定義向下移動函數
# 從下往上獲取列
# 交給合並方法
# 還給原列

def move_up(list_target):
    list_merge = []
    for c in range(len(list_target[0])):
        for r in range(len(list_target)):
            list_merge.append(list_target[r][c])
        merge(list_merge)
        for r in range(len(list_target)):
            list_target[r][c] = list_merge[r]
        list_merge = []

def move_down(list_target):
    list_merge = []
    for c in range(len(list_target[0])):
        for r in range(len(list_target) - 1, -1, -1):
            list_merge.append(list_target[r][c])
        merge(list_merge)
        for r in range(len(list_target)):
            list_target[r][c] = list_merge[3 - r]
        list_merge = []



# move_left(list01)
# move_right(list01)
# move_up(list01)
move_down(list01)
print_map(list01)

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM