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

可迭代對象

字面意思分析:能夠重複的迭代的實實在在的東西。python

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

專業角度: 內部含有'__iter__'方法的對象,就是可迭代對象。函數

內置函數:dir() print(dir(str))工具

判斷一個對象是不是可迭代對象: print('iter' in dir(str))code

優勢:對象

  1. 直觀。
  2. 操做方法較多。

缺點:索引

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

迭代器

字面意思:能夠重複迭代的工具。內存

專業角度: 內部含有'__iter__'而且含有"__next__"方法的對象,就是迭代器字符串

可迭代對象轉化成迭代器:generator

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)})
相關文章
相關標籤/搜索