八 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)