• 20190924 迭代器与生成式


    迭代器

    不是函数,只是一个称呼

    1.可迭代对象

    如果给定一个list或tuple,我们可以使用for循环来遍历这个list,这种遍历我们称之为迭代

    而只要是可迭代对象,都可以用for循环进行运行,怎样判断可迭代对象?

    凡是有__iter__方法的就是可迭代对象。

    # x = 1.__iter__  # SyntaxError: invalid syntax
    # 以下都是可迭代的对象
    name = 'nick'.__iter__
    lis = [1, 2].__iter__
    tup = (1, 2).__iter__
    dic = {'name': 'nick'}.__iter__
    s1 = {'a', 'b'}.__iter__
    f = open('49w.txt', 'w', encoding='utf-8')
    f.__iter__
    f.close()
    

    总结:

    可迭代的对象:除了数字类型,其他都是可迭代对象。python内置str、list、tuple、dict、set、file都是可迭代对象

    2.迭代器

    为什么要有迭代器对象:提供了不依赖索引取值的手段

    可迭代的对象执行__iter__方法得到返回值 就是迭代器对象,特点是:

    1. 可迭代对象能使用__next__方法,执行会拿到迭代器对象中一个值
    2. 内置__iter__方法,执行会拿到迭代器本身
    3. 文件本身就是迭代器对象。

    缺点:

    1. 取值麻烦,只能一个一个取,并且只能向后取值,值取了就没了
    2. 无法使len方法获取长度
    可迭代对象: 含有__iter__方法叫做可迭代对象 --> 除了数字类型都是可迭代对象 --> 可迭代对象使用__iter__变成迭代器
    
    # 迭代器对象: 含有__iter__和__next__方法叫做迭代器对象 --> 只有文件时迭代器对象 --> 迭代器使用__iter__依然是迭代器
    
    # 可迭代对象不一定是迭代器对象; 迭代器对象一定是可迭代对象
    

    3.三元表达式

    条件判断写成一行输出。(又称三目表达式)

    x = 10
    y = 20
    if x > y:
        print(x)
    else:
        print(y)
    ########可写成##########
    
    print(x) if x > y else print(y) #  --> 仅作了解
    
    # 条件成立走这里 if 条件 else 条件不成立走这里
    

    4.列表生产式

    python内置的可以生成list的生成式

    # 生成[1*1,2*2,3*3,...,10*10]列表
    # 第一:循环
    l= []
    for i in range(1,11):
        l.append(i*i)
    print(l)
    
    

    列表生成式

    print([x * x for x in range(1, 11)])
    # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

    5.字典生成式

    dic = {}
    for i in range(10):
        dic[i] = i
    print(dic)
    

    字典生成器

    dic = {i:i**2 for i in range(10)}
    print(dic)
    

    zip

    可以使多个元素的第一个值拼接并返回元组,但只会接受最少位数

    zip()
    res = zip([1,2,3],[4,5,6,7,],'abcds')  
    # res是一个迭代器,__next__返回元组
    print(res.__next__())  # type:tuple
    print(res.__next__())  # type:tuple
    print(res.__next__())  # type:tuple
    '''
    (1, 4, 'a')
    (2, 5, 'b')
    (3, 6, 'c')
    '''
    

    生成器表达式

    generator 本质是一个迭代器==》生成器:本质就是迭代器,生成器就是一个自定义的迭代器

    g = (i for i in range(10000000))
    print(g)
    # for i in g:
    #     print(i)
    lt = [i for i in range(10000000)]
    print(lt)
    
    

    生成器表达式:看成老母鸡,节省内存空间,用就下单

    列表推导式:看成一篮子鸡蛋,清晰醒目,但占用空间

    生成器

    含有yield关键字的函数叫做生成器

    yield的特性:

    1. 暂停函数
    2. 通过next取值

    return的特效

    1. 终止函数
    2. 通过调用函数拿到值
    def ge():
        yield 3  # 一个yield相当于一个next; 暂停函数
        print(1) 
        yield 4
    # print(ge())  # ge()得到一个生成器 --> 生成器本质是迭代器
    
    g = ge()  # 得到一个生成器
    print(g.__next__())   #
    print(g.__next__())	#依次打印 3 4
     
    

    递归

    函数a内部直接调用函数a本身

    每一次递归,会不会结束函数?不会,

    并且每一次递归都会开辟内存空间,最多递归1000次

    1. 函数内部调用函数自己
    2. 必须要有退出条件
    3. 递归必须要有规律
    count = 0
    
    def a():
        global count
        count += 1
        print(count)
        if count == 5:
            return
        a()
    
    a()
    
  • 相关阅读:
    版本控制报告
    Beta—review阶段成员贡献分
    规格说明书-----吉林市一日游
    站立会议---11.16
    本周PSP
    软件需求规格说明书
    非序列化字段与反序列化完成后回调
    不同类型的委托变量的共同类型
    实现IDisposable接口的模式
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/fwzzz/p/11578939.html
Copyright © 2020-2023  润新知