可迭代对象 迭代器 生成器 推导式 匿名函数

可迭代对象与迭代器

可迭代对象

1.可以进行循环更新的一个实实在在值。
#2.如何判断一个对象是否是可迭代对象: 利用内置函数:dir()可以查看对象内部方法
3.有__iter__方法的对象,都是可迭代对象。
4.str,list set tup 逗是可迭代对象
	print('__iter__' in dir(str))#True
	


ps dir()函数可以获取对象所有方法

迭代器

1.可更新迭代的工具
2.在python中,内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器。
3.迭代器可以迭代取值。利用next()进行取值(节省内存)或者转为list 元祖等等取值
4.一个next()取一个值 且会记录位置 迭代器一条路走到底,不走回头路。
5.取完了再next()会报错(StopIteration) 我们可以用try处理 万能异常(Exception)

可迭代对象转化成迭代器

利用内置函数iter()
l1=[1,2,3]
obj = iter(l1)
object.__iter__()

for循环原理与模拟

原理
	内部将可迭代对象转为迭代器了
	
while模拟for循环
s = 'gkffdsa;lfkdsk;lafkds;laldgjfd'
obj = iter(s)
while 1:
    try:
        print(next(obj))
    except StopIteration:
        break

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

  • 可迭代对象是一个操作方法比较多,比较直观,存储数据相对少(几百万个对象,8G内存是可以承受的)的一个数据集。
  • 当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
  • 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
  • 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。

生成器

1.将return换为yield就是生成器函数
2.只要函数中出现了yield那么他就不是函数,它是生成器函数。
3.不结束函数,对应着给 next 返回值(多个值通过元组的形式返回)。 会记录位置

举例

def func():
    yield 2,4,5
    print(11)
    yield 3
    print(22)
    yield 4
    yield 5
ret = func()  # 生成器对象
print(ret)#生成器对象
print(next(ret))#返回(2, 4, 5) 到了yield就停止后面的11不打印
print(next(ret))#返回3 第2次才打印11 到了yield就停止 后面的22 不打印

总结
	yield : 对应next给next返回值
    到了yield就停止后面的不打印

yield from

1.yield from 将一个可迭代对象的每一个元素返回给next
2.yield from 节省代码,提升效率(代替了for循环)

举例

def func():
    l1 = [1, 2, 3]
    yield from l1#就是下面的简写
    '''
    yield 1
    yield 2
    yield 3
    '''
ret = func()
print(next(ret))

出错题

def eat_baozi_gen():
    for i in range(1,5):
        yield f'{i}号包子'
        print(11)
ret1 = eat_baozi_gen()
for i in ret1:
    print(i)

推导式

列表推导式

创建方式

1.循环模式: [变量(加工后的变量) for 变量 in iterable]
print([i**2 for i in range(1, 11)])
2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]
print([i**2 for i in range(1, 11)])

列表推导式的优缺点

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

生成器推导式

生成器表达式: 小括号
与列表推导式几乎一模一样。
循环模式,筛选模式。
obj = (i for i in range(1, 11))

字典推导式

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


使用了字典推导式
print({i:l1[i] for i in range(len(l1))})

匿名函数

一句话函数 一般与内战函数结合

1.没有名字的函数,一句话函数。
2.匿名函数只能构建简单的函数,
3.一般与内置函数一起使用

举例

func2 = lambda 形参: 返回值
func2 = lambda x,y: x + y
posted @ 2020-02-29 21:20  一起奥利给  阅读(212)  评论(0编辑  收藏  举报