函数---迭代器&生成器&列表解析&三元表达式

可迭代对象:obj.__iter__

迭代器:iter1=obj.__iter()

1iter1.__next__

2iter2.__next__

迭代器:

优点:不依赖索引

惰性计算,节省内存

缺点:

不如按照索引的取值方便

一次性,只能往后取,不能回退

迭代器的应用:

  • 提供了一种不依赖索引的统一的迭代方法
  • 惰性计算,比如取文件的每一行

判断可是否是可迭代对象和迭代器

from collections import Iterable, Iterator # 导入模块功能

isinstance(a, Iterable) 查看a是否为可迭代对象

isinstance(a, Iterator) 查看a是否为可迭代器

迭代器:

 d={‘a‘:1,‘c‘:2,‘b‘:3}

 obj=d.__iter__()
 while 1:     #while 迭代
     try:
         i=obj.__next__()
         print(i)
     except StopIteration:
         break

 for i in d:    #for 迭代
     print(i)
字符串,列表元组,字典,集合,文件都是可迭代的,只有文件是迭代器

生成器:

生成器函数:函数体内包含有yield关键字,该函数的执行结果是生成器函数

生成器函数运行的得到生成器

生成器就是迭代器

yield的功能:

  • 与return 类似,都可以返回值,但不一样的地方在于yeild返回多次值,而return只能返回一次值
  • 为函数封装好了__iter__ 和__next__,把函数的执行结果做成一个迭代器
  • 遵循迭代器的取值方式obj.__next(),触发的函数执行,函数暂停与再继续的状态都是由yiel保存

(包含yield的函数)
  yield 可以进行返回值操作,如果后面没有yield拦住,作为返回值,会报错 StopIteration  
    def foo():
      print(111)
      yield 1 # 如果打印下面.__next__的结果的话,会打印这个返回值
      print(222)

    f = foo() # 运行这一句的时候,系统不会运行 foo(),而是直接生成一个迭代器f
    f.__next__()
    f.__next__()

 def producer():
     print(‘first------>‘)
     yield 1
     print(‘second------>‘)
     yield 2
     print(‘third------->‘)
     yield 3

 for i in producer():
    print(i)
def countdown(n):
    print(‘start countdown‘)

    while n>0:
        yield  n
        n-=1
    print(‘stop countdown‘)

for i in countdown(9):
    print(i)

列表解析
  # 要求:将 s = ‘hello‘ 放到新列表中
  [i.upper() for i in s] # for 循环得到i,将i作为列表的元素
  # 要求:判断列表 l = [1,31,73,84,57]中的元素, 如果大于30,就将i加入新列表
  res = [i for i in l if i > 30]
      加入字典的值(i)   循环( for i in l )     条件( if i > 30 )

三元表达式
  res = 2 if 2 > 3 else 3     # 正确时执行 判断条件 错误时执行
  print(res)
  结果:3            # 执行结果为 3

学习实例:

import time
def tail_func(filename,encoding=‘utf-8‘):
    with open(filename,‘r‘,encoding=encoding) as f:
        f.seek(0,2)
        while 1:
            line=f.readline()
            if line:
                yield line
            else:
                time.sleep(0.5)

def grep_func(lines,pattern):
    for line in lines:
        if pattern in line:
            print( line)

b=tail_func(‘b.txt‘)
c=grep_func(b,‘error‘)
for i in grep_func(c,‘404‘):
    print(i)

编写 tail -f a.txt |grep ‘error‘ |grep ‘404‘命令

时间: 2024-12-24 01:09:31

函数---迭代器&生成器&列表解析&三元表达式的相关文章

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

Python(五)之迭代器和列表解析

Python迭代器和列表解析 迭代器 例如: In [1]: l1 = [1,2,3,4,5] dir(i1)可以看到内置方法'__iter__' 生成一个迭代器: l1.__iter__,或i2 = iter(l1) 列表解析 列表解析:根据已有列表,高效生成新列表的方式 列表交叉生产元素为元组的列表: 列表解析扩展: 上述列表解析直接生成列表,如果列表过大,会占用过多内存,那么可以使用生成器返回一个生成器对象,如下解释:列表解析和生成器表达式关系类似于range和xrange的关系. 例如:

python 【迭代器 生成器 列表推导式】

python [迭代器  生成器  列表推导式] 一.迭代器 1.迭代器如何从列表.字典中取值的 index索引 ,key for循环凡是可以使用for循环取值的都是可迭代的可迭代协议 :内部含有__iter__方法的都是可迭代的迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 print(dir([1,2,3])) lst_iter = [1,2,3].__iter__() print(lst_iter.__next__()) print(lst_iter.__ne

Python自动化运维之7、格式化输出、生成器、迭代器、列表解析、迭代器表达式

Python格式化输出: Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] (1)百分号格式化 %[(name)][flags][width][.precision]typecode .... (name) 可选,用于选择指定的key flags 可选,可供选择的值有: + 右对齐:正数前加正好,负数前加负号: - 左对齐:正数前无符号,负数前加负号: 空

3、Python迭代器、列表解析及生成器(0530)

回顾: 1.动态语言 sys.getrefcount()    //查看对象的引用计数 增加对象的引用计数场景 对象创建时:以赋值的方式,创建变量名的同时就会创建变量 将对象添加进容器时:类似list.append() 当对象被当作参数传递给函数时 多重目标赋值时:s1 = s2 = s3 = 'abc' 为对象创建另外的变量名 减少引用计数 引用此对象的某变量名被显示销毁:del x 引用此对象的某变量名重新赋值 从容器中移除对象时,类似list.pop() 容器本身被销毁 2.if if b

列表生成式&三元表达式

列表生成式: 用于生成一个新的列表,是Python内置的一种极其强大的生成list的表达式.一.语法格式:[exp for iter_var in iterable] 工作过程: (1)迭代iterable中的每个元素: (2)每次迭代都先把结果赋值给iter_var,然后通过exp得到一个新的计算值: (3)最后把所有通过exp得到的计算值以一个新列表的形式返回. 例如: L=[i for i in range(10)] print(L)#[0, 1, 2, 3, 4, 5, 6, 7, 8,

Python内置容器(2)——字典,迭代器,列表解析

1.迭代器 iterator iter 函数,构造集合. next 方法依次返回迭代器的值 In [42]: li Out[42]: [1, 2, 3, 4, 5] In [43]: it = iter(li) In [44]: it.next() Out[44]: 1 In [45]: it.next() Out[45]: 2 当所有的元素都返回完的时候,会抛出一个StopIterator 的异常. list,tuple,set 都属于集合. for 语句,当将一个列表传递给for 语句的时候

Python 迭代器、生成器和列表解析

迭代器 迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口. Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象.即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等.迭代器有以下特性: 提供了可扩展的迭代器接口. 对列表迭代带来了性能上的增强. 在字典迭代中性能提升. 创建真正的迭代接口, 而不是原来的随机对象访问. 与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青