一 阎毅、為什么用函數(shù):
1、 代碼重復(fù)
2点弯、 代碼可描述性不高
3扇调、 代碼太low
函數(shù)是以功能為導(dǎo)向,一個(gè)函數(shù)封裝一個(gè)功能抢肛,函數(shù)減少代碼的重復(fù)性狼钮,增強(qiáng)了代碼的可讀性。
二 雌团、函數(shù)的結(jié)構(gòu)燃领、調(diào)用和返回值
def func():
pass
func()
return:給函數(shù)的執(zhí)行者返回具體的值士聪、在函數(shù)中遇到return直接結(jié)束函數(shù)锦援。
1.函數(shù)中沒(méi)有return或者只有寫一個(gè)return,函數(shù)的執(zhí)行者得到的是None剥悟。
2.函數(shù)中return后面只寫一個(gè)參數(shù) 執(zhí)行者得到的就是這個(gè)參數(shù)(不改變值得類型)
3.return 返回多個(gè)元素 是以元組的形式返回給函數(shù)的執(zhí)行者灵寺。
三 、函數(shù)的傳參
分兩個(gè)角度:實(shí)參区岗、形參略板。
實(shí)參角度:
位置參數(shù) (從左至右,按照順序慈缔,一一對(duì)應(yīng))
關(guān)鍵字參數(shù) (一一對(duì)應(yīng))
混合參數(shù) (位置參數(shù)一定要在關(guān)鍵字參數(shù)的前面叮称。)
形參角度:
位置參數(shù) (與實(shí)參角度參數(shù)一樣)
默認(rèn)參數(shù) (意義:普遍經(jīng)常使用的。一定在位置參數(shù)后面,不傳參數(shù)即沿用默認(rèn)的參數(shù))
動(dòng)態(tài)參數(shù) (*args,**kwargs)
#*代表聚合瓤檐。 他將實(shí)參角度所有的位置參數(shù)聚合成一個(gè)元組赂韵,賦值給了 args
#** 將實(shí)參角度所有的關(guān)鍵字參數(shù)聚合到一個(gè)字典中,將這個(gè)字典賦值給了kwargs
#*的魔性用法:(當(dāng)函數(shù)執(zhí)行時(shí):*代表打散)返回的是元祖
#** 的魔性用法:(當(dāng)函數(shù)執(zhí)行中:**dict 代表打散)返回的是字典
僅限關(guān)鍵字參數(shù)(沒(méi)用)
四 挠蛉、 名稱空間祭示、作用域
全局名稱空間:py文件運(yùn)行時(shí),存放的是執(zhí)行的py文件(除去函數(shù)內(nèi)部)的所有的變量與值(地址)的對(duì)應(yīng)關(guān)系谴古,整個(gè)py文件結(jié)束之后质涛,才會(huì)消失.
臨時(shí)(局部)名稱空間:函數(shù)執(zhí)行時(shí),在內(nèi)存中臨時(shí)開(kāi)辟的一個(gè)空間掰担,存在的函數(shù)中的變量與值得對(duì)應(yīng)關(guān)系汇陆,隨著函數(shù)的結(jié)束而消失.
內(nèi)置名稱空間:print input 內(nèi)置函數(shù)等.
LEGB原則:(從局部找時(shí))局部名稱空間 ---> 全局名稱空間 ---> 內(nèi)置名稱名稱空間
全局作用域:內(nèi)置名稱空間 全局名稱空間
局部作用域:局部名稱空間(局部作用域不能改變?nèi)肿兞?
globals(獲取全局作用域)
locals(獲取當(dāng)前作用域)
global:可以在局部作用域聲明一個(gè)全局變量,也可以更改全局變量
nonlocal:不能夠操作全局變量带饱。(內(nèi)層函數(shù)對(duì)外層函數(shù)的局部變量進(jìn)行修改瞬测。并且在當(dāng)前作用域創(chuàng)建(復(fù)制)一份此變量。)
五 纠炮、迭代器和生成器
內(nèi)部含有__iter__方法的對(duì)象月趟,就是可迭代對(duì)象(dir()判斷是否是可迭代對(duì)象)
內(nèi)部含有__iter__并且含有__next__方法的對(duì)象,就是迭代器(迭代器可以迭代取值恢口。利用next()進(jìn)行取值)
可迭代對(duì)象:可迭代對(duì)象是一個(gè)操作比較靈活孝宗,直觀,效率相對(duì)高耕肩,但是比較占用內(nèi)存的數(shù)據(jù)集因妇。
迭代器:迭代器是一個(gè)非常節(jié)省內(nèi)存,滿足惰性機(jī)制猿诸,但是效率相對(duì)低婚被,操作不靈活的數(shù)據(jù)集。
生成器和迭代器的唯一的區(qū)別:生成器是我們自己用python代碼構(gòu)建的數(shù)據(jù)結(jié)構(gòu)梳虽。迭代器都是提供的址芯,或者轉(zhuǎn)化得來(lái)的。
獲取生成器的三種方式:
生成器函數(shù)
生成器表達(dá)式
python內(nèi)部提供的一些
yield 窜觉、return區(qū)別
return:函數(shù)中只存在一個(gè)return結(jié)束函數(shù)谷炸,并且給函數(shù)的執(zhí)行者返回值。(多個(gè)值通過(guò)元組的形式返回)
yield:只要函數(shù)中有yield那么它就是生成器函數(shù)而不是函數(shù)了禀挫。生成器函數(shù)中可以存在多個(gè)yield旬陡,yield不會(huì)結(jié)束生成器函數(shù),一個(gè)yield對(duì)應(yīng)一個(gè)next语婴。(多個(gè)值以元組的形勢(shì)返回)
yield from 將一個(gè)可迭代對(duì)象的每一個(gè)元素返回給next
yield from 節(jié)省代碼描孟,提升效率(代替了for循環(huán))
六 驶睦、列表表達(dá)式和生成器表達(dá)式
列表推導(dǎo)式:一行代碼構(gòu)建一個(gè)有規(guī)律比較復(fù)雜的列表
1.循環(huán)模式: [變量(加工后的變量) for 變量 in iterable]
2.篩選模式: [變量(加工后的變量) for 變量 in iterable if 條件]
生成器表達(dá)式:與列表推導(dǎo)式一樣(取值用next)
七 、內(nèi)置函數(shù)
Python有68種內(nèi)置函數(shù)
eval() 慎用 eval 剝?nèi)プ址耐庖履湫眩祷乩锩娴谋举|(zhì)
exec() 代碼流啥繁,過(guò)程
hash() 哈希值
help() 幫助
callable() 判斷一個(gè)對(duì)象是否可被調(diào)用
int() 取整數(shù)
bin() 將十進(jìn)制轉(zhuǎn)換成二進(jìn)制并返回
ord() 輸入字符找該字符編碼的位置
chr() 輸入位置數(shù)字找出其對(duì)應(yīng)的字符
repr() 原形畢露
sep 設(shè)定分割符
end 默認(rèn)是換行可以打印到一行
list:創(chuàng)建列表
dict:創(chuàng)建字典
abs() 獲取絕對(duì)值
sum() 數(shù)字相加求和
min 可以加功能 以絕對(duì)值的方式取最小值(可以加匿名函數(shù))
max() 與min 相同。
reversed() 對(duì)一個(gè)可迭代對(duì)象進(jìn)行翻轉(zhuǎn)青抛,返回一個(gè)迭代器
zip 拉鏈方法 返回一個(gè)迭代器
sorted 排序(可以加key)
filter 返回一個(gè)生成器 # 生成器表達(dá)式的篩選模式
map 返回一個(gè)迭代器旗闽,相當(dāng)于生成器表達(dá)式:循環(huán)模式
reduce python3x 從內(nèi)置函數(shù)剔除了。是一個(gè)累加函數(shù)這個(gè)函數(shù)必須接受兩個(gè)參數(shù)蜜另,把結(jié)果繼續(xù)和序列的下一個(gè)元素做累計(jì)算
八 适室、 閉包、裝飾器
閉包有什么作用:封裝東西举瑰、保證數(shù)據(jù)安全
被引用的非全局變量也稱作自由變量捣辆,這個(gè)自由變量會(huì)與內(nèi)層函數(shù)產(chǎn)生一個(gè)綁定關(guān)系,
自由變量不會(huì)再內(nèi)存中消失此迅。
如何判斷一個(gè)嵌套函數(shù)是不是閉包
閉包只能存在嵌套函數(shù)中汽畴。
內(nèi)層函數(shù)對(duì)外層函數(shù)非全局變量的引用(使用),就會(huì)形成閉包耸序。
開(kāi)放封閉原則
裝飾器:在不改變?cè)瘮?shù)的代碼以及調(diào)用方式的前提下忍些,為其增加新功能
標(biāo)準(zhǔn)的裝飾器:
def wrapper(f):
def inner(*args,**kwargs):
'''添加額外的功能:執(zhí)行被裝飾函數(shù)之前的操作'''
ret = f(*args,**kwargs)
''''添加額外的功能:執(zhí)行被裝飾函數(shù)之后的操作'''
return ret
return inner
帶參數(shù)的裝飾器:
def wrapper_out(n):
def wrapper(f):
def inner(*args,**kwargs):
'''添加額外的功能:執(zhí)行被裝飾函數(shù)之前的操作'''
ret = f(*args,**kwargs)
''''添加額外的功能:執(zhí)行被裝飾函數(shù)之后的操作'''
return ret
return inner
@wrapper_out('參數(shù)')
多個(gè)裝飾器裝飾一個(gè)函數(shù):
def wrapper1(func1):
def inner1():
print('wrapper1 ,before func')
func1()
print('wrapper1 ,after func')
return inner1
def wrapper2(func2):
def inner2():
print('wrapper2 ,before func')
func2()
print('wrapper2 ,after func')
return inner2
@wrapper2
@wrapper1
def f():
print('in f')
f()
九 、 遞歸函數(shù)
遞歸的最大深度1000層 : 為了節(jié)省內(nèi)存空間,不要讓用戶無(wú)限使用內(nèi)存空間
一個(gè)遞歸函數(shù)要想結(jié)束,必須在函數(shù)內(nèi)寫一個(gè)return,并且return的條件必須是一個(gè)可達(dá)到的條件
遞歸個(gè)列表里面的列表
l1 = [1, 3, 5, ['上海','北京', 34, [33, 55, [11,33]]], [77, 88],66]
def func(alist):
for i in alist:
if type(i) == list:
func(i)
else:
print(i) #python3
func(l1)