基本格式python
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'] 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]
v1 = { i for i in 'alex' }
v1 = { 'k'+str(i):i for i in range(10) }
# 典例一 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)
在不改變原函數內部代碼的 基礎上,在函數執行以前和以後自動執行某個功能面試
裝飾器編寫格式redis
def 外層函數(參數):
def 內層函數(*args,**kwargs)
return 參數(*args,**kwargs)
return 內層函數
裝飾器應用格式網絡
問題:爲何要加 *args, **kwargsapp
能夠接收參數函數裏面任意值ide
若是給好幾個函數寫一個統一的裝飾器,怎麼辦?函數
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
while + 索引 + 計數器ui
迭代器spa
對某種對象(str/list/tuple/dict/set類建立的對象),可迭代對象中元素逐一獲取。code
什麼是迭代器:具備' __ 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
# 生成器函數(內部是否包含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 源碼示例