可迭代对象

字面意思分析:可以重复的迭代的实实在在的东西。

list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)

专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象。

内置函数:dir() print(dir(str))

判断一个对象是否是可迭代对象: print('iter' in dir(str))

优点:

  1. 直观。
  2. 操作方法较多。

缺点:

  1. 占内存。
  2. 不能迭代取值(索引,字典的key)。

迭代器

字面意思:可以重复迭代的工具。

专业角度: 内部含有'__iter__'并且含有"__next__"方法的对象,就是迭代器

可迭代对象转化成迭代器:

l1 = [1, 2, 3, 4, 5]
# 内置函数iter()
obj = iter(l1)
# 迭代器可以迭代取值。利用next()进行取值
l1 = [1, 2, 3, 4, 5]
# 内置函数iter()
obj = iter(l1)
# print(obj)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))

迭代器优点:

  1. 非常节省内存。
  2. 惰性机制。

迭代器缺点:

  1. 不直观。
  2. 操作不灵活。
  3. 效率相对低。

特性:

l1 = [22, 33, 44, 55, 66, 77]
obj = iter(l1) for i in range(3):
print(next(obj)) for i in range(2):
print(next(obj))

利用while循环,模拟for循环内部循环可迭代对象的机制。

  1. 先要将可迭代对象转化成迭代器。

  2. 利用next对迭代器进行取值。

  3. 利用异常处理try一下防止报错。

  4. 可迭代对象与迭代器的对比

    可迭代对象:可迭代对象是一个操作比较灵活,直观,效率相对高,但是比较占用内存的数据集。

    迭代器:迭代器是一个非常节省内存,满足惰性机制,但是效率相对低,操作不灵活的数据集。

2.生成器初识

  • 生成器本质就是迭代器。python社区生成器与迭代器是一种。生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的。

1.生成器产生方式

  • 生成器函数。
  • 生成器表达式。
  • python给你提供的一些内置函数,返回一个生成器。
  1. 生成器函数。

    • 之前接触的函数:

      # def func():
      # print(111)
      # return 2
      # ret = func()
      # print(ret)
      # 执行此函数,遇到return结束函数。
      # 将数字2返回给ret。
    • 生成器函数: 只要函数中出现了yield那么他就不是函数,它是生成器函数

      def func():
      # print(111)
      # print(111)
      # print(111)
      # print(111)
      # print(111)
      # print(111)
      yield 2,4,5
      yield 3
      yield 4
      yield 5
      ret = func() # 生成器对象
      # print(ret) # <generator object func at 0x0000000001E10F68>
      '''
      # 类比
      l1 = [2,] [2,3,4,5]
      obj = iter(l1) '''
      # 只要函数中出现了yield那么他就不是函数,它是生成器函数。
      # 一个next对应一个yield.
      # print(next(ret))
      # print(next(ret))
      # print(next(ret))
      # print(next(ret))
      # print(next(ret))
      # print(next(ret))

2.yiled与return的区别

# return 结束函数,给函数的执行者返回值(多个值通过元组的形式返回)。
# yield 不结束函数,对应着给next返回值(多个值通过元组的形式返回)。
  1. send(了解)

    pass

  2. 生成器的举例

    # def eat_baozi():
    # list1 = []
    # for i in range(1,2001):
    # list1.append(f'{i}号包子')
    # return list1
    #
    # print(eat_baozi()) def eat_baozi_gen():
    for i in range(1,2001):
    # print(11)
    yield f'{i}号包子' '''
    # ret1 = eat_baozi_gen()
    # ret2 = eat_baozi_gen()
    # # print(ret1)
    # # print(ret2)
    # print(next(ret1))
    # print(next(ret1))
    # print(next(ret1))
    #
    # print(next(ret2))
    # print(next(ret2))
    # print(next(ret2))
    # print(next(ret))
    # print(next(ret))
    ''' # ret = eat_baozi_gen()
    #
    # for i in range(200):
    # print(next(ret))
    #
    # for i in range(200):
    # print(next(ret))

3.yiled与yiled from。

# yield from

# def func():
# l1 = [1, 2, 3]
# yield l1
# ret = func()
# print(next(ret))
# print(next(ret))
# print(next(ret)) # def func():
# l1 = [1, 2, 3]
# yield from l1
#
# '''
# yield 1
# yield 2
# yield 3
# '''
# ret = func()
# print(next(ret))
# print(next(ret))
# print(next(ret)) # yield : 对应next给next返回值
# yield from 将一个可迭代对象的每一个元素返回给next
# yield from 节省代码,提升效率(代替了for循环)

3.列表推导式

  • 列表推导式:一行代码构建一个有规律比较复杂的列表。
  • 列表推导式与之前写法对比
# l1 = [1,2,3......100]
# l1 = []
# for i in range(1,101):
# l1.append(i)
# print(l1) # 列表推导式
l1 = [i for i in range(1, 101)]
# print(l1)
  • 两种构建方式:

    1.循环模式: [变量(加工后的变量) for 变量 in iterable]

    2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]

  • 循环模式:

    # 循环模式:
    # 将10以内所有整数的平方写入列表。
    # print([i**2 for i in range(1, 11)])
    # 100以内所有的偶数写入列表.
    # print([i for i in range(2, 101, 2)])
    # 从python1期到python100期写入列表list
    # print([f'python{i}期' for i in range(1, 101)])
  • 筛选模式:

    # print([i for i in range(1, 101) if i > 49])
    # 三十以内可以被三整除的数。
    # print([i for i in range(1, 31) if i % 3 == 0])
    # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    # l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
    # print([i.upper() for i in l1 if len(i) > 3])
    # 找到嵌套列表中名字含有两个‘e’的所有名字(有难度)
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
    ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    # l1 = []
    # for i in names:
    # for j in i:
    # if j.count('e') > 1:
    # l1.append(j)
    # print(l1) print([j for i in names for j in i if j.count('e') > 1])
  • 列表推导式的优缺点:

    # 列表推导式的优缺点:
    # 优点:
    # 1, 简单,快捷,装b。
    # 缺点:
    # 2. 可读性不高,不好排错。
    # 慎用,不要入迷。

4.生成器表达式:

与列表推导式几乎一模一样。

循环模式,筛选模式。

# obj = (i for i in range(1, 11))

# # print(obj)

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))
  • 如何触发生成器(迭代器)取值?
# # 1. next(obj)

# # 2. for 循环

# # for i in obj:

# #     print(i)

# # 3. 数据转化

# print(list(obj))

# 生成器表达式:生成器 节省内存。

字典推导式,集合推导式

# 字典推导式,集合推导式:  两种模式: 循环模式,筛选模式
l1 = ['小潘', '怼怼哥','西门大官人', '小泽ml亚']
# {0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
# dic = {}
# for index in range(len(l1)):
# dic[index] = l1[index]
# print(dic)
# print({i:l1[i] for i in range(len(l1))}) # 1~100 # print({i for i in range(1, 101)})

python迭代器,生成器,推导式的更多相关文章

  1. Python之路-迭代器 生成器 推导式

    迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...

  2. 12.Python略有小成(生成器,推导式,内置函数,闭包)

    Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...

  3. python ---12 生成器 推导式

    一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数   2. ...

  4. Python迭代器生成器,私有变量及列表字典集合推导式(二)

    1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...

  5. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  6. Python——生成器&推导式

    生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...

  7. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  8. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  9. python 列表推导式,生成器推导式,集合推导式,字典推导式简介

    1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...

随机推荐

  1. u-boot-2014.04移植FL2440(使用eclipse编辑uboot)

    1.首先安装eclipse 安装指令 : apt-get install eclipse 使用上面的命令会安装好jdk 和eclipse,eclipse必须在Java环境执行,所以须要安装jdk环境. ...

  2. W5500中断寄存器的理解

    W5500中断部分,W5500中文手冊V1.0 写的不够清楚,该文是本人结合中英文手冊及自己理解,整理出有关中断部分的理解,如有不对的请指正. 一:引脚 INTn 为中断输出(Interrupt ou ...

  3. [Algorithms] The Bayes Rule

    Prior odd: The idea is to take the odds for something happening (against it not happening), which we ...

  4. 【Hibernate学习】 ——ORM(四)再次认识实体继承

    在信用办时.做失信.守信.黑名单这一块的时候.先把原来的需求看了看.紧接着就開始设计实体,这一块大部分都是同样的信息,所以就设计了一个实体,而且用一个状态标识出来是失信.守信还是黑名单. 在之后的改动 ...

  5. 《从零開始学Swift》学习笔记(Day 52)——Cocoa错误处理模式

    原创文章,欢迎转载. 转载请注明:关东升的博客 Swift错误处理模式,在Swift1.x和Swift 2.0是不同的两种模式. Swift 1.x代码错误处理模式採用Cocoa框架错误处理模式,到如 ...

  6. 背包问题的方案总数 P1474 货币系统

    背包问题的方案总数 对于一个给定了背包容量.物品费用.物品间相互关系(分组.依赖等)的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得到装满背包或将背包装至某一指定容量的方案总数. ...

  7. 第14课 SourceTree程序操作介绍

    http://www.atlassian.com/software/sourcetree/overview https://www.microsoft.com/net/framework/versio ...

  8. Beauty Contest(凸包求最远点)

    http://poj.org/problem?id=2187 题意:求凸包上最远点距离的平方 思路:开始用旋转卡壳求的最远点,WA,改了好久..后来又改成枚举凸包上的点..AC了.. #include ...

  9. 1961 躲避大龙(dfs)

    1961 躲避大龙  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 你早上起来,慢悠悠地来到学校门口,发现已经是 ...

  10. linux随便贴贴

    在bin目录下进入mysql: ./mysql -uroot -p123456 update mysql.user set password=password('root') where user=' ...