高级特性
生成式与生成器
列表生成式
列表生成式就是一个用来生成列表的特定语法形式的表达式。
是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。
语法
普通的语法格式:[exp for iter_var in iterable]
带过滤功能语法格式: [exp for iter_var in iterable if_exp]
循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
注意:
# 如果列表生成式和三元运算符结合在一起, if语句放前面;
nums = [num ** 2 if num % 3 == 0 else num ** 3 for num in range(1, 101, 2)]
print(nums)
集合生成式和字典生成式
eg:
集合生成式和字典生成式实例
1). 将字典的key值和value值调换;
d = {value, key for key, value in dDict.items()}
2). 大小写计数合并 : 已知字典{‘A’:10, ‘b’:5, ‘a’:2}, 合并后为{‘a’:12, ‘b’:5}
key值最终全部为小写.
d = {
"A": 10,
"b": 5,
"a": 2
}
dDict = {key.lower(): (d.get(key.lower(), 0) + d.get(key.upper(), 0)) for key, value in d.items()}
print(dDict)
生成器
概念
在Python中,一边循环一边计算的机制,称为生成器:Generator。
作用
一般情况下我们不需要使用生成器,只有当我们因为性能限制才需要用到,比如我们使用python读取一
个10g的文件,如果一次性将10g的文件加载到内存处理的话(read方法),内存肯定会溢出;这里如果可以
使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.
创建方式
第一种方法: 列表生成式的改写。 []改成()
nums = (i**2 for i in range(5))
print(nums)
print(type(nums))
第一种方法: yield关键字。
使用方法
通过for循环, 依次计算并生成每一个元素。
nums = (i**2 for i in range(5))
for num in nums:
print(num)
如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
注:
超出生成器生成对象的长度会抛出异常
特点
- 节约内存
- 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的。
案例
生产者消费者模型
cacheList = []
cacheListMaxLenght = 5
def isFull(lList):
return len(lList) == cacheListMaxLenght
def producer():
while True:
if not isFull(cacheList):
print('正在生产......')
cacheList.insert(0, 'lllll')
else:
print('供过于求!!!')
yield
def consumer(name):
print('%s 准备购买游戏机......' % name)
while True:
i = yield
print('%s 购买成功!!!' % i)
def main():
p = prod