python-day13~14_迭代器_生成器

 1,迭代器

# print(dir([]))   #告诉我列表拥有的所有方法

# 只要是能被for循环的数据类型 就一定拥有__iter__方法
# print([].__iter__())
# 一个列表执行了__iter__()之后的返回值就是一个迭代器


# Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的
# [].__iter__() 迭代器 -- > __next__ #通过next就可以从迭代器中一个一个的取值

# 只要含有__iter__方法的都是可迭代的 —— 可迭代协议

# 双下方法
# print([1].__add__([2]))
# print([1]+[2])

# class A:
  # # def __iter__(self):pass
  # def __next__(self):pass
#
# a = A()
# print(isinstance(a,Iterator))
# print(isinstance(a,Iterable))


# 迭代器的概念
# 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器

# 迭代器协议和可迭代协议
# 可以被for循环的都是可迭代的
# 可迭代的内部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值,遇到yield会停下,没遇到yield会报错

#for
#只有 是可迭代对象的时候 才能用for
#当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代

# for i in l:
  # pass
#iterator = l.__iter__()
#iterator.__next__()

#迭代器的好处:
  # 从容器类型中一个一个的取值,会把所有的值都取到。
  # 节省内存空间
    #迭代器并不会在内存中再占用一大块内存,
      # 而是随着循环 每次生成一个
      # 每次next每次给我一个

2,生成器函数

#生成器函数
# def generator():
  # print(1)
  # return 'a'
#
# ret = generator()
# print(ret)

#只要含有yield关键字的函数都是生成器函数
# yield不能和return共用且需要写在函数内
# 程序遇到yield会暂停,并返回yield后面的值。yield关键字后面如还有代码,则生成器仍驻留在内存中,可被接着调用
# def generator():
  # print(1)
  # yield 'a'
# #生成器函数 : 执行之后会得到一个生成器作为返回值
# ret = generator()
# print(ret)
# print(ret.__next__())

# def generator():
  # print(1)
  # yield 'a'
  # print(2)
  # yield 'b'
  # yield 'c'
# g = generator()
# for i in g:
  # print(i)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)

3,

# def generator():
  # print(123)
  # content = yield 1
  # print('=======',content)
  # print(456)
  # arg = yield 2
  # ''''''
  # yield  #如果生成器最后一个yield之后没有返回值,但还有代码要跑,也需要用一个空yield来结束
# g1 = generator()
# g2 = generator()
# g1.__next__()
# g2.__next__()
# print('***',generator().__next__())
# print('***',generator().__next__())

# g = generator()
# ret = g.__next__()
# print('***',ret)
# ret = g.send('hello') #send的效果和next一样
# print('***',ret)

#send 获取下一个值的效果和next基本一致
#只是在获取下一个值的时候,给上一yield的位置传递一个数据
#使用send的注意事项
  # 第一次使用生成器的时候 是用next获取下一个值
  # 函数中的最后一个yield不能接受外部的值

4,预激生成器,预激生成器的装饰器

5,生成器表达式

# egg_list=['鸡蛋%s'%i for i in range(10)]    #列表推导式

#生成器表达式
# g = (i for i in range(10))
# print(g)  #生成器
# for i in g:
  # print(i)

生成器Generator:
  本质:迭代器,所以拥有__iter__方法和__next__方法
  特点:惰性运算,开发者自定义
使用生成器的优点:
延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用

#列表解析
sum([i for i in range(100000000)])#内存占用大,机器容易卡死
 
#生成器表达式
sum(i for i in range(100000000))#几乎不占内存

6,推导式

#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]   #遍历之后挨个处理
#[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]     #筛选功能

# #30以内所有能被3整除的数
# ret = [i for i in range(30) if i%3 == 0] #完整的列表推导式
# g = (i for i in range(30) if i%3 == 0) #完整的生成器推导式
# print(ret)

#字典推导式

# 例一:将一个字典的key和value对调
# mcase = {'a': 10, 'b': 34}
# #{10:'a' , 34:'b'}
# mcase_frequency = {mcase[k]: k for k in mcase}
# print(mcase_frequency)

#集合推导式,自带结果去重功能
# squared = {x**2 for x in [1, -1, 2]}
# print(squared)

作业:www.cnblogs.com/eva-j/articles/7213953.html

猜你喜欢

转载自www.cnblogs.com/yygy/p/10128800.html
今日推荐