八 Python列表推導式
1. 迭代器
1-1. 介紹:
通過for循環遍歷對象的每一個元素的過程
優勢:節省內存空間,用多少取多少
1-2. 用法:
- 判斷是迭代器還是可迭代的對象
from collections import Iterable,Iterator
#判斷是否爲可迭代對象
print(isinstance('abc',(Iterable,str))) # str 不可變 or 但是有可迭代的方法 # True
print(isinstance([1,2,3,4],Iterable)) # True
print(isinstance(range(10),Iterable)) # True
print(isinstance(123,Iterable)) # False
print(isinstance({1,2,3,4},Iterable)) # True
# tips: 輸出爲True的及爲可迭代對象(除了整數外,其它幾乎均爲可迭代對象)
# 判斷是否爲迭代器
li = [1,2,3,4] # Iterable
print(isinstance(li,Iterator)) # False
lis = iter(li) # 迭代器
print(isinstance(lis,Iterator))
# tips: 輸出爲True的及爲迭代器
- 基本用法
from collections import Iterable,Iterator
li = [1,2,3,4]
lis = iter(li)
print(lis.__next__())
# 用法2
print(next(lis))# 輸出結果均爲1,用多少就需要多少個print
1-3 tips:
tips:
- next 只能順延調用,不能往前
- 可迭代對象不一定是迭代器
- 迭代器不支持索引取值
- 超出範圍會報錯 StopIteration
2. 生成器
2-1. 介紹
可以實現多任務
g = (i for i in range(10)) # generator
print(g) # 輸出結果含有內存地址和generator的爲生成器
2-2. 用法
- 基本用法:自定義長度列表
def test(number):
n = 0
# li = []
while n<number:
# li.append(n)
yield n
n += 1
# print(li)
#
res = test(20000)
print(res) # generator生成器
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__()) #有多少個print,就可輸出多少個
g = (i for i in range(10)) # generator
#print(g)
print(next(g)) # 輸出結果爲1,有多少個print,就可輸出多少個
- yield (遇到yield(生成器),函數會暫停,將對象返回,下次會繼續上次暫停的地方執行)
3. 推導式
3-1. 介紹
3-2. 常見用法:
- 列表推導式
li1 = [i/2 for i in range(1,21)]
print(li1) #輸出爲[0.5,1.0,1.5...9.5,10.0]
- dict字典推導式
li = ["name","age","gender"]
li1 = ["amy","18","male"]
dic1 = {0:"name",1:"age"}
dic2 = {li.index(i):i for i in li}
print(dic2) # 輸出結果爲:{0: 'name', 1: 'age', 2: 'gender'}
- set 集合(隨機生成10~100之間的元素,並且去重)
s1 = {random.randint(1,100) for i in range(10)}
print(type(s1))
print(len(s1))
s2 = {i for i in range(10)}
s3 = [i for i in range(10)] # list
print(s2)
print(type(s2))
'''
輸出結果爲:
<class 'set'>
10
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
<class 'set'>
'''
- 生成隨機列表10個元素 <0 的數進行平方,生成新的列表
import random
a = random.randint(-20,10)
print(a)
rli = [random.randint(-20,10) for i in range(10)]
def f(x):
return x**2
f(2)
rli2 = map(lambda x:x**2,filter(lambda x:x<0,rli)) # 1.map函數擬定返回規則;2.篩選出<0的元素構建新的序列
print(list(rli2))
4. 三目運算符
4-1. 介紹
a = 1
b = 2
# 常規寫法
if b-a>0:
print(b-a)
else:
print(a+b)
# 三目寫法
print(b-a if b-a>0 else a+b)
列表
li4 = [i+j for i in "123" for j in "abc"]
print(li4)
字典
dic = {"name":"amy","gender":"female"}
li5 = [k+":"+v for k,v in dic.items()]
print(li5)