1. 程式人生 > 其它 >遞迴、匿名函式及列表、字典生成式

遞迴、匿名函式及列表、字典生成式

遞迴、匿名函式及列表、字典生成式

1、遞迴函式

# 1、遞迴函式
# 遞迴函式就是函式在執行的時候直接或間接的呼叫函式本身的函式
'''遞迴函式遵循以下兩個原則
    1、遞推:一步步往下推匯出結論,且每推導一次,距離所要追求的結果的距離越近,複雜度都要稍微有所下降
    2、回溯:從推導得到的結果再一步步回傳,直到的得到自己需要的結果
    且遞迴一定要有結束條件
'''


# 練習 1
# 五個同學,第一個比第二個大2歲,第二個比第三個大2歲,依次類推,第五個同學20歲,求第一位同學的年齡
# 首先定義一個函式
# def get_age(n):
#     # 先定義第五個同學是20歲
#     if n == 5:
#         return 20
#     # 從第一位開始,每個同學都比後面大兩歲
#     return get_age(n+1)+2
# 
# res = get_age(1)
# print(res)
# 練習 2
# 用倒序的方式列印列表裡的每一個元素
list = [1,2,3,4,5,6]
count = 5
def index(a):
    if a < 0:
        return
    print(list[a])
    a -= 1
    index(a)
index(count)
# 練習 3 計算age1
# age1 = age2 + 1
# age2 = age3 + 2
# age3 = age4 + 3
# age4 = age5 + 4
# age5 = 20
# 求age1
def get_age(n, a):
    if n == 5:
        return 20
    a += 1
    return get_age(n + 1, a) + a


res = get_age(1, 0)
print(res)
# 練習 4 把下列列表裡的每一個值打印出來,組成新的列表
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]]
# # 定義一個空列表,用於接收元素
new_list = []
# 定義一個函式,打印出列表裡的每一個元素
def get_element(list):
    # 先迴圈列表裡的每一個值
    for line in list:
        # 判斷元素的資料型別
        if type(line) is int:
            new_list.append(line)
        else:
            get_element(line)
    return new_list

res = get_element(l)
print(res)
# 練習 5 生成斐波那契數列
# 定義一個函式用來生成斐波那契數列
def feibo_naqi(n):
    if n <= 1:
        return n
    else:
        return (feibo_naqi(n-1)+feibo_naqi(n-2))

# 定義一個空列表用來接受斐波那契數列
feibo_list = []
# 獲取使用者想要生成的數列個數
numbers = input('輸入你想生成的數列個數:').strip()  # 去除使用者輸入內容的首尾特殊字元
# 把使用者的輸入轉換成整型
numbers = int(numbers)
# 對使用者輸入進行判斷
if numbers < 0:
    # 如果使用者輸入的值小於O,則提示使用者重新輸入
    print('請輸入正數')
else:
    # 如果輸入的是正數,則列印個題標
    print('斐波那契數列',end='')
    # 利用for迴圈獲取斐波那契函式生成的資料
    for i in range(numbers):
        feibo_list.append(feibo_naqi(i))
    print(feibo_list)

2、演算法之二分法

# 演算法
# 所謂演算法就是解決問題的高效方法
'''二分法
    二分法的使用
    當我們在一個很龐大的資料裡找一個我們想要的資料值的時候,採用二分法,先把整個資料分為兩部分
    把左邊最大的值和我們要找的值進行比較,若是大於要找的值,則把左邊部分再分成兩份以此類推
    使用二分法的前提是,所要查詢的資料來源必須是有序的
'''
# 練習,利用二分法從一個列表裡找到一個我們想要的值
digit_list = [12, 23, 34, 45, 56, 67, 78, 89, 90, 123, 234, 345, 567, 789, 899]


# 從上述列表中找到234
# 先定義一個函式方便我們找到我們想要的值
def find_digit(l,n):
    # 先判斷列表是否為空
    if len(l) == 0:
        print('列表為空')
        return
    middle_index = len(l)//2
    if n > l[middle_index]:
        right_list = list(l[middle_index+1:])
        print(right_list)
        return find_digit(right_list,n)
    elif n < l[middle_index]:
        left_list = list(l[:middle_index])
        print(left_list)
        return find_digit(left_list,n)
    else:
        print('找到了')
        return n

res = find_digit(digit_list,234)
print(res)

3、三元表示式

# 三元表示式
# 所謂的三元表示式就是當結果是二選一的情況時,利用三元表示式可以大大減少程式碼量
# 語法結構
'''
if 條件成立時的結果 if 條件 else if條件不成立時返回的結果
'''


res = '歡迎光臨' if int(input('請輸入你的選擇:')) == 1 else '歡迎下次再來'
print(res)

'''
三元表示式一般儘量不要巢狀,會讓程式碼看起來很難理解
'''
print('歡迎光臨') if int(input(':')) == 1 else print('下次再來哦')

4、列表、字典生成式

# 列表生成式
# 列表生成式是為了快速生成一個新的列表
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
# 現要求在列表裡的每個元素後面加上'_nb',但是列表內元素順序不變,且元素用列表儲存
# 方法一:
# 建立一個空列表,把修改後的元素新增到空列表裡
new_list = []
# for迴圈取列表的每一個索引
for i in range(len(name_list)):
    # 把修改後的元素新增到列表裡
    new_list.append('%s_nb' % name_list[i])
# 列印列表
print(new_list)
# 方法二:
# 列表生成式
# 語法結構
'''
變數名 = [i,for i in 列表名 if 條件]
列表生成式的先後執行順序是:
先迴圈從列表裡取出一個元素,然後再根據if後面的條件判斷,把取出的元素拿出來,
迴圈執行上面的步驟,直到把列表裡的所有元素取完為止,然後把拿出來的元素用中括號括起來
!切記,列表生成式裡不能加else判斷語句,因為有for+else和if+else兩種,直譯器會混淆,所以,不能加else條件
'''
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
n = [f'{i}_nb' for i in name_list if i != 'jason']
print(n)
# 字典生成式
# 字典生成式是為了快速的生成一個字典
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
# 把上述列表加上對應的k值生成字典
# 方法一:
# 先建立一個空的字典,通過迴圈列表裡的索引把元素新增到字典裡
new_dic = {}
for i in range(len(name_list)):
    # 把元素新增到字典裡
    new_dic[i] = name_list[i]
# 列印新的字典
print(new_dic)
# 方法二:列舉
# 字典生成式
# 語法結構
'''
enumerate(name_list)
針對該方法迴圈取值,每次都會產生兩個結果
1、預設會從0開始生成數字
2、返回被迴圈列表裡的值
變數名 = {k值:v值 for k v in enumerate(name_list)if 條件}

'''
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
new_dic = {k:v for k,v in enumerate(name_list) if v != 'jason'}
print(new_dic)
# 迭代器
tup = (i for i,j in enumerate(name_list))
print(tup)

5、匿名函式

# 匿名函式
# 所謂匿名函式就是沒有名字的函式
# 語法結構
'''
lambda 形參:返回值
匿名函式一般不單獨使用,常常是和其他函式連用
'''
res = lambda x: x**2
print(res)

l = [1,2,3,4,5,6,7,8,9]
# 把列表裡的每一個值都平方後放進一個新的列表裡
# 方法一:
new_list = []
def index(n):
    for i in n:
        new_list.append(i**2)
    return new_list


res = index(l)
print(res)  # [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 方法二:
# 匿名函式
# 對映函式 map()
'''
對映函式把列表裡的每一個值當成實參傳給匿名函式,最後生成一個列表
'''
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda x: x ** 2, l)))  # [1, 4, 9, 16, 25, 36, 49, 64, 81]