Python 三目運算,列表解析,裝飾器,迭代器和生成器

HuangZhang_123發表於2017-07-09

作業系統: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。

相關文章