1. 程式人生 > 其它 >python函式應用

python函式應用

內容概要

  • 遞迴函式
  • 演算法之二分法
  • 三元表示式
  • 列表生成器
  • 字典生成器
  • 列舉
  • 匿名函式

內容詳細

一、遞迴函式

'''遞迴:函式在執行的過程中,直接或者間接呼叫了自身'''

1、遞推:一層層往下推導答案,函式程式碼的複雜程度一定要隨著遞推不斷減小
2、回溯:依據最後的結論往後推匯出最初想要的答案
函式一定要由結束條件,並返回值

# 遞推年齡 虛擬碼
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18

def get_age(n):
    if n == 1:
        return 18
    return get_age(n - 1) + 2


print(get_age(5))  # 26

# 列印列表裡的所有數字
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]
# 1、迴圈列表裡面的值,如果是數字則列印,不是數字則再次迴圈
# 2、注意這是個重複迴圈,而且每次迴圈的物件都不一樣,所以用函式
# 3、當for迴圈迴圈一個空列表的時候會自動正常結束,相當於遞迴函式的結束條件

def get_int(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            get_int(i)
get_int(l)

# 官網表示:python預設的最大遞迴深度為1000次
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))

二、演算法之二分法

# 什麼是演算法?
	解決問題的高效方法


# 在一個元素極多的有序列表裡面判斷一個數字是否存在
# 正常做法,for迴圈整個列表,比對數字,知道找到為止,但如果資料太龐大,會導致程式碼執行過久
# 使用二分法,利用索引找到列表中間的數字,與要找的數字比對大小,如果小了,目標數字則在中間數字的右邊,切片獲取右邊的列表元素,再次用中間值比對,依次類推,知道找到目標數字

list1 = [1, 3, 4, 5, 6, 7, 8, 9, 11, 22, 24, 35, 55, 66, 77, 88, 99, 100, 233, 566, 788, 888]


def get_num(target_number, list):
    index = len(list) // 2

    if list1[index] > target_number:
        l_left = list1[:index]  # 注意這裡是取mid_num中間數的索引值
        get_num(target_number, l_left)
    elif list1[index] < target_number:
        l_right = list1[index + 1:]
        get_num(target_number, l_right)
    else:
        print('找到了', target_number)


get_num(7, list1)

'''
二分法的缺陷:如果要查詢的元素在開頭,那麼還沒有依次查詢的效率高
'''

三、三元表示式

# 當一段程式碼的輸出只有兩種結果的時候可以用三元表示式精簡程式碼
def func(a, b):
    if a > b:
        print(a)
    else:
        print(b)


def func1(a, b):
    print(a if a > b else b)

func1(5, 8)  # 8

'''
條件成立採用if前面的值 if 條件 else 條件不成立採用else後面的值 
'''

四、列表生成式

# 為列表中的每個字串加上'_DSB'
list = ['elijah', 'jason', 'kevin', 'tony']
# list1['%s_DSB' % i for i in list if i != 'jason']  # 錯誤示範
res = ['%s_DSB' % i for i in list]  # 注意不要用錯列表生成器的賦值方式
print(res)  # ['elijah_DSB', 'jason_DSB', 'kevin_DSB', 'tony_DSB']

# 在生成的過程中去掉jason
res1 = [f'{i}_DSB' for i in list if i != 'jason']  # if 後的語句如果條件成立則新增進列表
print(res1)  # ['elijah_DSB', 'kevin_DSB', 'tony_DSB']

五、列舉

# enumerate
list = ['elijah', 'switch', 'zelda']

# enumerate(list) --> [(0, 'elijah'), (1, 'switch'), (2, 'zelda')]
for i, j in enumerate(list):
    print(i, j)
'''
enumerate(list)
	針對該方法使用for迴圈取值,每次會產生兩個結果
		第一個是從0開始的數字
		第二個是被迴圈物件裡面的元素
	還可以通過start來控制起始位置
'''

六、字典生成器

# 把下面兩個列表生成一個字典
list1 = ['elijah', 'switch', 'zelda']
list2 = [2000000, 4500, 500]

res = {j: list2[i] for i, j in enumerate(list1)}

print(res)

七、匿名函式

# 匿名函式關鍵字  lambda
'''
語法格式
	lambda 形參:返回值
'''

lambda x(形參):x**2(返回值)
# 使用
print((lambda x:x**2)(8))  # 64
# 或者把匿名函式賦值給一個變數名
res = lambda x:x**2
res(3)

# 匿名函式一般只是配合其他函式一起使用,沒有函式名
# map()  對映
list1 = [1, 3, 4, 5, 6, 7]
print(map(lambda x: x ** 2, list1))  # <map object at 0x00000265145DA588>
print(list(map(lambda x: x ** 2, list1)))  # [1, 9, 16, 25, 36, 49]