Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
Python 支持各种数据结构的推导式:
列表(list)推导式
字典(dict)推导式
集合(set)推导式
元组(tuple)推导式
列表推导式格式为:
[表达式 for 变量 in 列表][out_exp_res for out_exp in input_list]
或者
[表达式 for 变量 in 列表 if 条件][out_exp_res for out_exp in input_list if condition]
out_exp_res:列表生成元素表达式,可以是有返回值的函数。
for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
if condition:条件语句,可以过滤列表中不符合条件的值。
字典推导式字典推导基本格式:
{ key_expr: value_expr for value in collection }
或
{ key_expr: value_expr for value in collection if condition }
集合推导式集合推导式基本格式:
{ expression for item in Sequence }
或
{ expression for item in Sequence if conditional }
元组推导式(生成器表达式)
元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
元组推导式基本格式:
(expression for item in Sequence )
或
(expression for item in Sequence if conditional )
元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。
例如1:
names =['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names =[name.upper()for name in names iflen(name)>3]print(new_names) # ['ALICE','JERRY','WENDY','SMITH']
例如2:
multiples =[i for i in range(30)if i %3==0]print(multiples) #[0,3,6,9,12,15,18,21,24,27]
例如3:
listdemo =['Google','Runoob','Taobao']
newdict ={key:len(key)for key in listdemo}print(newdict) # {'Google':6,'Runoob':6,'Taobao':6}
例如4:
setnew ={i**2for i in(1,2,3)}print(setnew) #{1,4,9}
例如5:
a =(x for x in range(1,10))tuple(a) # 使用 tuple() 函数,可以直接将生成器对象转换成元组
(1,2,3,4,5,6,7,8,9)
四、迭代器与生成器
迭代器
迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
例如1:
list=[1,2,3,4]
it =iter(list) # 创建迭代器对象
print(next(it)) # 输出迭代器的下一个元素 #结果:1print(next(it)) #结果:2
例如2:
list=[1,2,3,4]
it =iter(list) # 创建迭代器对象
for x in it:print(x, end=" ") # 1,2,3,4
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
调用一个生成器函数,返回的是一个迭代器对象。
下面是一个简单的示例,展示了生成器函数的使用:
def countdown(n):while n >0:
yield n
n -=1
# 创建生成器对象
generator =countdown(5)
# 通过迭代生成器获取值
print(next(generator)) # 输出:5print(next(generator)) # 输出:4print(next(generator)) # 输出:3
# # 使用 for 循环迭代生成器
#forvalue in generator:#print(value) # 输出:21