Python学习之路--迭代器,生成器

迭代器

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

# 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:#     i## for k in dic:#     pass

# list# dic# str# set# tuple# f = open()# range()# enumerate# print(dir([]))   #告诉我列表拥有的所有方法# ret = set(dir([]))&set(dir({}))&set(dir(‘‘))&set(dir(range(10)))# print(ret)  #iterable# print(‘__iter__‘ in dir(int))# print(‘__iter__‘ in dir(bool))# print(‘__iter__‘ in dir(list))# print(‘__iter__‘ in dir(dict))# print(‘__iter__‘ in dir(set))# print(‘__iter__‘ in dir(tuple))# print(‘__iter__‘ in dir(enumerate([])))# print(‘__iter__‘ in dir(range(1)))

# 只要是能被for循环的数据类型 就一定拥有__iter__方法# print([].__iter__())# 一个列表执行了__iter__()之后的返回值就是一个迭代器# print(dir([]))# print(dir([].__iter__()))# print(set(dir([].__iter__())) - set(dir([])))# print([1,‘a‘,‘bbb‘].__iter__().__length_hint__())  #元素个数# l = [1,2,3]# iterator = l.__iter__()# print(iterator.__next__())# print(iterator.__next__())# print(iterator.__next__())# print(iterator.__next__())

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

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

# print(‘__iter__‘ in dir( [].__iter__()))# print(‘__next__‘ in dir( [].__iter__()))from collections import Iterablefrom collections import Iterator# print(isinstance([],Iterator))# print(isinstance([],Iterable))

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

# l = [1,2,3,4]# for i in l.__iter__():#     print(i)

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

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

# for循环其实就是在使用迭代器# iterator# 可迭代对象# 直接给你内存地址# print([].__iter__())# print(range(10))

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

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

#迭代器的好处:    # 从容器类型中一个一个的取值,会把所有的值都取到。    # 节省内存空间        #迭代器并不会在内存中再占用一大块内存,            # 而是随着循环 每次生成一个            # 每次next每次给我一个# range# f# l = [1,2,3,45]# iterator = l.__iter__()# while True:#     print(iterator.__next__())

# print(range(100000000000000))# print(range(3))# print(list(range(3)))# def func():#     for i in  range(2000000):#         i = ‘wahaha%s‘%i#     return i

# 生成器 —— 迭代器# 生成器函数 —— 本质上就是我们自己写得函数# 生成器表达式l = [1,2,3,4,5]for i in l:    print(i)    if i == 2:        break

for i in l:    print(i)

生成器

本质是迭代器

生成器函数 : 执行之后会得到一个生成器作为返回值
只要含有yield关键字的函数都是生成器函数

yield不能和return共用且需要写在函数内从生成器中取值的几个方法:   __next__   for   数据类型的强制转换

def generator():
    print(1)
    yield  ‘a‘
ret = generator()
print(ret)
print(ret.__next__())
# <generator object generator at 0x00000271D5CBBE60>
# 1
# a
def generator():
    print(1)
    yield  ‘a‘
    print(2)
    yield  ‘b‘
g = generator()
print(g.__next__())
print(g.__next__())
# 1
# a
# 2
# b

def wa():    for i in range(2000000):        yield ‘hh%s‘%ig = wa()count = 0for i in g:    count += 1    print(i)    if count >50:        breakfor i in g:    count += 1    print(i)    if count >100:        breaksend 的获取下一个值的效果和next基本一致只是在获取下一个值的时候,给上一个yield的位置传递一个数据

def generator():
    print(123)
    num = yield 1
    print(‘3333‘,num)
    print(456)
    yield 2
    print(789)

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

·  第一次使用生成器的时候 使用next获取下一个值

最后一个yield不能接受外部的值

def average():
    sum = 0
    count = 0
    avg = 0
    num = yield
    sum += num
    count += 1
    avg = sum/count
    yield avg
avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
print(avg1)#10

def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        # num = yield
        num = yield avg
        sum += num
        count += 1
        avg = sum/count
avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)

带装饰器

def init(func):
    def inner(*args,**kwargs):
        g = func(*args,**kwargs)
        g.__next__()
        return g
    return inner
@init
def average():
    sum = 0
    count = 0
    avg = 0
    while True:
        # num = yield
        num = yield avg
        sum += num
        count += 1
        avg = sum/count
avg_g = average()
avg1 = avg_g.send(10)
print(avg1)

yield from

def generator():
    a = ‘abcde‘
    b = ‘12345‘
    yield from a
    yield from b

g = generator()
for i in g:
    print(i)

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

#括号不一样,返回的值不一样== 几乎不占用内存

原文地址:https://www.cnblogs.com/rssblogs/p/10932634.html

时间: 2024-07-29 08:32:58

Python学习之路--迭代器,生成器的相关文章

Python学习---装饰器/迭代器/生成器的学习【all】

Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210 原文地址:https://www.cnblogs.com/ftl1012/p/9484145.html

Python学习之路 - yield生成器,迭代器

生成器 把结果保存成生成器的状态,普通的函数中出现yield,就变成生成器. 1.Python 3.3 中 xrange已合并到range. 1 i = range(10) 2 print (i) 3 4 =>range(0, 10) 2. yield 生成器. 1 def func(): 2 print(111) 3 yield 1 4 print(222) 5 yield 2 6 print(333) 7 yield 3 8 return "done" 9 10 k = fu

python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: 1 >>> g = (x * x for xin range(10)) 2 >>> g3 <generator object <genexpr> at 0x1022ef630> 此处g就是一个生成器. 迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是gene

从零开始的Python学习Episode 12——迭代器&amp;生成器

生成器 列表生成式 用于快速地生成一个列表 a = [x*x for x in range(1,9)] print(a) #输出[1, 4, 9, 16, 25, 36, 49, 64] 也可以用于生成函数结果的列表 def f(n): return n**3 a = [f(x) for x in range(1,9)] print(a) #输出[1, 8, 27, 64, 125, 216, 343, 512] 迭代器 迭代器是一个带状态的对象,他能在你调用 next() 方法的时候返回容器中

python学习之路:生成器并行运算

异步IO的雏形: 简单的单线程下的并行效果 import time def consumer(name): print("%s 准备吃包子啦!"%name) while True: baozi = yield print("包子[%s]来了,被[%s]吃了!"%(baozi,name)) c = consumer("ChenRongHua") c.__next__()#调用只唤醒 yield # b1="韭菜馅" # # c.

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

Python 学习之路(二)

Python 学习之路(二) 以下所用的是Python 3.6 一.条件语句 简单判断 1 if 判断条件: 2 执行语句-- 3 else: 4 执行语句-- 复杂判断 1 if 判断条件1: 2 执行语句1-- 3 elif 判断条件2: 4 执行语句2-- 5 elif 判断条件3: 6 执行语句3-- 7 else: 8 执行语句4-- 二.循环语句 2.1 while语句 和其他语言一样,不同的是多了else语句.在 python 中,while - else 在循环条件为 false

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

Python学习之路

Python学习之路 目录 Python学习之路[第一篇]:流程控制,用户交互,语法要求,变量,字符,注释,模块导入的使用 Python学习之路[第二篇]:文件,字符串,列表,元组,字典,集合的使用 更新中...