• python-迭代器、生成器、内置函数


    一、迭代器

    迭代器是迭代取值的工具,迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的.

    为什么要用迭代器呢?

      1.可以不依赖索引取值

      2.同一时刻在内存中只有一个值,不会过多的占用内存

    如何用迭代器?

      可迭代的对象:但凡内置有__iter__方法的对象都是可迭代的对象,列如str,list,dict,tuple,set,文件对象

      迭代器对象:即内置有__iter__方法又内置有__next__方法的对象称之为迭代器对象,如文件对象

    可迭代对象.__iter__()-------->迭代器对象

    迭代器对象.__tier__()-------->迭代器本身

    迭代器对象.__next__()--------->迭代器的下一个值

    总结迭代器:

      优点:1.可以不依赖索引取值

            2.同一时刻在内存中只有一个值,不会过多的占用内存

      缺点:

         1.不如按照索引取值或者key取值的方式灵活

         2.无法预测迭代器所包含值的长度

    二、生成器

    生成器本质上就是一种自定义的迭代器

    函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象

    def func():
        print('first')
        yield 1
        print('second')
        yield 2
        print('third')
        yield 3
        print('fourth')
    
    g=func()
    print(g)  #生成器对象
    res1=next(g) #会触发函数的执行,直到碰到一个yield停下来,并且将yield后的值当作本次next的结果返回
    print(res1)# 返回值1

    自定义生成一个和内置函数range功能一样的生成器:

    def my_range(start,stop,step=1):
        while start < stop: # 3 < 3
            yield start
            start+=step #start=3
    
    obj=my_range(1,5,2) # 1 3  把函数赋值给一个变量名,这个变量名就是生成器,迭代器
    
    print(next(obj))
    print(next(obj))

    了解知识点:yield的表达式形式的应用:x=yield

    # def dog(name):
    #     print('狗哥 %s 准备开吃' %name)
    #     food_list=[]
    #     while True:
    #         food=yield food_list #  food=yield='肉包子'
    #         print('%s 吃了 %s' %(name,food))
    #         food_list.append(food)
    
    # g=dog('alex')
    
    # 强调:针对表达式形式的yield的使用,第一步必须让函数先暂停到一个yield的位置,才能进行传值操作
    # next(g) # 张开狗嘴,让生成器先暂停到yield的位置,准备接收外部传进来的值
    # res1=next(g) #g.send(None)
    # print(res1)
    
    # res2=g.send('屎包子') # 1. 先为当前暂停位置的yield赋值 2. next(生成器)直到再次碰到一个yield停下来,然后其的值当做本次next的结果
    # print(res2)
    
    # res3=g.send('肉包子')
    # print(res3)
    
    # res4=g.send('泔水')
    # print(res4)

    总结yield:只能在函数内使用

    1.yield提供了一种自定义迭代器的解决方案

    2.yield可以保存函数的暂停的状态

    3.yield对比return

      1.相同点:都可以返回值,返回的类型与个数都没有限制

      2.不同点:yield可以返回多次值,而return只能返回一次函数就结束了

    生成器表达式:

    # g = (i**2 for i in range(1,6) if i>3)  和列表表达式的区别就是"()"

    三、内置函数(简单内置函数,前面接触过的就不介绍了)

    all():如果里面的对象是真的就返回真,如果为空也返回真

    print(all([1,'',None]))#False
    print(all([1,2,'aaa']))#True
    print(all([]))#True
    print(all(''))#True

    any():有一个为真就返回真,为空时返回假

    print(any([0,'',None,False,1]))#True
    print(any([0,'',None,False]))#False
    print(any([]))#False

    callable:判断函数是否可调用

    Return whether the object is callable

    ASCII码与数字转换:

    print(chr(65))#A
    print(chr(90))#Z
    
    print(ord('a'))#97
    print(ord('z'))#122

    divmod(x,y):分页

    Return the tuple (x//y, x%y)
    
    print(divmod(3003,20))#(150, 3)

    eval:动态地执行一个表达式的字符串,或者compile函数编译出来的对象

    print(eval('1+2+3+4'))
    res=eval('[1,2,3]')
    print(res,type(res))

    frozenset()返回一个冻结的集合,集合冻结后不能再添加删除任何元素

    pow()pow(2,3,3) #(2**3)%3

    reversed():反转列表

    l=[1,'a','3',3]
    l1=reversed(l)
    print(list(l1))

    round():取近似数

    print(round(3.5))#4
    print(round(3.3))#3

    slice():保存一个切片

    l=['a','b','c','d','e']
    s='helloworld'
    obj=slice(1,5,2)
    
    # print(l[1:5:2])
    print(l[obj])#['b', 'd']

    zip():拉链函数

    l=[1,2,3,4,5,6,7]
    s='hello'
    
    res=zip(l,s)
    print(list(res))#[(1, 'h'), (2, 'e'), (3, 'l'), (4, 'l'), (5, 'o')]

    filter():函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

    def is_odd(x):
        return x % 2 == 1
    filter(is_odd, [1, 4, 6, 7, 9, 12, 17])#[1, 7, 9, 17]

    删除 None 或者空字符串:

    def is_not_empty(s):
        return s and len(s.strip()) > 0
    filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
    #['test', 'str', 'END']

    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

     L = [1,2,3,4,] 
    def pow2(x): 
    ... return x*x 
    ... 
    map(pow2,L) 
    #[1, 4, 9, 16]

    sorted()对list、dict进行排序

    l=[1,4,3,4,9,6,2]
    l1 = sorted(l)
    print(l1)#[1, 2, 3, 4, 4, 6, 9]
  • 相关阅读:
    REVERSE!REVERSE!REVERSE!
    java和数据结构的面试考点
    39. recover rotated sorted array恢复旋转排序数组
    33. Search in Rotated Sorted Array旋转数组二分法查询
    搜索旋转排序数组 II
    Eclipse 查找
    在Java中返回多个值
    Java的标识符
    fwprintf (File input/output) – C 中文开发手册
    CSS盒子模型介绍 | CSS Box Model: Introduction to the CSS box model (Miscellaneous Level 1) – CSS 中文开发手册
  • 原文地址:https://www.cnblogs.com/mangM/p/9430393.html
Copyright © 2020-2023  润新知