zoukankan      html  css  js  c++  java
  • Python开发——函数【迭代器、生成器、三元表达式、列表解析】

    递归和迭代

       小明问路篇解释说明

    • 递归:小明——>小红——>小于——>小东;小东——>小于——>小红——>小明

        小明向小红问路,因小红不知道,所以向小于问路,因小于不知道,所以向小东问路,

        小东知道路,告诉小于,小于知道后,告诉小红,小红知道后,告诉小明

    • 迭代

          小明向小红问路,因小红不知道,所以告诉小明去问小红,

        于是,小明向小于问路,因小于不知道,所以向告诉小明去问小东,

        于是,小明向小东问路,然后小东告诉小明。

    什么是迭代器协议?

    1. 迭代器协议:对象必须有一个next()方法,执行该方法,要么返回迭代的下一项,要么引起stopiteration异常,以终止迭代(只能往后走,不能往前退)
    2. 可迭代对象:实现了迭代器协议的对象(如何实现?对象内部有一个__iter__()方法。)。
    3. 协议是一种约定,可迭代对象实现了可迭代协议,Python的内部工具(如:for循环,sum、min、max函数等)使用迭代器协议访问对象。

    for循环

    1. for循环的本质就是遵循迭代器协议去访问对象,但for循环的对象不一定是可迭代对象
    2. 字符串、列表、元祖、字典、集合、文件对象,这些都不是可迭代对象,只不过在for循环时调用了他们内部的__iter__()方法,把他们变成了可迭代对象。然后for循环调用可迭代对象的__next__()方法去取值,而且for循环会捕捉stopiteration异常,以终止迭代
    3. for循环是基于迭代器协议提供了一个统一的可以遍历所有对象的方法(不仅序列类型可以使用,非序列类型,如:字典,集合,文件对象也可以使用)
     1 s = 'hello'
     2 # print(dir(s))
     3 # 字符串(不可迭代对象)有__iter__()方法
     4 # 遵循迭代器协议,生成可迭代对象liter_test
     5 liter_test = s.__iter__()
     6 print(liter_test)   # <str_iterator object at 0x0352E9F0>
     7 print(liter_test.__next__())    # h
     8 print(liter_test.__next__())    # e
     9 print(liter_test.__next__())    # l
    10 print(liter_test.__next__())    # l
    11 print(liter_test.__next__())    # o
    1 # 集合
    2 s = {1,2,3}
    3 # 集合(不可迭代对象)有__iter__()方法
    4 # 遵循迭代器协议,生成可迭代对象iter_s
    5 iter_s = s.__iter__()
    6 print(iter_s)       # <set_iterator object at 0x056CB260>
    7 print(iter_s.__next__())    # 1
    8 print(iter_s.__next__())    # 2
    9 print(iter_s.__next__())    # 3

    生成器

     什么是生成器?可以理解为一种数据类型,自动实现了迭代器对象(其他的数据类型需要调用自己内置的__iter__方法,生成器不用,因为其下有__next__()方法或next()方法),所以生成器就是可迭代对象

    生成器在Python中的表达形式?

    生成器函数:常规函数定义,但是函数中包含yield,取代return,作为返回值;

          yield特性:可以返回值,多次yield,保存状态

    生成器函数
    1
    def t(): 2 yield 3 yield 1 4 yield 3 5 g = t() 6 print(g) # <generator object t at 0x04932CC0> 7 print(g.__next__()) # None 8 print(g.__next__()) # 1 9 print(g.__next__()) # 3

    生成器表达式

    1. 列表解析的中括号[]换成小括号()就是生成器表达式
    2. 列表解析和生成器表达式都是一种便利的编程方式,生成器更节省内存
    3. Python不但使用迭代器协议,让for循环变得更加通用,大部分的内置函数,也是使用迭代器协议访问对象,例如:sum函数的Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以我们可以直接计算以下一系列的和
    1 print(sum(x**2 for x in range(4)))  # 14
    2 # 而不用
    3 print(sum([x**2 for x in range(4)]))    #14
    生成器表达式
    生成器表达式
    1
    l = (i for i in range(10)) 2 print(l) # <generator object <genexpr> at 0x04ADBB10> 3 print(l.__next__()) # 0 4 print(next(l)) # 1 5 print(l.__next__()) # 2 6 print(next(l)) # 3 7 # ····

    三元表达式

    'true' if name == 'yuan' else 'false'
    1 ################--三元表达式--####################
    2 name = 'yuan'
    3 res = 'true' if name == 'yuan' else 'false'
    4 print(res)    # true
    5     

    列表解析

      中括号[]+三元表达式——>列表,很方便的生成列表,缺点:生成真实列表,数据量大时,消耗内存

      [ i for i in range(10) if i > 5]  三元表达式

     1 ################--列表解析--#######################
     2 egg_list = []
     3 for i in range(10):
     4     egg_list.append(i)
     5     # egg_list.append('鸡蛋%s'%i)
     6 print(egg_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     7 
     8 
     9 l = [i for i in range(10)]
    10 # l = ['鸡蛋%s'%i for i in range(10)]
    11 print(l)    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    12 
    13 # 三元表达式
    14 li = [i for i in range(10) if i > 5]
    15 print(li)   # [6, 7, 8, 9]
  • 相关阅读:
    开启CTF大门
    关于windows下scapy出现log_runtime问题
    Python关于Threading暂停恢复解决办法
    angr入门之CLE
    Linux信号量
    IDApython 命令
    Array 数组对象
    随机数 random()
    四舍五入round()
    向下取整floor()
  • 原文地址:https://www.cnblogs.com/yuanlili/p/8650547.html
Copyright © 2011-2022 走看看