Python 三目運算,列表解析,裝飾器,迭代器和生成器
作業系統:Windows
Python:3.5
歡迎加入學習交流QQ群:657341423
三目運算
a=False
x=1+33 if a else 10-1
#a,b=1,10 if 10>1 else None
#多個變數賦值
print(x)
三目運算基本上都是用於if else方式,如果有elif的話,只能巢狀在else裡面。
例如
a=3
x=1+33 if a==1 else (10 if a==2 else 20)
print(x)
執行結果:
列表解析
列表解析方法基本用於for迴圈出來每個元素之後,然後加入一個新的列表。
res=[i for i in range(1,100)]
print(res)
結果:
for i in range(1,100)是將i從1到100的,資料型別是int的。
如果變成[i for i in range(1,100)]就是將i加入到一個新的列表去。這就是列表解析。
這裡可以加入判斷條件
res=[i for i in range(1,100) if i > 50]
print(res)
執行結果
裝飾器
裝飾器分帶引數和不帶引數。
不帶引數
def Mydecorate(func):
def decorates(*args,**kwargs):
#可將func帶引數或不帶引數
if mybool:
myfunc=func(*args,**kwargs)
else:
print("aa")
myfunc='Fail'
return myfunc
#這個return可以去掉
return decorates
mybool=False
@Mydecorate
def mydef(value):
name='Evan'
all=value+name
print(all)
#mydef('my name is ','Evan')
mydef('my name is ')
看到定義的Mydecorate,首先是return自身裡面的一個函式。再看裡面自身的一個函式decorates,這裡return的是需要裝飾器的函式。也就是說程式碼中的執行mydef。裝飾器中的func其實就是將函式mydef的名字傳入,然後進行判斷等,符合條件就將執行函式。
裝飾器執行順序
執行結果:
帶引數
def Mydecoratearg(arg):
#帶引數裝飾器
if arg:
def Mydecorate(func):
def decorates(*args,**kwargs):
func(*args,**kwargs)
return decorates
return Mydecorate
@Mydecoratearg("aa")
def mydef(value):
print("my name is "+value)
mydef('EvanGG')
執行順序:
執行結果:
迭代器
迭代器的優點
迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可以不存在或者被銷燬。這個特點使得它特別適合用於遍歷一些巨大的或是無限的集合
總的來說,對於長度太大列表或者字典等來說,使用迭代器訪問能節省記憶體。
比如,for i in list:會將list(列表)全部元素以記憶體載入方式實現迴圈,如果list元素太多,這樣就很耗記憶體。執行速度太慢。
用法:
def mydef():
print("aa")
class myclass():
def __init__(self,star,end):
self.star=star
self.end=end
def __iter__(self):#迭代器
return self
def __next__(self):#迭代器
if self.star<self.end:
self.star+=1
mydef()#引入自定義函式
return self.star
else:
raise StopIteration()
c=myclass(0,5)
for i in c:#迭代器的糖衣
print(i)
執行結果:
這個用法是在自定義類中實現迭代器的。不過在實際開發中,如果每次都定義類的話,程式碼就會顯得很長。
再看下面:
a=[x for x in range(3) if x<7]
b={"a":5,"b":6,"c":7}
ita=iter(a)#對列表進行迭代
#itb=iter(b)
#itb=iter(b.items())
itb=iter(b.values())#對字典進行迭代
while 1:
try:
var=next(ita)
varb=next(itb)
print(var)
print(varb)
except Exception as e:
break
執行結果:
生成器
生成器的特點:
生成器是一個函式,而且函式的引數都會保留。
迭代到下一次的呼叫時,所使用的引數都是第一次所保留下的,即是說,在整個所有函式呼叫的引數都是第一次所呼叫時保留的,而不是新建立的
有利於節省記憶體空間
簡單生成器
res=(i for i in range(1,100) if i > 50)
print(type(res))
執行結果:
帶yield 語句的生成器
在網上找一個例子
def fib(max):
a,b=1,1
while a<max:
yield a
a,b=b,a+b
f=fib(10)
print(next(f))
print(next(f))
print(next(f))
首先看到一個函式while的一個迴圈。yield是返回一個值,但會保留上一次函式裡面引數的值。這是與普通函式區別。普通函式是不會保留函式內的引數值的。
可以看到print(next(f)),這和迭代器的next一樣的用法。
迭代器和生成器在某個程度上是相似的。
更簡單的解釋:
def fib(a):
b=1
a=a+b
yield a
a=a+b
yield a
f=fib(10)
print(next(f))
print(next(f))
print(next(f))
# for i in fib(10):
# print(i)
執行結果:
可看到,這有3個next,但是函式裡面只有2個yield,所以到第三個next出現stop的錯誤。而上面輸出11和12分別對於圖上的yield。
相關文章
- Python之裝飾器、迭代器和生成器Python
- Python迭代器&生成器&裝飾器Python
- python_裝飾器——迭代器——生成器Python
- 詳解python三大器——迭代器、生成器、裝飾器Python
- Python學習之三大名器-裝飾器、迭代器、生成器Python
- 1.5.4 Python迭代器和生成器Python
- python3.7 迭代器和生成器Python
- python 生成器&迭代器Python
- Python3 裝飾器解析Python
- 迭代器和生成器
- 草根學Python(七) 迭代器和生成器Python
- python迭代器和生成器的總結Python
- Python迭代器與生成器Python
- Python之可迭代物件、迭代器、生成器Python物件
- python裝飾器2:類裝飾器Python
- Python學習筆記 - 迭代器和生成器Python筆記
- 簡單介紹python迭代器和生成器Python
- Python—三目運算Python
- Python語法—迭代器、生成器Python
- JS 裝飾器解析JS
- Python 裝飾器Python
- Python裝飾器Python
- Python學習之路34-迭代器和生成器Python
- PHP的迭代器和生成器PHP
- Python系列(三):關於迭代器和生成器,你該瞭解這些Python
- 史上最全 Python 迭代器與生成器Python
- Python裝飾器例項講解(三)Python
- python的裝飾器和閉包Python
- Python_閉包和裝飾器Python
- 迭代器、生成器
- 迭代器,生成器
- python基礎(補充):python三大器之裝飾器Python
- python 中的迭代器和生成器簡單介紹Python
- Python的生成器和迭代器有什麼區別?Python
- 1.5.3 Python裝飾器Python
- Python 裝飾器(一)Python
- python的裝飾器Python
- Python 裝飾器原理Python
- Python裝飾器模式Python模式