補充:函式不能改變全域不可變的變數,可變變數仍然可改變,
l1 = [1,2]
def a(l1):
l1.pop(1)
a(l1)
print(l1)
-
生成器
-
生成器:python社區把生成器與迭代器看成同一種,生成器的本質就是迭代器,唯一的區別是:生成器是我們自己用python代碼構建的資料結構,迭代器都是python提供的,或者轉化的,
-
獲取生成器的方法:
- 生成器函式
- 生成器運算式
- python內部提供的,
-
生成器函式獲取生成器,yield:
def func(): print(1) print(3) yield 5 print(func) #<function func at 0x000001A3CCA04438> 仍然是一個函式 ret = func() print(ret) #<generator object func at 0x000002471A631D48> #generator object#生成器物件def func(): print(3) yield 5 ret = func() print(next(ret)) #3 5#一個next對一個yield的回傳值 def func(): print(3) yield 5 yield 7 print(next(func())) #3 5 -
yield與return
return:一個函式中只能存在一個return結束函式的呼叫,并且給函式的執行者回傳值,
yield:只要函式中有yield那么它就是生成器函式,生成器函式中可以存在多個yield,一個next對一個yield的回傳值,yield不會結束函式的呼叫,但return會結束函式的呼叫,
#舉例運用: def func(): for i in range(1000000): yield i ret = func() i = 1000000 while i >= 0: print(next(ret)) i -= 1 -
如果再次呼叫yield就會接著上次的next.
def func(): for i in range(1000000): yield i ret = func() for i in range(5): print(next(ret)) for i in range(10): print(next(ret)) #0, 2,3,4,5,6,7,8,9,10,11,12,13,14 -
yield from(3.4版本以后):將資料變成一個迭代器回傳
def func(): l1 = [1,2,3,4,] yield l1 print(next(func())) #[1, 2, 3, 4] def func(): l1 = [1,2,3,4,] yield from l1 #將這個串列變成了一個迭代器回傳 print(next(func())) #1 print(nex(func())) #2 -
生成器函式可以直接用for回圈:
def func(): l1 = [1,2,3] yield from l1 for i in func(): print(i) #1 2 3
-
-
串列推導式,生成器運算式:
-
串列推導式:用一行代碼構建一個比較復雜有規律的串列,
l1 = [i for i in range(10)] #可將range換為可迭代物件, -
串列推導式可分為兩類,
-
回圈模式:需遍歷每一個元素,[變數(加工后的變數) for 變數 in iterable]
#例1:將10以內所有整數的平方寫入串列: l1 = [i*i for i in range(11)] print(l1) #例2:100以內的所有奇數寫入串列: l1 = [i for i in range(1,100,2)] print(l1) #例3:從python1到python10寫入串列: l1 = [f'python{i}' for i in range(1,11)] print(l1) -
篩選模式:[變數(加工后的變數) for 變數 in iterable if 條件]
#例1:將10以內能夠被2整除的數寫入串列 l1 = [i for i in range(11) if i%2==0] print(l1) #例2:過濾串列l1中小于3的字串,將剩下的轉換成大寫,l1 = ['nonl','globals','as','in'] l1 = ['nonl','globals','as','in'] l2 = [i.upper() for i in l1 if len(i)>=3] print(l2) #例3:將num串列中含有兩個0的字串生成一個新串列,num = [['021','001','201'],['100','012','010']] l1 = [j for i in num for j in i if j.count('0') == 2] print(l1)
-
-
生成器運算式:與串列推導式的寫法幾乎一樣,生成器也有回圈模式和篩選模式,只是將[]變為(),但比串列推導式更節省空間,
l1 = (i for i in range(10)) print(l1) #<generator object <genexpr> at 0x000001BB028F8CC8> print(next(l1)) #0l1 = (i for i in range(10)) for i in l1: #可直接用for回圈,因為for回圈本身就是將可迭代物件變為迭代器再回圈, print(i) -
串列推導式
- 缺點:
- 只能構建計較復雜并且有規律的串列;
- 超過三層回圈才能構建成功的,不建議使用串列推導式;
- 無法找查錯誤(debug模式)
- 缺點:
-
字典推導式
l1 = ['1','2','3'] l2 = ['一','二','三'] dic = {l1[i]:l2[i] for i in range(len(l1))} -
集合推導式
set1 = {i for i in range(10)}
-
-
內置函式:
-
python提供了68個內置函式,
- 一級難點:abs() enumerate() filter() max() min() open() range() print() len() list() dict() str() float() reversed() set() sum() tuple() type() zip() dir()
- 二級難點:classmethod() delattr() getattr() issubclass() isinstance() object() property() setattr() staticmethod() super()
- 三級難點:all() any() bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() id() input() int() locals() next() oct() ord() pow() repr() round()
-
eval():剝去字串的外衣(引號),運算里面的代碼,有回傳值,作業時最好不用,容易中病毒,
s1 = '1+1' print(s1) #1+1 print(eval(s1),type(eval(s1))) #2 <class 'int'> -
exec():與eval()幾乎一樣,但是它是處理代碼流的,作業時最好不用,容易中病毒,
msg = """ for i in range(5): print(i)""" exec(msg) #0,1,2,3,4 -
hash:獲取一個物件(可哈希物件:int,str,bool,tuple)的哈希值,
- 哈希值:加密演算法之間需要哈希值,與哈希演算法有關,
print(hash('12')) -
help():列印/獲取一個物件的使用方法,
print(help(str)) print(help(str.upper)) -
callable():判斷一個物件是否可呼叫,真為True,假為False,
l1 = [1,2] def func(): pass print(callable(l1)) #False print(callable(func)) #True剩余內置函式后續更新,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164456.html
標籤:Python
上一篇:python3_h5py_hdf5_遍歷_查看檔案結構
下一篇:實體010:給人看的時間
