列表推导式,生成器,迭代器
列表推导式:格式:[表达式 for 变量 in 旧列表] [表达式 for 变量 in 旧列表 if 条件]
# 过滤掉长度小于等于三的人名
# 方式1---》列表推导式(方便)
names = ['tom', 'lily', 'jack', 'steven', 'bb']
result = [name for name in names if len(name) > 3]
print(result)
result1 = [name.capitalize() for name in names if len(name) > 3] # 将得到的人名首字母进行大写
print(result1)
# 方式2---函数
def func():
names = ['tom', 'lily', 'jack', 'steven', 'bb']
newlist = []
for name in names:
if len(name) > 3:
name1=name.capitalize() # 将得到的人名首字母进行大写
newlist.append(name1)
print(newlist)
func()
# 将1-100中能被三和五整除的组成一个新的列表
newlist = [i for i in range(1, 101) if i % 3 == 0 and i % 5 == 0]
print(newlist)
元组列表:[(偶数,奇数),(),(),()] [(0,1),(0,3),(0,5),(0,7),(0,9),(2,1),(2,3),,,]
# 方式1---》列表推导式
newlist = [(x, y) for x in range(5) if x % 2 == 0 for y in range(10) if y % 2 != 0]
print(newlist)
# 方式2---》函数
def func():
newlist = []
for i in range(5):
if i % 2 == 0: # 偶数
for j in range(10):
if j % 2 != 0: # 奇数
newlist.append((i, j)) # 元组中
return newlist
x = func() # 有返回值必须接
print(x)
'''
练习:
list1=[[1,2,3],[4,5,6],[7,8,9],[1,3,5]]---->[3,6,9,5]
如何得到[3,6,9,5]
'''
list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 3, 5]]
newlist = [i[-1] for i in list1]#i[-1]取列表中最后一个元素,,,i表示列表中元素
print(newlist)
集合推导式(不允许有重复元素) 类似于列表推导式,在列表推导式的基础上添加了一个去除重复项
list1 = [1, 2, 3, 4, 5, 6, 2, 2, 1, 5, 8, 5]
print(set(list1))
set1 = {x + 1 for x in list1}
print(set1)
set2 = {x-1 for x in list1 if x>5}
print(set2)
字典推导式
dict1 = {'a': 'A', 'b': 'B', 'c': 'C'}
newdict = {value:key for key, value in dict1.item()}
print(newdict)
生成器:generator 得到生成器方式 通过列表推导式得到生成器
g=(x*3 for x in range(10))
while True:
try:
e=next(g)
print(e)
except:
print('没有更多元素啦!')
break
用函数得到生成器 1.定义一个函数,函数中使用yield关键字 2.调用函数,接收函数的结果 3.得到的结果就是生成器 4.借助于next() 或者 __next__() 得到元素
def fib(length):
a, b = 0, 1
n = 0
while n < length:
yield b # return b+暂停
a, b = b, a + b
n += 1
return '没有更多元素了'#return 就是在得到StopIteration后的提示信息
g = fib(8)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
生成器方法 __next__():获取下一个元素 send(value):向每次生成器调用中传值,第一次调用:send(None)
def gen():
i = 0
while i < 5:
temp = yield i # return 0+暂停
print('temp', temp)
for x in range(temp):
print('-------',i)
print('*****')
i += 1
return '没有更多数据'
g = gen()
# g.__next__()
print(g.send(None))#第一次传值
n1 = g.send(3)
print(n1)
n2 = g.send(5)
print(n2)
生成器的应用:协程
# 1协程 交替进行。通过协程,可以控制打印顺序
def task(n):
for i in range(n):
print('正在搬第{}块砖'.format(i))
yield None
def task1(n):
for i in range(n):
print('正在听第{}首歌'.format(i))
yield None
g1 = task(2)
g2 = task1(3)
while True:
try:
g1.__next__()
g2.__next__()
except:
pass
生成器总结 生成器:generator 定义生成器的方式 1.通过列表推导式方式 g=(x+1 for x in range(6)) 2.函数 yield def func(): ... yield g=func() 产生元素 1.next(generator)---->每次调用都会产生一个新元素,如果新元素产生完毕,再次调用的话就会产生异常 2.生成器自己的方法: g.__next__() g.send(value) 应用:协程
可迭代的对象:1.生成器 2.元组,列表,集合,字典,字符串
如何判断一个对象是否是可迭代的
from collections import Iterable
list1 = [1, 4, 7, 8, 8]
f = isinstance(list1, Iterable) # True
print(f)
f = isinstance('abc', Iterable) # True
print(f)
f = isinstance(100, Iterable) # False
print(f)
g = (x + 1 for x in range(10))#生成器也可迭代
f = isinstance(g, Iterable)
print(f)
什么是迭代器? 迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束 迭代器只能往前不会后退 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator 可迭代的 是不是肯定就是 迭代器? list是可迭代的,但不是迭代器
# list是可迭代的,但不是迭代器
list1 = [1, 3, 5, 3, 6]
print(next(list1)) # 'list' object is not an iterator
# 通过iter()函数可将可迭代的变成一个迭代器
list1 = [2, 3, 5, 6, 6, 4]
list1 = iter(list1)
print(next(list1))
生成器与迭代器 生成器是可迭代的,也是迭代器 生成器是迭代器的一部分 1.需要借助iter()转换