一、列表生成式
列表生成式就是一个用来生成列表的特定语法形式的表达式。
是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]
二、列表生成式实例
1、 生成一个2n+1的数字列表,n为从3到11的数字。
nums_list = [2 * n + 1 for n in range(3, 12)]
print(nums_list)
2、求以r为半径的圆的面积和周长(r的范围从1到10)
import math
circle = [(math.pi * (r ** 2), 2 * math.pi * r) for r in range(1, 11)]
print(circle)
3、 找出1~100之间所有的质数。
def isPrime(num):
"""
判断num是否为质数?
质数: 只能被1和它本身整除的数就是质数. (负数不是质数, 1不是质数)
:param num:
:return:Bool(True, False)
num=5: 5%2==0 5%3==0 5%4==0 (2, 5) (2, num)
num=6: 6%2==0(---不需要继续判断了) ----> 不是质数
"""
if num <= 1:
return False
else:
for i in range(2, num):
if num % i == 0:
return False
else:
return True
# 找出1~100之间所有的质数。
primeNums = [num for num in range(1, 101) if isPrime(num)]
print(primeNums)
4、找出1~100之间所有奇数, 并且返回一个列表。如果能被3整除, 返回返回该数的平方,否则返回该数的三次方 。
nums = [num ** 2 if num % 3 == 0 else num ** 3 for num in range(1, 101, 2)]
print(nums)
三、集合生成式和字典生成式
字典生成式:用来快速生成字典;
集合生成式:用来快速生成集合;
四、集合生成式和字典生成式实例
1). 将字典的key值和value值调换;
d ={i:str(i) for i in range(10)}
print(d)
d1={value:key for key,value in d.items()}
print(d1)
2). 大小写计数合并 : 已知字典{‘A’:10, ‘b’:5, ‘a’:2}, 合并后为{‘a’:12, ‘b’:5}
key值最终全部为小写.
"""
大小写计数合并 : 已知字典{'A':10, 'b':5, 'a':2}, 合并后为{'a':12, 'b':5}
key值最终全部为小写.
"""
d= {
'A':10,
'a':40,
'b':10,
'c':2,
'C':5
}
# 合并字典; d.get(key.lower(), 0), 如果key'值不存在,默认返回0;
dict_result = {key.lower():d.get(key.lower(), 0) + d.get(key.upper(), 0)for key, value in d.items()}
print(dict_result)
五、生成器
(1)什么叫生成器?
在Python中,一边循环一边计算的机制,称为生成器:Generator。
(2)什么时候需要使用生成器?
一般情况下我们不需要使用生成器,只有当我们因为性能限制才需要用到,比如我们使用python读取一
个10g的文件,如果一次性将10g的文件加载到内存处理的话(read方法),内存肯定会溢出;这里如果可以
使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.
(3)如何创建生成器?
第一种方法: 列表生成式的改写。 []改成()
第一种方法: yield关键字
# 第一种方法: 列表生成式的改写。 []改成()
# nums = [i**2 for i in range(100)]
# print(nums)
nums = (i**2 for i in range(5))
# print(nums) # <generator object <genexpr> at 0x7f40e1b642a0>
# print(type(nums)) # <class 'generator'>
# for num in nums:
# print(num)
# __next__和next()效果相同(面向对象-魔术方法)
# nums.__next__()
# print(next(nums))
# print(next(nums))
# print(next(nums))
(4)如何打印生成器的每一个元素呢?
通过for循环, 依次计算并生成每一个元素。
如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
(5)生成器的特点是什么?
-
节约内存
- 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是
说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新
创建的。