python第九节(推导式迭代器生成器)

推导器迭代器生成器

推导式

推导式
推导式是可以从一个数据序列构建另一个新的数据序列。

# # [0.5,1.0,1.5,2.0...10.0]
# li = []
# for i in range(1,21):
#     # print(i/2)
#     li.append(i/2)
# print(li)
'''
列表推导式
'''
# li1 = [i/2 for i in range(1,21)]
# print(li1)
'''
随机生成一个列表 <0的数进行平方  生成新的列表
'''
import random
# print(random.randint(-10,10))  # randint(self, a, b)返回范围[a, b]内的随机整数,包括两个端点
# li = [random.randint(-10,10) for i in range(10)]
# print(li)
li = [-7, 6, -4, 0, -1, 2, 3, 4, -10, 0]
# li1 = []
# for i in li:
#     if i < 0:
#         i = i**2
#         li1.append(i)
# print(li1)
# print(list(filter(lambda x:x<0,li)))
# print(list(map(lambda x:x**2,filter(lambda x:x<0,li))))
# map()创建一个迭代器,使用来自的参数计算函数每个迭代。当最短的迭代结束时停止
li3 = [i**2 for i in li if i<0]
print(li3)
'''
列表推导式嵌套循环
'''
# for i in "123":
#     for j in "abc":
#         print(i+j)
#
# li4 = [i+j for i in "123" for j in "abc"]
# print(li4)
# dic = {"name":"amy","age":18}
# # [key:value,key:value]
# li5 = [k +":"+str(v) for k,v in dic.items()]  # 类型错误:只能连接str(不是“int”)到str
# print(li5)
li5 = ['age','name','gender']
# {"age":0,"name":1,"gender":2}
'''
字典推导式'''
dic1 = {i:li5.index(i) for i in li5}
print(dic1)
'''
集合推导式
随机生成1~100之间的元素,并且去重'''
# import random
# s1 = {random.randint(1,100) for i in range(10)}
# print(type(s1))
'''
没有元组推导式的说法
'''
# tup = (i for i in range(3))
# print(tup)  # generator 不是元素推导式,而是generator生成器
# print(tuple(tup))
'''
函数调用时才执行
'''
res = [lambda x:x+i for i in range(10)] # 10+9
print(res)
print(res[0](10))

迭代器

迭代器
迭代器是一种可以被遍历的对象,并且能作用于next()函数。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往后遍历不能回溯,不像列表可以随时取后面的数据,也可以返回头取前面的数据。迭代器通常要实现两个基本的方法:iter()和next()。
迭代器和可迭代的区别

  • 凡是可作用于for循环的对象都是可迭代类型。
  • 凡是可作用于next()函数的对象都是迭代器类型。
  • list、dict、str等是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转换成迭代器。
  • Python的for循环本质上就是通过不断调用next()函数实现的。
'''
 - [ ] List item

for 循环 iterable
__iter__()将对象转为了迭代器
迭代器才会调用__next__()方法读取数据
'''
from collections import Iterable,Iterator
# isinstance()  # 返回对象是类的实例或者类的子类的实例  可以作为目标来核对
# print(isinstance('abc',Iterable))
# print(isinstance([1,2,3,4],Iterable))
# print(isinstance(1234,Iterable))
# for i in 1234:
#     print(i)  # TypeError: 'int'对象不可迭代
'''
__next__()只能顺延调用,不能往前
可迭代的对象不一定是迭代器
'''
li = [1,2,3,4]
# print(isinstance(li,Iterator))  # False Iterable
# li_iter = li.__iter__()
# print(li_iter)
li_res1 = iter(li)
# print(li_res1)
# print(li_res1.__next__())
# print(li_res1.__next__())
# print(next(li_res1))
# print(next(li_res1))
# print(next(li_res1))
print(li_res1[1])  # 因为迭代器不支持索引取值
# TypeError: 'list_iterator'对象不能subscriptable

生成器

yield关键字

def creatNums():
    print("---func start---")
    a,b = 0,1
    for i in range(5):
        # print(b)
        print('---1---')
        yield b
        print('---2---')
        a,b = b,a+b
        print('---3---')
    print('---func end---')
res = creatNums()
print(next(res))
print(next(res))

生成器的应用
实现多任务

'''
协程
'''
def test1():
    while True:
        print("--1--")
        yield None
def test2():
    while True:
        print("--2--")
        yield None
t1 = test1()
t2 = test2()
while True:
    next(t1)
    next(t2)
g = (x for x in range(5))  # generator
# print(g)
# print(next(g))
# print(next(g))
# print(next(g))
# # 超出会抛出异常 StopTteration
# for i in g:
#     print(i)
'''
生成自定义长度的列表
当函数遇到yield关键字时,函数会暂停,并将对象返回出去,下次会继续上次暂停的地方执行
当函数遇到return关键字,函数直接返回该对象。
'''
# def yield_test(number):
#     li = []
#     n = 0
#     while n<number:
#         # li.append(n)
#         yield n
#         n+=1
#     # print(li)
# res = yield_test(20)
# # print(res)
# # for i in res:
# #     print(res)
# print(next(res))
# print(next(res))
'''
send()获取下一个值。只是在获取下一个值的时候给上一个yield的位置传递一个数据
1.send()不能是第一个,也不能是最后一个
'''
def test():
    a1 = yield "hello"
    print('---1---')
    yield a1
res = test()
print(next(res))
print(res.send('world'))
发布了30 篇原创文章 · 获赞 0 · 访问量 696

猜你喜欢

转载自blog.csdn.net/luobofengl/article/details/104210050
今日推荐