-
默認引數的陷阱(只針對于默認引數是可變的資料型別):如果默認引數使用的是可變型別資料,那么無論呼叫多少次這個默認引數,都是同一個(id相同),默認引數的可變資料型別既不在全域也不再區域,定義后不會消失(區域命稱空間會消失),
def func(num,nums=[]): nums.append(num) return nums ret1 = func(1) print(ret) >>>[1] ret2 = fun(2) print(ret2) >>>[1,2] #將第一次的資料也包含了, #例: def func(a,list=[]): list.append(a) return list ret1 = func(10,) print(ret1) #[10] print(func(20,[])) #[20] #重新為串列傳入引數 print(func(100)) #[10,100] print(ret1) #[10,100] -
區域作用域的陷阱:在函式中,如果定義一個變數,但是在定義變數之前參考這個變數,即使全域變數有此參考的變數,仍然會報錯,
#例1: count = 1 def func(): count += 1 print(count) func() IndentationError: unindent does not match any outer indentation level #例2: count = 1 def func(): print(count) func() #1 #例3: count = 1 def func(): print(count) count = 1 func() UnboundLocalError: local variable 'count' referenced before assignment -
global nonlocal
-
global:1.在區域作用域里宣告一個全域變數,
#1. num = 0 def func(): num = 1 print(num) #0 #2. def func(): global num num = 1 print(num) #會報錯, #3. def func(): global num num = 1 func() print(num) #1 #3. num = 0 def func(): global num num = 1 func() print(num) #1 -
nonlocal:不能夠操作全域變數;主要用于內層函式對外層函式的區域變數進行修改,
def func1(): count = 1 def inner(): nonlocal count count+=1 inner()
-
-
函式名的運用
-
函式名指向的是函式的記憶體地址
-
函式名 + ()就可以執行函式
#例1: def func(): print(1) f1 = func f2 = f1 f2() #1 #例2. def func1(): print(1) def func2(): print(2) func2 = func1 func2() #1 -
函式名可以作為容器類資料型別的元素
#例3: def func1(): print(1) def func2(): print(2) def func3(): print(3) l1 = [func1,func2,func3] for i in l1: i() #1 2 3 -
函式名可以作為函式的引數
def func0(a): print(1) def func1(x): x() func1(func0) #1 -
函式名可以作為函式的回傳值,
def func1(): print(1) def func2(x): return x ret = func2(func) ret() #1
-
-
格式化輸出(3.6版本之后):
- 基礎表達:
```python name = 'python' age = '18' msg = f'我叫{name},今年{age}' #在引號前添加一個字符f ```-
可以加運算式:
count = 2 print(f'最終結果:{count**2}') name = 'python' print(f'我的名字是{name.upper()}') dic = {'name':'python','age':'18'} msg = f'我叫{dic["name"]},今年{dic["age"]}' #注意雙引號與單引號的使用,不能產生歧義, list = ['python','18'] msg = f'我叫{list[0]},今年{list[1]}' -
可以結合函式:
def sum1(a,b): return a+b print(f'最終結果是{sum1(1,2)}') -
優點:1.結構更加優化,2.可以結合運算式和函式使用,3.效率更高
-
迭代器:
-
可迭代物件:
物件:python中一切皆物件, 可迭代:可以進行回圈更新的一個值,
以專業角度來說,內部含
__iter__方法的物件即為可迭代物件,如:str、list、tuple、dict、set、range、檔案句柄等, -
獲取物件的所有方法并且以字串的形式表現:dir()
s1 = 'qwer' print(dir(s1)) #請自測, -
判斷一個物件是否是可迭代物件:
s1 = 'qwer' print('__iter__' in dir(s1)) #True -
可迭代物件的優點:
- 存盤的資料能夠直接顯示,比較直觀,
- 擁有的方法比較多,操作起來方便,
-
可迭代物件的優點:
-
占記憶體,
-
不能直接通過for回圈(不能直接取值),python內部自動將其轉換為迭代器(見下文)然后再進行for回圈(用next()方法取值,見下文,),
l1 = [1,2,3,4] for i in l1: print(i) #python內部自動將其轉換為迭代器然后再進行for回圈
-
-
迭代器:
迭代器的定義:內部含
__iter__和__next__方法的物件就是迭代器,例如:檔案句柄, -
判斷是否為可迭代器:
with open ('1.txt',encoding='utf-8',mode='w') as f1: print('__iter__' in dir(f1) and '__next__' in dir(f1)) -
可迭代物件可以轉換為迭代器:
s1 = 'qwert' obj = iter(s1) #或者: s1.__iter__() print(obj) #請自測,會回傳一個迭代器的記憶體地址 -
對迭代器進行取值:
s1 = 'qwert' obj = iter(s1) next(obj) #會取出字串s1的第一個元素 next(obj) #會回傳字串s1的第二個元素 #或: obj.__next__() -
迭代器優點:
1.節省記憶體,迭代器在記憶體中相當于只占一個資料的空間,因為每次取值上一條資料都會在記憶體釋放,迭代器具有惰性機制,next一次,只取一個值,絕不多取,
-
迭代器的缺點:
1.不能直觀的查看里面的資料,
2.只能一直向下取值,
3.速度慢,
-
可迭代物件與迭代器的對比:
- 可迭代物件是的操作方法比較多,比較直觀,儲存資料相對少(幾百萬個資料,8G記憶體是可以承受的)的一個資料集,
- 當側重于對于資料可以靈活處理,并且記憶體空間足夠,可將資料設定為一個可迭代物件,
- 迭代器是非常節省記憶體,可以記錄取值位置,可以通過回圈加next方法取值,但是不直觀,操作方法比較單一的一個資料集,
- 當資料量過大,可選擇將資料設定為一個迭代器,
-
用while回圈模擬for回圈對可迭代物件進行取值:(請自測)
l1 = [1,2,3,4,5,6,7,8] obj = iter(l1) while 1: try: #try:例外處理 print(next(obj)) except StopIteration: break
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166994.html
標籤:Python
上一篇:在廈門這個水平大概能要多少
