zoukankan      html  css  js  c++  java
  • 第十三天:迭代器、递归

    迭代器

    迭代器不是一个函数,它就是一个称呼

    可迭代对象

    含有.__iter__方法的数据类型就叫做可迭代对象

    x = 0
    
    s = 'abc'
    s.__iter__()
    lt = [1,2,3]
    lt.__iter__()
    tup = (1,)
    tup.__iter__()
    dic = {'a':1}
    dic.__iter__()
    se = {1}
    se.__iter__()
    

    只有数字类型不能点出来__iter__方法,所以只有数字类型不是可迭代对象,其余数据类型都是可迭代对象。

    迭代器对象

    迭代器提供了一种不依赖索引取值的方式

    含有._iter__方法和 .__next__的就叫做迭代器对象

    可迭代对象使用__iter__后可以变为迭代器,迭代器使用__iter__后依然是迭代器

    只有文件是可迭代器对象,只用文件在不用iter方法时可以使用__next__方法

    for循环的原理

    for循环本质就是一个while循环,只不过是一个可以定可控的while循环

    dic_iter = dic.__iter__()
    while True :
    	try :
    		print(dic_iter.__next__())
    	except StopIterration:
    		break
    	
    

    三元表达式

    a = 10
    b = 20
    if a < b
    	print(a)
    else:
    	print(b)
    	
    	
    	
    # 三元表达式写法
    print(a if a<b else b)
    

    列表推导式

    # 生成一个0-9的列表
    
    lt = []
    for i range (10)
    	lt.append(i)
    print(lt)
    
    # 列表推导式
    print([i for in range(10)])
    

    字典生成式

    dic = {}
    for i in range(10)
    	dic[i] = i
    print(dic)
    
    
    # 字典生成式
    print({i :i for i in range(10)})
    
    

    zip()方法

    res = zip([1,2,3],[1,2,3],'abc') # res 是一个迭代器,__iter__返回元组
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())
    print(res)
    
    
    # (1, 1, 'a')
    # (2, 2, 'b')
    # (3, 3, 'c')
    # <zip object at 0x0000025909DFDD88>
    
    
    # 通过zip使两个列表生成字典
    lt1 = [1,2,3]
    lt2 = ['a','b','c']
    
    print({k: v * 2 for k ,v in zip(lt1,lt2)})
    # {1: 'aa', 2: 'bb', 3: 'cc'}
    

    生成器生成式

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

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

    def scq():
    	yeild 3
    	yelid 4
    print(scq())
    # <generator object scq at 0x000001E1F3DC0830>
    res = scq()
    print(res.__next__)
    print(res.__next__)
    

    yield的作用:

    1. 暂停函数
    2. 通过调用函数拿到值
    def range1(start)
    	count = 0
    	while count <0:
    		yield count
    		count += 1
    res = range1(10)
    print(res.__next__)
    print(res.__next__)
    print(res.__next__)
    

    递归

    递归就是函数内部直接或间接调用函数本身

    递归的实现

    函数+分支语句

    递归本身是一个函数,需要函数定义的方式去描述

    函数内部,采用分支语句对输入的参数进行判断,不能陷入死递归

    递归函数的两个特性:

    链条:计算过程中存在规律

    基例:退出的条件也就是递归的最末端,存在一个或多个不需要再递归的基例。

    每一次递归都不会结束函数,并且每一次递归都会开辟内存空间,将函数拷贝一份进去继续执行,直到退出条件成立,完成递归。

    # 每次加2
    def age(x):
        if x == 0:
            return 18
        x -= 1
        return age(x) + 2
    
    
    res = age(6)
    print(res)  # 32
    
    
    # 计算n的阶乘
    def fact(n):
        if n = 0:
            return 1
        else:
            return n*fact(n-1)
    
    

    当传的初值为6时,因为它不等于0,所以他会执行age(5)+2

    但是他也不知道age(5)的值,所以计算机就会开辟一个新的内存空间去计算age(5)的值,同理计算机会一直计算age(4),age(3)直到x == 0,得到age(0)的值,然后再逐步把值传给age(1),age(2),直到age(6).最后得出age(6)的值。

  • 相关阅读:
    centos 7修改时间为中国时间
    颜色表及html代码
    前端日志监控体系
    测试开发必备技能:安全测试漏洞靶场实战
    Jmeter(三)----win10系统下如何修改Jmeter字体大小?
    Jmeter(二) ---Jmeter英文版本修改为中文
    Jmeter(一) ---Windows环境搭建
    跟着高手学复盘_初步理解
    小测试对 HTTP/2 的了解
    软件测试入坑建议
  • 原文地址:https://www.cnblogs.com/lyyblog0715/p/11581229.html
Copyright © 2011-2022 走看看