zoukankan      html  css  js  c++  java
  • 迭代器,生成器,递归

    迭代器

    迭代器就是迭代的工具,每一次迭代(重复)都是基于上一次的结果,计算机中的迭代开发就是基于软件的上一个版本更新

    可迭代对象

    python中一切皆对象,但不都是可迭代对象,可以使用__iter__方法的才是可迭代对象

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

    迭代器对象

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

    特点

    1. 内置__next__方法,执行该方法会拿到迭代器对象中的一个值
    2. 内置有__iter__方法,执行该方法会拿到迭代器本身
    3. 文件本身就是迭代器对象

    缺点

    1. 取值麻烦,只能一个一个取,且只能往后取,值被取后就没了
    2. 无法使用len()方法获取长度

    for循环原理

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

    迭代器使用__iter__方法后拿到的还是迭代器自身,所以for循环不用考虑in后是迭代器对象还是可迭代对象

    对可迭代对象使用__iter__方法后变成一个迭代器对象,这个迭代器对象只占用一小块内存空间,在使用__next__后才会一个一个地输出值

    三元表达式

    三元表达式就是将if...else...条件判断写在一行里得出一个值的形式

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

    列表推导式

    列表推导式是通过一行来构建我们需要的列表,但不推荐使用

    常用写法为:[结果 for 变量 in 可迭代对象]

    字典生成式

    字典生成式是通过一行来构建我们需要的字典

    lst1 = ['myz','yzm']
    lst2 = ['gao','shuai']
    dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
    print(dic)
    
    {'myz': 'gao', 'yzm': 'shuai'}
    

    zip方法

    zip方法可以像拉链一样,把两个对象一对一地作为键值对存储在字典中

    res = zip('abcd',[1,2,3,4])
    dic = dict()
    for k,v in res:
        dic[k] = v
    print(dic)
    
    {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    

    或者可以直接写成:

    print({k:v for k,v in zip('abcd',[1,2,3,4])})
    
    {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    

    生成器

    yield关键字

    在函数中如果出现yield关键字,再调用函数,就不会继续执行代码,而是返回一个值,这个功能和return类似,但有区别就是yield不会终止函数

    生成器表达式:

    # 生成器表达式
    tup = (i for i in range(10))
    print(tup.__next__())
    print(tup.__next__())
    print(tup.__next__())
    
    0
    1
    2
    
    # 列表推导式
    lis = [i for i in range(10)]
    print(lis)
    
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    生成器的好处就是不会把容器元素里的元素一下全部拿出来,用一个拿一个,极大的减少了内存的占用

    递归

    递归就是函数调用函数自己,类似于循环,但这个循环必须要有结束条件

    def f1(i):
        print(i)
        i += 1
        if i > 5:
            return 
        f1(i)
        
    f1(0)
    
    0
    1
    2
    3
    4
    5
    

    与之前的闭包外观结构不同,闭包对函数的调用在返回值里而且在函数定义之外调用

  • 相关阅读:
    struts2文件上传大小限制问题
    kindeditor使用方法
    ajaxFileUpload SyntaxError: syntax error
    Attempted to lock an already-locked dir异常解决方法
    Simditor图片上传
    心理学
    Vue.JS
    SQL Server 日常维护经典应用
    12 个 JS 技巧
    Linq to js
  • 原文地址:https://www.cnblogs.com/acate/p/10969597.html
Copyright © 2011-2022 走看看