迭代器 迭代器概念 1 2 3 4 5 6 7 8 9 10 while True : print ('===>' ) l=[1 ,2 ,3 ] count=0 while count < len (l): print (l[count]) count+=1
可迭代对象、迭代器对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 字面意思分析:可以重复的迭代的实实在在的东西。 专业角度: 内部含有'__iter__' 方法的对象,就是可迭代对象。 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello' .__iter__(1 ,2 ,3 ).__iter__ [1 ,2 ,3 ].__iter__ {'a' :1 }.__iter__ {'a' ,'b' }.__iter__ open ('a.txt' ).__iter__字面意思:可以重复迭代的工具。 专业角度: 内部含有'__iter__' 并且含有"__next__" 方法的对象,就是迭代器 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象 文件类型是迭代器对象 open ('a.txt' ).__iter__()open ('a.txt' ).__next__()迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
迭代对象的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 dic={'a' :1 ,'b' :2 ,'c' :3 } iter_dic=dic.__iter__() iter_dic.__iter__() is iter_dic print (iter_dic.__next__()) print (iter_dic.__next__()) print (iter_dic.__next__()) iter_dic=dic.__iter__() while 1 : try : k=next (iter_dic) print (dic[k]) except StopIteration: break
for循环 1 2 3 4 5 6 7 8 9 dic={'a' :1 ,'b' :2 ,'c' :3 } for k in dic: print (dic[k])
迭代器的优缺点 优点:
提供一种统一的、不依赖于索引的迭代方式 惰性计算,节省内存 缺点:
无法获取长度(只有在next完毕才知道到底有几个值) 一次性的,只能往后走,不能往前退 生成器 生成器介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def func (): print ('====>first' ) yield 1 print ('====>second' ) yield 2 print ('====>third' ) yield 3 print ('====>end' ) obj=func() print (obj) print (obj.__iter__() is obj) print (obj.__next__())print (obj.__next__())print (obj.__next__())print (obj.__next__())
生成器就是迭代器 1 2 3 4 5 obj.__iter__ obj.__next__ res=next (obj) print (res)
实例演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 def func (): print ('====>first' ) yield 1 print ('====>second' ) yield 2 print ('====>third' ) yield 3 print ('====>end' ) obj = func() for item in obj: print (item) def my_range (): n=0 while True : yield n n+=1 res=my_range() print (res.__next__()) print (res.__next__()) print (res.__next__()) print (res.__next__()) def my_range (start,stop,stemp=2 ): n=start while n<stop: yield n n+=stemp for r in my_range(1 ,10 ): print (r)
表达式yield的应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 def eat (name ): print ('{} 准备吃饭了' .format (name)) food_list=[] while True : food=yield food_list print ('{} 吃了 {}' .format (name,food)) food_list.append(food) ff=eat('刘清政' ) ff.__next__() print (ff.send('红烧肉' ))print (ff.send('大盘鸡' ))print (ff.send('大米' ))刘清政 准备吃饭了 刘清政 吃了 红烧肉 ['红烧肉' ] 刘清政 吃了 大盘鸡 ['红烧肉' , '大盘鸡' ] 刘清政 吃了 大米 ['红烧肉' , '大盘鸡' , '大米' ]
总结 总结yield:
1、为我们提供了一种自定义迭代器的方式, 可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器
2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次 因为yield可以保存函数执行的状态
面向过程编程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么 基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式 流水线1 : 用户输入用户名、密码--->用户验证--->欢迎界面 流水线2 : 用户输入sql--->sql解析--->执行功能
ps:函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果,面向过程的思路就是,把程序的执行当做一串首尾相连的功能,该功能可以是函数的形式,然后一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。
示例:复杂的问题变得简单,但扩展功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 db_path='db.txt' def get_uname (): while True : uname=input ('用户名>>:' ).strip() if not uname.isalpha(): print ('\033[45m用户名必须为英文字母...\033[0m' ) continue with open (r'%s' %db_path,'r' ,encoding='utf-8' ) as f: for line in f: uinfo=line.strip('\n' ).split(',' ) if uname == uinfo[0 ]: print ('\033[45m用户名已存在...\033[0m' ) break else : return uname def get_pwd (): while True : pwd1=input ('请输入密码>>: ' ).strip() pwd2=input ('再次输入密码>>: ' ).strip() if pwd1 == pwd2: return pwd1 else : print ('\033[45m两次输入的密码不一致,请重新输入...\033[0m' ) def get_bal (): while True : bal=input ('请输入余额: ' ).strip() if bal.isdigit(): return bal else : print ('\033[45m钱必须是数字,傻叉...\033[0m' ) def get_age (): pass def file_hanle (uname,pwd,bal,age ): with open (r'%s' %db_path,'a' ,encoding='utf-8' ) as f: f.write('%s,%s,%s,%s\n' %(uname,pwd,bal,age)) def register (): uname=get_uname() pwd=get_pwd() bal=get_bal() file_hanle(uname,pwd,bal)