4.7 推導式 列表推導式 基本格式 v1 = [i for i in 可迭代對象 ]v2 = [i for i in 可迭代對象 if 條件 ] # 條件為true才進行append 1 # 示例一 2 v1 = [ i for i in 'alex' ] # ['a','l','e','x'] ...
4.7 推導式
-
列表推導式
-
基本格式
v1 = [i for i in 可迭代對象 ]
v2 = [i for i in 可迭代對象 if 條件 ] # 條件為true才進行append1 # 示例一 2 v1 = [ i for i in 'alex' ] # ['a','l','e','x'] 3 v2 = [i+100 for i in range(10)] # [100,101,102,...,109] 4 v3 = [99 if i>5 else 66 for i in range(10)][66,66,66,66,66,66,99,99,99,99] 5 6 # 示例二 7 def func(): 8 return 100 9 v4 = [func for i in range(10)] # [10個func函數] 10 11 v5 = [lambda : 100 for i in range(10)] 12 result = v5[9]() # 100 13 14 # 示例三 15 def func(): 16 return i 17 v6 = [func for i in range(10)] 18 result = v6[5]() # 9 19 20 v7 = [lambda :i for i in range(10)] 21 result = v7[5]() # 9 22 23 # 示例四 24 v8 = [lambda x:x*i for i in range(10)] # 新浪微博面試題 25 # 1.請問 v8 是什麼?# 函數 26 # 2.請問 v8[0](2) 的結果是什麼? # 18 27 28 # 面試題 29 def num(): 30 return [lambda x:i*x for i in range(4)] 31 # num() -> [函數,函數,函數,函數] 32 print([ m(2) for m in num() ]) # [6,6,6,6] 33 34 # ##################### 篩選 ######################### 35 v9 = [i for i in range(10) if i > 5]
View Code
-
-
集合推導式
v1 = { i for i in 'alex' }
-
字典推導式
v1 = { 'k'+str(i):i for i in range(10) }
4.8 裝飾器
-
導入
# 典例一 v = 1 v = 2 print(v) # 2 # 典例二 def func(): pass v = 10 v = func print(v) # v 為函數地址 # 典例三 def base(): print(1) def bar(): print(2) bar = base bar() # 1 # 典例一 def func(): def inner(): pass return inner v = func() # inner函數地址 # 典例二 def func(arg): def inner(): print(arg) return inner v1 = func(1) v1() # 1 v2 = func(2) v2() # 2 # 典例三 def func(arg): def inner(): arg() return inner def f1(): print(123) v1 = func(f1) v1() # 123 # 典例四 def func(arg): def inner(): arg() return inner def f1(): print(123) return 666 v1 = func(f1) #inner函數 result = v1() #執行f1函數 123 print(result) #返回值為None # 典例五 def func(arg): def inner(): return arg() return inner def f1(): print(123) return 666 v1 = func(f1) # inner函數 result = v1() # 執行inner函數 123 返回值為f1 print(result) #列印f1返回值
-
裝飾器基本格式
def func(age):
def inner():
v = arg()
return v
return inner
# 第一步:執行func函數並將下麵函數參數傳遞,相當於:fun(index)
# 第二步:將func的返回值重新賦值給下麵的函數名,index = func(index) -
含義
-
在不改變原函數內部代碼的 基礎上,在函數執行之前和之後自動執行某個功能
-
-
格式
-
裝飾器編寫格式
def 外層函數(參數):
def 內層函數(*args,**kwargs)
return 參數(*args,**kwargs)
return 內層函數 -
裝飾器應用格式
-
問題:為什麼要加 *args, **kwargs
-
可以接收參數函數裡面任意值
-
-
如果給好幾個函數寫一個統一的裝飾器,怎麼辦?
def a1(func):
def inner(*args,**kwargs)
return func(*args,**kwargs)
return inner
-
-
關於執行函數的前後
def a1(func):
def inner(*args,**kwargs)
print("調用函數之前")
data = func(*args,**kwargs)# 執行函數並獲取返回值
print("調用函數之後")
return data
return inner
-
帶參數的裝飾器
# 第一步:執行 ret = xxx(index)
# 第二步:將返回值賦值給 index = ret# 格式
def x(counter):
def wrapper(fnc):
def inner(*args,**kwargs)
data = func(*args,**kwargs)
return data
return inner
def wrapper
-
查看帶參數裝飾器執行順序
def x(counter):
print('x函數')
def wrapper(func):
print('wrapper函數')
def inner(*args,**kwargs):
print('inner函數')
if counter:
return 123
return func(*args,**kwargs)
return inner
return wrapper
4.9 迭代器
-
類和對象
-
任務展示列表中所有數據
-
while + 索引 + 計數器
-
迭代器
-
-
迭代器含義
對某種對象(str/list/tuple/dict/set類創建的對象),可迭代對象中元素逐一獲取。
什麼是迭代器:具有' __ next __ ' 的方法且每次調用都能獲取可迭代對象中的每個元素(從前到後一一獲取)
-
迭代器使用
# 列表轉換成迭代器:
v1 = [1,2,3,4]
v2 = iter(v1) #v2就是迭代器
v2 = v1.__iter__()
# 迭代器想要獲取每個值:
result1 = v2.__next__()
print(result1)
result2 = v2.__next__()
print(result2)
result3 = v2.__next__()
print(result3)
result4 = v2.__next__()
print(result4)
result5 = v2.__next__()
print(result5)
# 直到報錯:StopIteration錯誤,表示已經迭代完畢。
# 或者迴圈獲取迭代器中的內容
while True:
try:
val = v2.__next__()
print(val)
except Exception as e:
break-
如何判別一個對象是否是迭代器:內部是否有
__next__方法
。 -
for迴圈實質
v1 = [11,22,33,44]
# 1.內部會將v1轉換成迭代器
# 2.內部反覆執行 迭代器.__next__()
# 3.取完不報錯
for item in v1:
print(item)
-
-
可迭代對象
-
表象:可以被迴圈對象就可以稱為是可迭代對象:"x" [1,2] {}
class Foo:
pass
obj = Foo() -
內部具有
__iter__()
方法且返回一個迭代器。v1 = [11,22,33,44]
result = v1.__iter__() #result 就是迭代器 -
可以被for迴圈
-
如何讓一個對象變成可迭代對象?
在類中實現
__iter__
方法且返回一個迭代器(生成器)class Foo:
def __iter__(self):
return iter([1,2,3,4])
obj = Foo()
class Foo:
def __iter__(self):
yield 1
yield 2
yield 3
obj = Foo記住:只有能被for迴圈就是去看內部的iter方法。
-
-
迭代器口訣
-
取一次就沒有了
-
不取就不執行
-
-
取迭代器的值得方法
-
list
-
for迴圈
-
next
-
4.10 生成器
-
實質:就是函數的變異
-
格式
# 生成器函數(內部是否包含yield)
def func():
print("f1")
yield 1
print("f2")
yield 2
print("f3")
# 函數內部不會被執行,返回一個生成對象
v1 = func()
# 生成器可以被for迴圈,一旦開始迴圈那麼函數內部代碼就會開始執行
for item in v1:
print(item)# 無限迴圈列印1,2,3.....
def func():
count = 1
while True:
yield count
count += 1
val = func()
for item in val:
print(item) -
總結:函數中如果存在yield,那麼該函數就是一個生成器函數,調用生成器函數會返回一個生成器,生成器只有被for迴圈時,生成器函數內部的代碼才會被執行,每次執行都會獲取yield返回的值
-
練習
# 讀取大文件
def func():
"""
分批去讀取文件中的內容,將文件的內容返回給調用者。
:return:
"""
cursor = 0
while True:
f = open('db', 'r', encoding='utf-8')# 通過網路連接上redis
# 代指 redis[0:10]
f.seek(cursor)
data_list =[]
for i in range(10):
line = f.readline()
if not line:
return
data_list.append(line)
cursor = f.tell()
f.close() # 關閉與redis的連接
for row in data_list:
yield row
for item in func():
print(item)redis 源碼示例