函數進階(一)
1.命名空間
本質:存放名字與值的綁定關系
命名空間的分類:(1)全局命名空間(變量)->位於函數體外
(2)局部命名空間(變量)->位於函數體內或函數體上
(3)內置命名空間 (變量)->python解釋器自帶
局部變量的使用:
a.全局使用,可以用globals申明相當於全局變量,也可以通過return來返回,同時在函數外部接收就可以使用(閉包函數的引用)
b.局部使用,直接內部調用即可
三種命名空間的加載與取值順序:
加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中,從上到下加載)->局部命名空間(程序運行時,調用時加載)
取值:
在局部調用:局部命名空間->全局命名空間->內置命名空間
在全局調用:全局命名空間->內置命名空間
ps:在全局引用變量x
x=1 def func(x): print(x) f(10) print(x)
2.作用域
分類:
a.局部作用域(globals)
b.全局作用域(locals)
#小範圍的可以用大範圍的,但是大範圍的不能用小範圍的
#範圍從大到小
#在小範圍內,如果要用一個變量,是當前這個小範圍有的,就用自己的;如果在小範圍內沒有,就用上一級的,如果上一級沒有,就用上上級的,如果都沒有,則報錯。
函數嵌套(支持多層嵌套、多層並行):
(1)格式:def 外部函數名():
def 內部函數名1():
def 內部函數名2():
def 內部函數名3():
return 內部函數名1
return 內部函數名2,內部函數名3
(2)調用:
變量名1 = 外部函數名() 此時接收到return返回的內部函數名1(即變量名1 = 內部函數名1)可通過變量名1()來調用內部函數1
變量名2,變量名3 = 變量名1() 此時接收到return返回的內部函數名2,內部函數名3(即變量名2 = 內部函數名2,變量名3=內部函數名3)可通過變量名2()來調用內部函數2,變量名3()來調用內部函數3
(3)層級:函數內部可以嵌套多層函數
(4)個數:在同一層級可以有多個函數並行,返回值和多個變量的返回一致(可以以元祖形式進行返回,也可以通過解壓縮的方式)
閉包函數(可以有多級包):
基礎:閉包函數基於嵌套函數(閉包函數屬於嵌套函數的一種)
產生條件:
a.必須為內部函數
b.對外部作用域的引用(外部作用域不包括全局作用域,只限於在本層函數之外最外層函數之內的作用空間)
特點:
a.延遲計算(惰性計算,不調用不計算)
b.自帶作用域(作用域範圍:本層函數之外全局作用域之內)
證明:
print(閉包函數的引用.__closure__)
訪問閉包函數的元素(閉包函數的引用.__closure__[0].cell_contents)
兩個關鍵字:
用法:關鍵字(global nonlocal) 變量名
變量名 = 新的變量值
global 全局聲明,可以在函數內部將全局變量進行修改
nonlocal 函數內部聲明,可以在函數內部對局部變量進行修改(只能是內層函數對本層函數之外最外層函數之內的作用域變量進行修改)
三目運算符:
res = if成立時的結果 if 條件 else else成立時的結果
練習題
1、整理今天的知識點、繼續整合思維導圖
2、寫函數,,用戶傳入修改的文件名,與要修改的內容,執行函數,完成整個文件的批量修改操作
import os def file_1(demo,i,j): with open(demo,‘r‘,encoding=‘utf-8‘) as read_f, open(‘demo1.py‘,‘w‘,encoding=‘utf-8‘) as write_f: for line in read_f: write_f.write(line.replace(i,j)) return read_f,write_f file_11,file_l2=file_1(‘demo.py‘,‘def‘,‘haha‘) os.remove(file_1.name) os.rename(file_l2.name,file_11.name)
3、寫函數,檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容。
def func1(s): for i in s: if i.isspace(): return False else: return True s=‘hello world‘ print(func1(s))
4、寫函數,檢查傳入字典的每一個value的長度,如果大於2,那麽僅保留前兩個長度的內容,並將新內容返回給調用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
#方法一 dic = {"k1": "v1v1", "k2": [11,22,33,44]} def length(s): a=[] for i in dic: if len(dic[i])>2: a.append({i:dic[i][0:2]}) return a print(length(dic)) #方法二 dic = {"k1": "v1v1", "k2": [11,22,33,44]} def func1(dic): for i in dic: if len(dic[i])>2: dic[i]=dic[i][0:2] return dic print(func1(dic))
函數進階(一)