Python全棧(第一期)Day17
阿新 • • 發佈:2018-12-19
今日內容:
一,實戰
# 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
抱歉!列表中找不到!