您的位置:首页 > 编程语言 > Python开发

Python 迭代器和生成器

2019-01-16 19:08 337 查看

第1章 迭代器

1.1什么是迭代器?

即迭代的工具,迭代事一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值

迭代的过程(用while循环实现for循环的功能):

但这种方式只能是基于索引的数据类型来实现,想集合或者字典这种没有索引的则不可以

l=['a','b','c']
i=0
while i < len(l):
    print(l[i])
    i=i+1

1.2为何要用迭代器?

优点:

1.     迭代器提供了一种不需要依赖索引的取值方式

2.     节省内存

缺点:

1.     一次性,只能往后取值,无法预测迭代中包含的个数

2.     无法取到指定的值,没有索引取值灵活

1.3如何用迭代器?

1.     可迭代对象

但凡内置有__iter__方法的对象就是可迭代对象,例如:str/list/dict/tuple/set/文件对象

调用可迭代对象的__iter__方法,会得到一个返回值,该返回值就是迭代器对象

'jiang'.__iter__()
[1,2].__iter__()
(1,2).__iter__()
{'1':'a'}.__iter__()
{1,2,3}.__iter__()
open('文件内容').__iter__()

dict={'x' : 1,'y' : 2,'z' : 3}
iter_dict=dict.__iter__()
print(iter_dict.__next__())

2.     迭代器对象

即内置有__iter__方法又有__next__方法,例如:文件对象

1.4for循环工作原理:

调用in后面那个对象的内置方法,拿到一个迭代器对象,执行k=next(iter_obj),循环往复知道抛出异常后结束

dict={'x' : 1,'y' : 2,'z' : 3}
iter_dict=iter(dict)
for iin iter_dict:
    print(i)

第2章 生成器:

2.1什么是生成器?

生成器就是一种自定义的迭代器

2.2如何使用生成器?

在函数内凡是出现yield关键字,然后调用函数将不会立即执行函数体代码,会得到一个返回值,该返回值称之为生成器,即我们自定义的迭代器

2.3如何定义生成器:

def my_gange(start,stop,step=3):
    whilestart < stop:
        yieldstart
        start+=step
res=my_gange(1,100,3)
for iin res:
    print(i)

2.4总结yeild:

1.     提供一种自定义迭代器的解决方案

2.     yield  vs  return

相同点:都能返回值,并且返回值并没有类型雨个数限制

不同点:yield可以返回多次值,而return只能返回一个值

第3章 面向过程编程:

面向过程编程绝对不是函数编程,面向过程是一种编程思路,而编程思路不依赖于具体的语言或者语法的,就是即使不依赖于函数,也可以基于面向过程的思想编写程序

定义:面向过程的核心是过程二字,过程指的是先干什么,后干什么,然后在干什么,基于面向过程设计程序就好比在设计一条流水线,是一种机械化的思维方式

优点:复杂的问题流程化,进而简单化

缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身

应用场景:扩展性要求不高的场景,如linux内核,git,httpd

设计程序的框架通常用到面向过程的编程思想,在考虑了程序是否需要比较强的扩展性以后,扩展性较低的就用面向过程的编程思想,较高的用到面向对象

第4章 三元表达式:

def max(x,y):
    ifx > y:
        returnx
    else:
        returny
res=max(2,1)
print(res)

x=10
y=20
res= x if x > y else y
print(res)

第5章 生成式:

5.1列表生成式:

res=[]
for itemin range(1,11):
    res.append(item)
print(res)

res=[item foritem inrange(1,11)]
print(res)

找出以xx结尾的名字

name=['alex','egon','kevin','hxx','wxx']
res=[i for iin nameif i.endswith('xx')]
print(res)

5.2字典生成式:

res={i: forinrange(10) ifi > 5}
print(res)

l=[('name','jiang'),('age',18),('gender','male')]
dic={k:v for k,v inifk != 'age'}
print(dic)

5.3生成器表达式:

生成器表达式中是没有任何值的,需要next才有值

res=(x forinrange(1,11))
print(next(res))
print(next(res))

统计文件中,字符个数最长的字符个数

with open('README.md',encoding='utf-8') as f:
    l=[]
    forinf:
        l.append(len(i))
    print(max(l))

生成器写法

with open('README.md',encoding='utf-8') as f:
    l=(len(i) for iin f )
    print(max(l))


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 生成器