1. 程式人生 > >Python全棧(第一期)Day17

Python全棧(第一期)Day17

今日內容:

一,實戰

# 1.用map來處理字串列表,把列表中所有人都變成sb,比方alex_sb
name = ['alex', 'wupeiqi', 'yuanhao', 'nezha']


# 方法一
def func(item):
    return item+'_sb'
ret = map(func, name)   #ret是迭代器

print(list(ret))


# 方法二
# ret = map(lambda item:item+'_sb',name)
# print(list(ret))
'''
Note:迭代器 和  可迭代 有很大的區別:
eg: for i in 某個可迭代物件  ----> 在這裡此可迭代物件會轉化為迭代器


'''

輸出結果:
[‘alex_sb’, ‘wupeiqi_sb’, ‘yuanhao_sb’, ‘nezha_sb’]

# 2.用filter函式處理數字列表,將列表中所有的偶數篩選出來



num = [1, 3, 5, 6, 7, 8]

#注意有兩種方法
ret1 = filter(lambda x: x % 2 == 0, num)
ret2 = filter(lambda x: True if x % 2 == 0 else False, num)
print(list(ret1))
print(list(ret2))

輸出結果:
[6, 8]
[6, 8]

# 3.隨意寫一個20行以上的檔案
# 執行程式,先將內容讀到記憶體中,用列表儲存。
# 接收使用者輸入頁碼,每頁5條,僅輸出當頁的內容



with open('file.py', encoding='utf-8') as f:
    l = f.readlines()


pages, mod = divmod(len(l), 5)  #求有多少頁,有沒有剩餘的行數
print('整數頁數:{},餘數:{}'.format(pages, mod))

page_num = int(input('請輸入頁碼 : '))


if mod:           # 如果有剩餘的行數,那麼頁數加一
    pages += 1    # 一共有多少頁



if page_num > pages or page_num <= 0:   #使用者輸入的頁數大於總數或者小於等於0
    print('輸入有誤')
elif page_num == pages and mod != 0:    #如果使用者輸入的頁碼是最後一頁,且之前有過剩餘行數
    for i in range(mod):
        print(l[(page_num-1)*5 + i].strip())  #只輸出這一頁上剩餘的行
else:
    for i in range(5):
        print(l[(page_num-1)*5 + i].strip())  #輸出5行

輸出結果:
整數頁數:4,餘數:2
請輸入頁碼 : 5
21.dlfsjklfjkd
22.djlfsdjf

# 4.如下,每個小字典的name對應股票名字,shares對應多少股,price對應股票的價格
portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
]



# 4.1.計算購買每支股票的總價
ret1 = map(lambda dic: {dic['name']: round(dic['shares']*dic['price'], 2)}, portfolio)
print(list(ret1))




# 4.2.用filter過濾出,單價大於100的股票有哪些


# 方法一
# ret2 = filter(lambda k: k if k['price'] > 100 else False, portfolio)

# 方法二
# ret2 = filter(lambda dic: True if dic['price'] > 100 else False, portfolio)

# 方法三
ret2 = filter(lambda dic: dic['price'] > 100, portfolio)
print(list(ret2))

輸出結果:
[{‘IBM’: 9110.0}, {‘AAPL’: 27161.0}, {‘FB’: 4218.0}, {‘HPQ’: 1111.25}, {‘YHOO’: 735.75}, {‘ACME’: 8673.75}]
[{‘name’: ‘AAPL’, ‘shares’: 50, ‘price’: 543.22}, {‘name’: ‘ACME’, ‘shares’: 75, ‘price’: 115.65}]

二,初識遞迴

1,基本定義

#遞迴函式
    # 瞭解什麼是遞迴  : 在函式中呼叫自身函式
        # 最大遞迴深度預設是 997/998 —— 是python從記憶體角度出發做得限制
    # 能看懂遞迴
    # 能知道遞迴的應用場景
    # 初識遞迴 ——
    # 演算法 —— 二分查詢演算法
    # 三級選單 —— 遞迴實現

2,基本實戰

def story():
    print('從前有座山')
    story()
    print(111)

story()

'''
我們能看到一個問題:
    print(111) 根本不會執行----> 一直在開闢新的空間執行story
    等超過最大深度---->所以會報錯:(但是最大深度可以修改)

    #RecursionError: maximum recursion depth exceeded while calling a Python object
    # 遞迴的錯誤,超過了遞迴的最大深度
'''

輸出結果:
從前有座山
從前有座山
從前有座山
從前有座山
從前有座山
從前有座山
從前有座山
從前有座山
從前有座山
。。。。
程式報錯!!!

import sys
sys.setrecursionlimit(2000)
n = 0
def story():
    global n
    n += 1
    print(n)
    story()

story()



# 如果遞迴次數太多,就不適合使用遞迴來解決問題
# 遞迴的缺點 : 佔記憶體
# 遞迴的優點:  會讓程式碼變簡單

輸出結果:
1
2
3
。。。。
1991
1992
1993
1994
1995
1996
1997
1998
程式報錯!!!

3,進階實戰

# alex 多大       n = 1   age(1) = age(2)+2 = age(n+1) + 2
# alex比egon大兩歲
# egon多大?      n = 2   age(2) = age(3) + 2 = age(n+1) +2
# egon比wusir大兩歲
# wusir多大       n = 3   age(3) = age(4) + 2 = age(n+1) +2
# wusir比金老闆大兩歲
# 金老闆多大?
# 金老闆40了      n = 4   age(4) = 40




# n = 4 age(4) = 40
# n <4  age(n) = age(n+1) +2
def age(n):
    if n == 4:
        return 40
    elif n >0 and n < 4:
        return age(n+1) + 2
    
print(age(4))
print(age(3))
print(age(2))
print(age(1))

'''
明白遞迴的本質:

        遞迴 遞迴  先遞後歸  分兩步走

'''

輸出結果:
40
42
44
46

三,二分查詢演算法

case1:不完美

# case1: 找到的下標根本不準確
l = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55,
     56, 66, 67, 69, 72, 76, 82, 83, 88]

def find(l, aim):
    mid_index = len(l) // 2
    if l[mid_index] < aim:
        new_l = l[mid_index+1:]
        find(new_l, aim)
    elif l[mid_index] > aim:
        new_l = l[:mid_index]
        find(new_l, aim)
    else:
        print('找到了', mid_index, l[mid_index])

find(l, 5)

輸出結果:
找到了 0 5

case2:完美的二分法

list1 = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55,
     56, 66, 67, 69, 72, 76, 82, 83, 88]
def find(list, aim, start=0, end=None):
    end = (len(list) - 1) if end is None else end
    mid_index = (end - start)//2 + start
    if start <= end:
        if list[mid_index] < aim:
            return find(list, aim, start=mid_index+1, end=end)
        elif list[mid_index] > aim:
            return find(list, aim, start=start, end=mid_index - 1)
        else:
            return '您要查詢的目標是:{} \n索引值是:{}'.format(list[mid_index], mid_index)
    else:
        return '抱歉!列表中找不到!'




ret = find(list1, 10)
print(ret)

print('0000000000000000000000000000')

ret = find(list1, 9)
print(ret)

輸出結果:
您要查詢的目標是:10
索引值是:3
0000000000000000000000000000
抱歉!列表中找不到!