zoukankan      html  css  js  c++  java
  • 迭代器与生成器

    迭代器

    迭代的对象

    可迭代的对象

    凡有_iter_方法的对象,都是可迭代对象

    可迭代对象:python内置str,list.,tuple,dict,set,file

    可迭代对象

    可迭代对象执行__iter__方法得到返回值,并且可迭代对象会有一个__next__方法。

    s='hello'
    iter_s = s._iter_()
    while true:
    	try:
    		print(iter_s__next__())
    	except stoplteration:
    		break
    

    h
    e
    l
    l
    o
    

    迭代器对象:执行可迭代对象__iter__方法,拿到返回值就是迭代器对象。

    特点:

    1,内置__next__方法,执行该方法会拿到迭代器对象中的一个值

    2,内置__iter__方法,执行该方法会拿到迭代器本身

    3,文件本身就是迭代器本iey身

    缺点:

    1,取指麻烦只能一个一个取,值取了就没了

    2,无法使用len()方法获取长度

    for循环原理

    for循环称为迭代器循环,in后必须是可迭代对象

    因为迭代器使用__iter__后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象。

    由于对可迭代对象使用__iter__方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__后才会吐出一个一个值。如lis = [1,2,3,4,5,...]相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__相当于一只老母鸡,如果你需要蛋,只需要__next__即可。

    三元表达式与列表推导式

    条件成立的返回值if条件else不成立时的返回值

    x = 10
    y = 20
    print(f'x if x>y else y:{x if x>y else y}')
    
    x if x>y else y:20
    

    列表推导式

    [expression for item1 in iterable1 if condition1
    for item2 in iterable2 if condition2
    ...
    for itemN in iterableN if conditionN
    ]
    类似于
    res=[]
    for item1 in iterable1:
        if condition1:
            for item2 in iterable2:
                if condition2
                    ...
                    for itemN in iterableN:
                        if conditionN:
                            res.append(expression)
    
    print(F"[i for i in range(10)]: {[i for i in range(10)]}")
    [i for i in range(10)]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(F"[i**2 for i in range(10)]: {[i**2 for i in range(10)]}")
    [i**2 for i in range(10)]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    字典生成式

    print({i:i**2 for i in range(10)})
    
    {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
    

    zip()方法

    keys = ['name', 'age', 'gender']
    values = ['nick', 19, 'male']
    
    res = zip(keys, values)
    print(F"zip(keys,values): {zip(keys,values)}")
    
    info_dict = {k: v for k, v in res}
    print(f"info_dict: {info_dict}")
    
    zip(keys,values): <zip object at 0x11074c088>
    info_dict: {'name': 'nick', 'age': 19, 'sex': 'male'}
    

    生成器

    yield关键字

    yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。

    def func():
    	print(1)
    	yield
    	print(2)
    g = func()
    print(g)
    
    <generator object func at 0x10ddb6b48>
    

    总结

    yield:

    1. 提供一种自定义迭代器的方式
    2. yield可以暂停住函数,并提供当前的返回值

    yield和return:

    1. 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
    2. 不同点:return只能返回一次之;yield可以返回多次值

    生成式表达式与列表推导式

    • 列表推导式[]换成()就是生成器表达式
    • 有点:省内存,一次只产生一个值在内存中
    • 列表推导式相当于给你一筐鸡蛋, 生成器表达式相当于给你一只老母鸡
    # 列表推导式
    with open('52.txt', 'r', encoding='utf8') as f:
        nums = [len(line) for line in f]
    
    print(max(nums))
    
    # 生成器表达式
    with open('52.txt','r',encoding='utf8') as f:
        nums = (len(line) for line in f)
    
    print(max(nums)) # ValueError: I/O operation on closed file.
    
    
  • 相关阅读:
    Python 30分钟入门——数据类型 &amp; 控制结构
    POJ 3101 Astronomy
    Java8 Lamdba表达式 001
    浅谈PPM (Project Portfolio Management)
    char* 和char[]的差别
    福州大学第十一届程序设计竞赛
    用 Python 测试框架简化测试
    15个最受欢迎的Python开源框架
    python测试框架总结
    python测试框架--nose
  • 原文地址:https://www.cnblogs.com/1naonao/p/10986657.html
Copyright © 2011-2022 走看看