迭代器 生成器 列表推导式 生成器表达式的一些总结

02,迭代器
可迭代对象:
    内部含有__iter__ 遵循可迭代协议
dir 显示里面的所有方法 有 __iter__ 的方法就是 可迭代对象

# print(dir('123'))  # '__iter__'
# print('__iter__' in dir([1, 2, 3]))
# print('__iter__' in dir({'name':'alex'}))
# print('__iter__' in dir({'name'}))
# print('__iter__' in dir((1, 2, 3)))
# print('__iter__' in dir(1))  # False
# print('__iter__' in dir(True))  # False

    迭代器:可迭代对象.__iter__()可以转换成迭代器 ,满足迭代器协议 
# l = [1, 2, 3]
# l_obj = l.__iter__()
# print(l_obj)
        内部含有__iter__且__next__
迭代器的取值的两种方法:
# 迭代器的取值两种方法:
# 方法一:__next__()
# print(l_obj.__next__())
# print(l_obj.__next__())
# print(l_obj.__next__())
# print(l_obj.__next__())

# 方法二 for循环
# for i in l_obj:
#     print(i)
# print('__next__' in dir(l_obj))


判断 __iter__ 在不在dir(对象中)
isinstance()
from collections import Iterable
from collections import Iterator
print(isinstance('123', Iterable))
print(isinstance('123', Iterator))

# 实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。
# for循环提供一个机制:
# 1,将可迭代对象转化成迭代器。
# 2,利用__next__进行取值。
# 3,用try异常处理方法防止报错。


迭代器的特点

节省内存。
满足惰性机制。
取值过程单向不可逆。


for 循环的机制:
# l = [1, 2, 3, 4, 5]
# l_obj = l.__iter__()
# while True:
#     try:
#         print(l_obj.__next__())
#     except Exception:
#         break


03,生成器
本质上是迭代器,用python代码构建的。

# 1,通过生成器函数构建。
# 2,通过生成器推导式构建。

构建过程:
# def func1():
#     print(11)
#     print(333)
#     yield 222
#     print(666)
#     yield 777
# g_obj = func1()  # 生成器对象 generator object
# print(g_obj.__next__())
# print(g_obj.__next__())


PS:
# def cloth1():
#     for i in range(1,10001):
#         print('衣服%s' % i)
# # cloth1()
#
#
# def cloth2():
#     for i in range(1,10001):
#         yield '衣服%s' % i
#
# g = cloth2()
# for i in range(1,51):
#     print(g.__next__())
#
# for i in range(1, 151):
#     print(g.__next__())






yield
send 和 next 区别
def func1():
    count = yield 222
    print(count)
    yield 777
    yield 888
g_obj = func1()  # 生成器对象 generator object
print(g_obj.__next__())
print(g_obj.send('wusir'))
# 1,send 具有next功能。
# 2,send 可以给上一个yield传值。
# 3, 第一个取值不能使用send.
# 4,最后一个yield不会得到send的值。、
# 列表推导式:
   能用列表推导式完成的,用python代码都可以完成。

  用一句话构建一个你想要的列表。
# 优点:简单,稍微难理解。
# 缺点: 不能用debug。
格式 :  [ 变量(加工后的变量) for 变量 in 可迭代对象 ]  遍历模式
li = [i for i in range(1, 12)]

# li = ['alex', 'wusir', 'taibai', 'nvshen', 'ritian']
# li = ['python%s期' % i for i in range(1, 12)]
# print(li)
# [ 变量(加工后的变量) for 变量 in 可迭代对象 ]  遍历模式
# [ 变量(加工后的变量) for 变量 in 可迭代对象 if 判断] 筛选模式

# l1 = [i for i in range(1, 101) if i % 2 == 0]
# print(l1)
#1,筛选,100以内所有的奇数。
# l2 = [i for i in range(1, 101) if i % 2 == 1]
# l2 = [i for i in range(1, 101, 2)]
# print(l2)
#2,10以内所有数的平方。 [1,4,9,16.。。100]
# print([i*i for i in range(1, 11)])
#3,将100以内所有内被三整除的数留到列表中。
# print([i for i in range(1,101) if i % 3 == 0])
#30以内所有能被3整除的数的平方

# print([i*i for i in range(1, 31) if i % 3 ==0])
# 列表推导式 简单明了,但是占内存
# 生成器表达式 节省内存,不易看出。
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
#          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# l3 = [ name for i in names for name in i if name.count('e') == 2]

# print(l3)
 

   字典


mcase = {'a': 10, 'b': 34}
mcase_frequency = {mcase[k]: k for k in mcase}
print(mcase_frequency)


 



原文地址:https://www.cnblogs.com/HoneyTYX/p/9047203.html