python迭代器,生成器,推导式

可迭代对象

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

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)})

原文地址:https://www.cnblogs.com/nieice/p/11083407.html

时间: 2024-11-10 17:54:42

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

(一)Python入门-4控制语句:10推导式创建序列-列表推导式-字典推导式-集合推导式-生成器推导式

推导式创建序列: 推导式是从一个或者多个迭代器快速创建序列的一种方法.它可以将循环和条件判断结合, 从而避免冗长的代码.推导式是典型的Python 风格,会使用它代表你已经超过Python初 学者的水平. 一:列表推导式 列表推导式生成列表对象,语法如下: [表达式 for item in 可迭代对象 ] 或者:{表达式 for item in 可迭代对象 if 条件判断} 1 #列表推导式 2 x = [x for x in range(1,5)] 3 print(x) 4 5 x = [x*

python 第十二章 生成器+推导式+内置函数一(不常用的)

生成器 # 迭代器:python中内置的一种节省空间的工具 # 生成器的本质就是一个迭代器 # 区别:迭代器自带的,生成器自己写的 # return可以写多个,但是只执行一次 # yield会记录执行位置 # 一个next()对应一个yield def func(): print(123) return "you" print(func()) # 123 # you # return和yield 都是返回值 # 在函数体内将return改成yield的就是一个生成器 def func(

Python——生成器&amp;推导式

生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. 生成器的构建方式: 在python中有两种方式来创建生成器: 通过生成器函数 通过生成器推导式 生成器函数: 首先我们来一个简单的函数结构: def func(): print('111') return 222 result = func() print(result) 没得问题,那么在看看生成

part4-2 流程控制二(循环结构,while、for循环,列表推导式、生成器推导式,常用工具函数,控制循环结构,4个简单实例)

循环语句在循环条件满足时,可反复执行某一段代码,这段被重复执行的代码称为循环体.在循环体中,需要在合适的时候把循环条件设置为假,从而结束循环:否则循环一直执行下去形成死循环.循环语句通常包含如下4个部分.(1).初始化语句(init_statements):在循环开始前执行,有一条或多条语句,用于完成一些起初始化工作.(2).循环条件(test_expression):一个布尔表达式,决定是否执行循环体.(3).循环体(body_statements):循环的主体,根据循环条件是否允许,这个代码

python 3列表推导式的的一点理解!

Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式,我的理解方式是从右往左看. 一点一点来看吧,我们先用range(1,100)生成一个迭代器对象(1-99的列表),然后再迭代这个列表的每一个对象,然后让每个对象执行一次平方操作,最后生成一个列表. -----------------------------分割线----------------------------------------

4-4日 列表推导式,生成器推导式

1,列表推导式就是在列表中进行for 循环if语句判断,最多两个for,一个if判断 #求1到30 被3整除的数的平方 li = [i*i for i in range(1,31)if i%3 == 0] print(li) li = [i for i in range(1,101)if i%2 == 0] l2 = [i for i in range(1,101)if i%2 == 1] print(li) print(l2) #求列表中带两个'e'名字 names = [['Tom', 'B

python基础之推导式及匿名函数和高阶函数

推导式 推导式:做一些有规律的数据结构 列表推导式: 1.普通循环 print([i for i in range(1,51)]) [加工后的变量 for 循环] print([f "学习python{i}天" for i in range(1,51)) 2.筛选模式 print([i for i in range(1,51) if i > 25]) print([i+j for i in range(2) for j in range(2)]) 字典推导式 1.普通循环 {键:

Python的列表推导式

1.列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 2.举例说明: #!/usr/bin/python # -*- coding: utf-8 -*- li = [1,2,3,4,5,6,7,8,9] print [x**2 for x in li] print [x**2 for x in li if x>5] print dict([(x,x*10) for x in li]) print [ (x, y) for

Python中的推导式

1.列表推导式 In [1]: [i**2 for i in range(1,5)] Out[1]: [1, 4, 9, 16] 2.字典推导式 In [2]: {i:i**2 for i in range(1,5)} Out[2]: {1: 1, 2: 4, 3: 9, 4: 16} 3.集合推导式 In [3]: { i for i in range(1,5)} Out[3]: {1, 2, 3, 4} 4.生成器推导式 In [11]: items = (i**2 for i in ran