內置函數的補充,遞歸,以及模塊
1、內置函數的補充
'''
map: 映射
map(函數地址, 可迭代對象) ---> map對象
map會將可迭代對象中的每個值進行修改,而後映射一個map對象中,
能夠再將map對象轉換成列表/元組。(以第一次要轉的類型爲主)
注意: 只能轉一次。
reduce: 合併
reduce(函數地址, 可迭代對象, 初始值默認爲0)
reduce(函數地址, 可迭代對象, 初始值)
filter: 過濾
filter(函數地址, 可迭代對象) --> filter 對象
'''
一、map
用法:map(函數地址,可迭代對象)--->map對象(本質是一個生成器即迭代器)
經過print(list(map對象))顯示或for循環顯示內容,但注意的是這個map對象只可以使用一次,即誰 先用就顯示出來,第二次就沒這個對象了,只可以獲得一個空的值好比()或[]
a、經過list(map對象顯示)
name_list = ['sean', 'egon', 'jason', 'tank', 'yafeng']
map_obj = map(lambda name: name + '666' if name == 'yafeng' else name + '_大寶劍', name_list)#獲得一個map對象
print(map_obj)
>>> <map object at 0x000002855AC051C8>
print(list(map_obj))#map_obj ---> 生成器(迭代器) ----> 返回的是一個map對象
#經過list(map_obj)顯示,,注意不是列表不能直接輸出,能夠經過for循環或者list()來顯示。
>>>['sean_大寶劍', 'egon_大寶劍', 'jason_大寶劍', 'tank_大寶劍', 'yafeng666']
b經過for循環顯示
name_list = ['sean', 'egon', 'jason', 'tank', 'yafeng']
map_obj = map(lambda name: name + '666' if name == 'yafeng' else name + '_大寶劍', name_list)#獲得一個map對象
print(map_obj)
>>><map object at 0x000002855AC051C8>
#也能夠經過for循環來取出內容
ls = []
for i in map_obj:
ls.append(i)
print(ls)
>>>['sean_大寶劍', 'egon_大寶劍', 'jason_大寶劍', 'tank_大寶劍', 'yafeng666']
#值得注意的是該map_obj只能使用一次,用完就沒了,誰先用誰先得,因此若是同時使用後面打印的結果是一個空列表
二、reduce
用法:reduce(函數地址,可迭代對象,起始值)#起始值默認爲0 --->reduce對象
#需求:求1--100的和
#普通方法
sum = 0
for i in range(1, 101):
sum += i
print(sum)
>>>5050
# reduce方法(須要先導入這個模塊纔可使用)
from functools import reduce
res = reduce(lambda x, y: x + y, range(1, 101), 0)
print(res)
>>>5050
#也能夠改變起始值
from functools import reduce
res = reduce(lambda x, y: x + y , range(1, 101), 1000)
print(res)
>>>6050
三、filter(過濾)
用法:filter(函數地址,可迭代對象) ---->filter對象
name_list = ['egon_大寶劍', 'jason_大寶劍',
'sean_大寶劍', 'tank_大寶劍', 'yafeng']
# 需求將後綴爲_大寶劍的名字 「過濾出來」(我要拿到的,不是捨去)
filter_obj = filter(lambda name: name.endswith('_大寶劍'), name_list)
print(filter_obj)#獲得一個filter對象<filter object at 0x0000026E2FD02208>
print(list(filter_obj))#經過列表顯示
>>>['egon_大寶劍', 'jason_大寶劍', 'sean_大寶劍', 'tank_大寶劍']
2、函數遞歸
'''
函數遞歸:
函數遞歸指的是重複 「直接調用或間接調用」 函數自己,
這是一種函數嵌套調用的表現形式。
直接調用: 指的是在函數內置,直接調用函數自己。
間接調用: 兩個函數之間相互調用間接形成遞歸。
瞭解:
面試可能會問:
python中有遞歸默認深度: 限制遞歸次數
998, 1000
PS: 可是在每一臺操做系統中都會根據硬盤來設置默認遞歸深度。
獲取遞歸深度: 瞭解
sys.getrecursionlimit()
設置遞歸深度: 瞭解
sys.setrecursionlimit(深度值)
注意: 單純的遞歸調用時沒有任何意義的。
'''
直接調用: 指的是在函數內置,直接調用函數自己。
def func():
print('from func')
func()
func()
間接調用: 兩個函數之間相互調用間接形成遞歸。
def foo1():
print('from foo1')
foo2()
foo1()
def foo2():
print('from foo2')
foo1()
foo2()
python中有默認的遞歸深度1000(實際上只能到998)
但其實在每一臺操做系統中都會根據硬盤來設置默認遞歸深度
#獲取操做系統資源的模塊
import sys
print(sys.getrecursionlimit())#獲取遞歸深度
#設置遞歸深度
sys.setrecursionlimit(2000)#後面加你想要設置的遞歸深度
#獲取你當前的遞歸深度
num = 1
def func():
global num
print('from func', num)
num += 1
func()
func()
'''
想要遞歸有意義,必須遵循兩個條件:
- 回溯:(*****) 是向下的過程
指的是重複地執行, 每一次執行都要拿到一個更接近於結果的結果,
回溯必要有一個終止條件。
- 遞推:(*****) 是向上的過程
當回溯找到一個終止條件後,開始一步一步往上遞推。
age5 == age4 + 2
age4 == age3 + 2
age3 == age2 + 2
age2 == age1 + 2
age1 == 18 # 回溯終止的結果
# age(n) == age(n - 1) + 2(n>1)
'''
![](https://img2018.cnblogs.com/blog/1843751/201911/1843751-20191115154935595-70744750.jpg)
def age(n):
if n == 1:
return 18
#這裏後面要寫return才能實現遞歸
return age(n - 1) + 2
res = age(5)
print(res)
>>>26
3、模塊
包指的是內部包含__init__.py的文件。
存放模塊,包能夠更好的管理模塊
模塊是一系列功能的結合體
模塊的本質是一個個的.py文件
一、python內置的模塊
如:sys\time\os\turtle
二、第三方的模塊:
如:requests
三、自定義的模塊:
如:本身定義的demo.py
一、使用python編寫的py文件
二、編譯後的共享庫好比c或者是c++庫
三、包下面帶有__init__.py的一組py文件
四、python解釋器下的py文件
模塊能夠幫咱們更好的管理功能代碼,好比:函數
能夠將項目拆分紅一個個的功能,分別存放於不一樣的py文件
鼠標右鍵建立py文件
-在py文件編寫python代碼
-在一個文件中,經過import關鍵字導入模塊
-import 模塊名
# 注意: import 模塊時,模塊不能加.py後綴
在使用模塊階段,需注意,誰是執行文件,誰是被導入文件(模塊)
模塊在首次導入時,就已經固定好了,當前文件查找的順序是先從內存中查到的
一、會先執行當前執行文件,併產生執行文件中的名稱空間
二、當執行到導入模塊的代碼時,被導入的模塊會產生一個模塊的名稱空間
三、會將被導入模塊的名稱空間加載到內存中
as
import 模塊 as 模塊的別名
-import 模塊
-from 包\模塊 import 模塊\(函數名,變量名,類名)
- conf:
- 用於存放配置文件的文件夾
- core:
- 核心業務代碼 .py
- interface:
- 接口, 接口內寫獲取數據前的邏輯代碼,經過後才能獲取數據
- db:
- 用於存放文件數據
- lib:
- 存放公共功能文件
- log:
- 用於存放日誌文件,日誌用於記錄用戶的操做記錄
- bin:
- 裏面存放啓動文件 / - 啓動文件
- readme.txt:
- 項目說明書, 用戶告訴使用者項目的操做