博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成器/内置函数
阅读量:4323 次
发布时间:2019-06-06

本文共 2935 字,大约阅读时间需要 9 分钟。

生成器

本质就是迭代器,手动写的迭代器

生成器函数

def func():    print (123)    yield '生成器'func() ## 执行结果 :没有结果'''******'''ret = func() ## 这个过程相当于 实例化对象  '''******'''print(ret) #
生成器对象# 想执行这个 要用next() 和迭代器一样 或者遍历它next(ret) ## 123 print(next(ret)) ## 111 2 # 如果生成器中没有yield了,再调用next会报错

生成器函数的坑(1)

## for循环中的生成器def add(n, i):    return n+idef test():    for i in range(4):        yield ig = test()for n in [1, 10, 5]:    g = (add(n, i) for i in g)print(list(g))  # 结果是 [15, 16, 17, 18] ## 关键点在于生成器相当于函数,不调用就不执行,只有最后list(g)了,才一层一层的解开# for循环3次 相当于n = 1 g = ((n+i) for i in test())n = 10g = ((n+i) for i in g(此时的g是((n+i) for i in test()) ))n = 5g = ((n+i) for i in g(此时的g是 ((n+i) for i in ((n+i) for i in test()) )))list(g) 的时候才 开始执行这个表达式 此时n已经是 5 了## 最后的结果也就是循环几层,取几次5,再与g的各项相加取值5*3+0,5*3+1,5*3+2,5*3+3

生成器的坑(2)

def demo():    for i in range(4):        yield ig=demo()g1=(i for i in g)g2=(i for i in g1)print(list(g1))## list(g1)相当于在底层for循环,也就是next(g1),到最后一层print(list(g2)) ## 所以当list(g2)时,for遍历g1,next(g1)指不到东西

yield

阻塞

return 和 yield

## return 结束函数,给函数的执行者返回值## yield 不结束函数,给next(func()) 返回值

yield from

def func():    l = [1,2,3]    yield from lfun = func()print (next(fun)) # 1print (next(fun))# 2print (next(fun))# 3,## 取代了for循环,将可迭代对象中的每一项元素依次取出来

匿名函数

lambda x,y:x+y不调用,不执行,不调用,不执行

列表推导式 生成器表达式

## 列表推导式l = [i for i in iterable if i...]## 一行代码实现九九乘法表'\n'.join([' '.join([f'{j}*{i}={j*i}'for j in range(1,i+1)]) for i in range(1,10)])
# 生成器表达式obj = (i for i in iterable if i...)## 取值方式# 第一种print(next(obj))# 第二种for i in obj:    print(i)# 第三种print (list(obj))

内置函数

min

# 参数列表可以放key的min()max()sorted()# 例如  min()dic = {'a':1,'b':2,'c':3,'d':0}print(min(dic)) # 此时返回的结果为 aprint (min(dic,key=lambda x:x))  ## 相当于将dic遍历传入 lambda表达式(函数)中,return 的是什么就按照什么比较,这个x是dic的key,所以返回的也是字典的key

zip

## zip ## 将传入的可迭代对象,按相同索引组合成一个元组,直到其中一项到索引最后一项def zipp(*iterable):    obj = object()    iterators = [iter(it) for it in iterable]    while iterators:        result = []        for it in iterators:            em = next(it,obj)            if em is obj:                return            result.append(em)        yield tuple(result)a = zipp('asd','zxc','qwe')while 1:    try:        print(next(a))    except:        break        print(list(a)) # [('a', 'z', 'q'), ('s', 'x', 'w'), ('d', 'c', 'e')]## 返回的是迭代器对象

filter

## 过滤filter(func,lst)lst = [{'id':1,'name':'alex','age':18},        {'id':1,'name':'wusir','age':17},        {'id':1,'name':'taibai','age':16},] ls = filter(lambda e:e['age'] > 16,lst) print(list(ls)) 结果:[{'id': 1, 'name': 'alex', 'age': 18}, {'id': 1, 'name': 'wusir', 'age': 17}]## 返回的是迭代器对象

map

# map 映射函数lis = [1,2,3,4,5]for i in map(lambda x:x**2,lis):    print(i)# 1,4,9,16,25lis1 = [1,2,3,4,5]m1 = map(lambda x,y:x+y,lis,lis2)for i in m1:    print(i)  # 2,    4,6,8,10## 返回的是迭代器对象

reduce

## 归并函数from functools import reducel = [1,2,3,4]ret = reduce(lambda x,y:x*y,l)print(ret)## 解决阶乘# 返回的是值

转载于:https://www.cnblogs.com/albert0823/p/11060953.html

你可能感兴趣的文章
怎样看待个体经济
查看>>
不明觉厉的数据结构题2
查看>>
面向对象编程思想概览(四)多线程
查看>>
二十三种设计模式及其python实现
查看>>
Math类、Random类、System类、BigInteger类、BigDecimal类、Date类、SimpleDateFormat、Calendar类...
查看>>
【设计模式】 访问者模式
查看>>
关于FFMPEG 中I帧、B帧、P帧、PTS、DTS
查看>>
request和response的知识
查看>>
bootstrap 表单类
查看>>
20165332第四周学习总结
查看>>
Codeforces Round #200 (Div. 1)D. Water Tree dfs序
查看>>
linux安全设置
查看>>
Myflight航班查询系统
查看>>
团队-团队编程项目爬取豆瓣电影top250-代码设计规范
查看>>
表头固定内容可滚动表格的3种实现方法
查看>>
想对你说
查看>>
day5 面向对象
查看>>
{算法}Young司机带你轻松KMP
查看>>
不同方法获得视差图比较
查看>>
jQuery笔记(二)
查看>>