一丶推導式(comprehensions)
又稱解析式
- 利用列表推導式、字典推導式、集合推導式可以從一個數據對象構建另一個新的數據對象
- 利用生成器推導式可以構建生成器對象
1. 列表推導式(list comprehension)
是Python開發時用得最多的技術之一,表示對可迭代(Iterable)對象的元素進行遍歷、過濾或再次計算,生成滿足條件的新列表。利用列表推導式更加簡潔。由於Python內部對列表推導式做了大量優化,還能保證較快的運行速度。
普通for循環
>>> n=[10,-33,21,5,-7,-9,3,28,-16,37]
>>> number=[]
>>> for i in n:
number.append(i*2)
>>> number
[20, -66, 42, 10, -14, -18, 6, 56, -32, 74]
列表推導式
>>> n=[10,-33,21,5,-7,-9,3,28,-16,37]
>>> number=[i*2 for i in n]
>>> number
[20, -66, 42, 10, -14, -18, 6, 56, -32, 74]
>>> n=[[10,-33,21],[5,-7,-9,3,28,-16,37]]
>>> number=[j*2 for i in n for j in i]
>>> number
[20, -66, 42, 10, -14, -18, 6, 56, -32, 74]
>>> n=[10,-33,21,5,-7,-9,3,28,-16,37]
>>> number=[i*2 if i%2==0 else i*3 for i in n if i>0]
>>> number
[20, 63, 15, 9, 56, 111]
列表推導式與函數
>>> import random
>>> rlist=[random.randint(30,80) for i in range(15)] #使用randint()函數
>>> rlist
[30, 45, 68, 60, 73, 49, 66, 72, 66, 33, 52, 52, 61, 42, 51]
>>> def ff(x):
if x%3==0:
x/=3
elif x%7==0:
x*=2
else:
x*=5
return x
>>> number=[ff(i) for i in rlist] #使用自定義的ff()函數
>>> number
[10.0, 15.0, 340, 20.0, 365, 98, 22.0, 24.0, 22.0, 11.0, 260, 260, 305, 14.0, 17.0]
2. 字典推導式
字典推導式和列表推導式的使用方法類似,只不過將方括號變成花括號,並且需要兩個表達式,一個生成鍵,一個生成值,兩個表達式之間使用冒號分隔,最後生成的是字典。
>>> name= ['Bob','Tom','Alice','Jerry','Wendy','Smith']
>>> score=[86,78,98,90,47,80]
>>> dd={i:j for i,j in zip(name,score)}
>>> dd
{'Bob': 86, 'Tom': 78, 'Alice': 98, 'Jerry': 90, 'Wendy': 47, 'Smith': 80}
以名字爲鍵、成績爲值組成新字典exdd,新字典中的鍵值對只包含成績80及以上的。
>>> exdd={i:j for i,j in zip(name,score) if j>=80}
>>> exdd
{'Bob': 86, 'Alice': 98, 'Jerry': 90, 'Smith': 80}
3. 生成器推導式
- 生成器推導式用法與列表推導式類似,把列表推導式的方括號改成圓括號。它與列表推導式最大的區別是:生成器推導式的結果是一個生成器對象,是一種迭代器(Iterator);而列表推導式的結果是一個列表。
- 生成器對象可以通過for循環或者__next__()方法、next()函數進行遍歷,也可以轉換爲列表或元組,但是不支持使用下標訪問元素,已經訪問過的元素也不支持再次訪問。當所有元素訪問結束之後,如果想再次訪問就必須重新創建該生成器對象。
>>> gen=(int(i/3) for i in range(1,10) if i%3==0)
>>> gen
<generator object <genexpr> at 0x0000000002F0BB88>
>>> list(gen) #生成器對象轉換爲列表
[1, 2, 3]
>>> gen.__next__() #不能再次訪問
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
gen.__next__()
StopIteration
>>> gen=(int(i/3) for i in range(1,10) if i%3==0) #重新生成生成器對象
>>> gen.__next__() #訪問下一個元素
1
>>> next(gen) #訪問下一個元素
2
>>> gen.__next__()
3
>>> next(gen) #訪問完畢,不能再次訪問
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
next(gen)
StopIteration
>>> gen=(int(i/3) for i in range(1,10) if i%3==0)
>>> for i in gen: #for循環遍歷
print(i,end=' ')
1 2 3
二丶 序列解包
序列解包(Sequence Unpacking)是Python語言賦值語句的一種技巧和方法,在Python中經常用到。
1. 多變量同時賦值
>>> x,y,z='a','b','c'
>>> x
'a'
>>> y
'b'
>>> z
'c'
2. 一個對象值賦給多個變量
>>> x,y,z=['a','b','c']
>>> print(x,y,z)
a b c
>>> x,y,z=sorted([22,33,11]) #sorted([22,33,11])的結果是排好序的列表
>>> print(x,y,z)
11 22 33
>>> x='a','b','c'
>>> x
('a', 'b', 'c')
>>> i,j,k=x #x是一個元組,這個元組可以進一步賦值到多個變量上
>>> print(i,j,k)
a b c
3. 交換兩個變量的值
>>> x,y=44,55
>>> y,x=x,y
>>> print(x,y)
55 44
4. 切片支持序列解包
>>> a=list(range(5))
>>> a
[0, 1, 2, 3, 4]
>>> a[1:4]=map(str,[11,22,33])
>>> a
[0, '11', '22', '33', 4]
5. 使用序列解包同時遍歷多個序列
>>> names=['Lily','Tom','Mary']
>>> height=[165,177,168]
>>> for i,j in zip(names,height):
print(i,j,end=' ')
Lily 165 Tom 177 Mary 168