• day 13小结


    1.迭代器

    迭代器:不是函数,只是一个称呼

    python中一些皆对象(数据类型)

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

    x = 10  # 不是可迭代对象
    
    s = 'abc'
    s.__iter__()
    
    lt = [1,2,3]
    lt.__liter__()
    
    tup = (1,)
    tup.__liter__()
    
    dic = {'a': 1}
    dic.__iter__
    
    se = {1}
    se.__iter__()
    
    fw = open('text.txt', 'a+', encoding='utf8')
    fw.seek(0,0)
    fw.__iter__
    

    除了数字类型,所有数据类型都是可迭代对象

    s = 'abc'
    s_iter = s.__iter__()
    print(s_iter.__next__())
    print(s[0])
    print(s_iter.__next__())
    print(s[1])
    print(s_iter.__next__())
    print(s[2])
    
    
    dic = {'a':1,'b':2,'c':3}
    dic_iter = dic.__iter__()
    print(dic_iter.__next__())
    print(dic_iter.__next__())
    print(dic_iter.__next__())
    
    
    fw_iter = fw.__iter__()
    print(fw_iter.__iter__())
    print(fw_iter.__iter__())
    print(fw_iter.__iter__())
    

    迭代器对象:含有__iter__ 和 __next__方法的对象就是迭代器对象

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

    for循环的原理(for循环本质就是一个while循环,只不过是一个一定可控的while循环)

    dic = {'a':1, 'b':2, 'c':3,}
    
    print(dic_iter.__next__())
    print(dic_iter.__next__())
    print(dic_iter.__next__())
    print(dic_iter.__next__())
    
    # 如果用C写,这就是for循环
    
    dic_iter = dic.__iter__()
    while True:
        try:
            print(dic_iter.__next__())
    	except StopIteratino:
            break
            
            
    for i in dic:  # for循环 --》迭代循环
        print(i)
        
        
    print(dic.__iter__())
    print(dic.__iter__())
    
    fw.__iter__()
    fw.__next__()
    
    for i in fw: # fw.iter = fw.__iter__()
        print(i)
        
        
    # C写
    def for1(iterable):
        iterator = iterable.__iter__()
        while True:
            try:
                print(iterator.__next__())
            except StopIteration:
                break
                
    for([1,2,3])
            
    

    可迭代对象:含有__iter__ 方法叫做可迭代对象--》 除了数字类型都是可迭代对象 --》可迭代对象使用 __iter__变成可迭代器

    迭代器对象:含有 _iter_ 和 _next_ 方法叫做迭代器对象--》 只有文件时迭代器对象--》迭代器使用 __iter__依然是迭代器

    可迭代对象不一定是迭代器对象;迭代器对象一定是可迭代对象

    2.三元表达式

    x = 10
    y = 20
    
    if x > y
    	print(x)
    else:
        print(y)
        
    三元表达式---》三目表达式
    
    print(x) if x > y else print(y)  -->仅作了解
    # 条件成立走这里 if 条件 else 条件不成立走这里
    

    3.列表推导式

    lt = []
    
    for i in range(10):
    	lt.append(i)
        
        
    lt = [i**2 for i in range(10)]
    # lt = [i**2(可做运算) for i in [1,2,3]]
    lt = [i**2 for i in [1,2,3]]
    
    print(lt)
    

    from typing import Iterable # 到处一个可迭代对象类型

    print(isinstance(range(10), Iterable)) # 判断是否属于该数据类型

    4.字典生成式

    dic = {}
    
    for i in range(10):
        dic[i] = i
        
    print(dic)
    
    dic = {i:i**2 for i in range(10)}
    print(dic)
    
    
    zip()
    res = zip([1,2,3],[4,2,4.5,3,2,3,2,],'agabcxbds')  # res是一个迭代器,__next__返回元组
    print(res.__next__())  # type:tuple
    print(res.__next__())  # type:tuple
    print(res.__next__())  # type:tuple
    
    lt1 = ['a','b','c']
    lt2 = [1,2,3]
    
    dic = {k: v ** 2 for k, v in zip(lt1,lt2)}
    print(dic)
    
    lt = list('abc')
    print(lt)
    

    5.生成器生成式

    # 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)
    
    # 生成器表达式:看成老母鸡,节省内存空间,用就下蛋
    # 列表推导式:看成一筐鸡蛋,非常占用内存空间
    
    

    6.生成器

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

    def func():
        pass
    
    print(func())
    
    def ge():
        yield 3  # 一个yield相当于一个next;暂停函数
        yield 4
        
    # print(ge())  # ge()得到一个生成器--》生成器本质就是迭代器
    
    g = ge()  # 得到一个生成器
    
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    
    for i in g:
        print(i)
        
        
    # yield的特性
    
    #1、暂停函数
    #2、通过next取值
    
    # return的特性
    
    #1、终止函数
    #2、通过调用函数拿到值
    
    # 写一个range方法
    
    # 1.生成器
    # 2.可变长参数
    
    def range(start):
        count = 0
        while count < start:
            yield count
            count += 1
    
    for i in range(10):
        print(i)
    

    7.递归

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

    import sys
    sys.setrecursionlimit(10)
    printt(sys.getrcursionlimit())
    
    def a():
        x = 1
        print(x)
        a()
        
    a()
    
    # 每一次递归,会不会结束函数?不会,并且每一次递归都会开辟内存空间,如果一直开辟内存就会撑爆,最多递归1000次
    
    # 真正的递归必须要有推退出条件
    
    count = 0
    
    def a()
    	global count
        count += 1
        print(count)
        if count == 5:
            return
        a()
        
    a()
    

    递归:

    1. 函数内部必须调用自己
    2. 必须要有退出条件
    3. 递归必须要有规律
    # 玉阳 20岁 ; 后面的同学大2岁,后面的后面的同学比后面的同学大2岁; 求第6位同学的年龄
    
    '''
    20
    20 + 2
    20 + 2 + 2
    20 + 2 + 2
    '''
    
    
    def age(x):
        if x == 0:
            return 18
        x -= 1
        return age(x) + 2
    
    
    res = age(6)
    print(res)  # 32
    
    '''
    res = 30 
    res = 28 + 2
    res = 26 + 2 + 2
    res = 24 + 2 + 2 + 2
    res = 22 + 2 + 2 + 2 + 2
    res = 20 + 2 + 2 + 2 + 2 + 2
    res = 18 + 2 + 2 + 2 + 2 + 2 + 2
    '''
    
  • 相关阅读:
    PHP userAgent解析 PHP
    VB 2 C# 语法对比图
    HTML特殊字符数据库读写处理
    备份数据库
    Rose建模初步 [来自:UMLChina]
    ASP下的二级联动(XML方式)
    VSS使用手册
    管理项目的好助手——VSS入门
    【转】VB.NET的阳历与农历转换的算法
    GIF, JPEG和PNG
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11580154.html
Copyright © 2020-2023  润新知