3/29 迭代器/生成器/生成器之yield的表达式形式/面向过程的编程思想

时间:2023-02-06 23:30:39

1 迭代器

迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来

可迭代的对象:在pytnon,但凡有内置__iter__放法的对象,都是可迭代的对象

以下都是可以迭代的对象

str,list,tup,dic,sl,文件。

迭代器:选代取值的工具,可迭代的对象执行__iter__方法得到的返回值都是迭代对象

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

s1={'a','b','c'}
iter_s1=s1.__iter__()
print(iter_s1.__next__())
print(iter_s1.__next__())
print(iter_s1.__next__())

list1=[1,2,3]
iter_list1=list1.__iter__()
print(iter_list1.__next__())
print(iter_list1.__next__())

可迭代的对象:ste,lsit,tuple,dict,set,file

1获取可迭代对象的方式:,无须领取,python内置的ste,lsit,tuple,dict,set,file,都是可迭代的对象

2特点:

内置有__list__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器的对象

 

迭代器对象,文件对象本身就是迭代器对象

1获取迭代器对象的方式:

执行可迭代的对象__iter__放法,拿到返回值就是迭代器对象。

2 特点:

内置有__next__方法,执行该方法会拿到迭代器对象中的一个值

内置有__iter__方法,执行该方法会拿到迭代器本身

 

迭代器的优缺点分析

迭代器的缺点

提供了一种可不依赖索引的取值方式

l=open('a.txt','r',encoding='utf-8')
iter_l=l.__iter__()
while True:
try:
print(iter_l.__next__())
except StopIteration:
break

迭代器更加节省内存

迭代器的缺点:

取值麻烦,只能一个一个取值,只能往后取

并且是一次性的,无法用len获取长度

x=[1,2,3]
iter_x=x.__iter__()
while True:
try:
print(iter_x.__next__())
except StopIteration:
break
print('第二次=================================》')
iter_x=x.__iter__()
while True:
try:
print(iter_x.__next__())
except StopIteration:
break

for 循环原理分析

for 循环称之为迭代器循环,in后跟的必须是可迭代的对象

for循环会执行in后对象的__iter__方法,拿到迭代器对象

然后用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体

周而复始,直到取值完毕,for循环会检测到异常自动结束循环

 

l=open('a.txt','r',encoding='utf-8')
for line in l: #iter_l=l.__iter__()
print(line)

for item in {'x':1,'y':2}:
print(item)


生成器内水内包含有yield关键字,再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象。

def chicken():
print('=====>first')
yield 1
print('=====>sencond')
yield 2
print('=====>third')
yield 3

生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法

#总结yield:
#1、为我们提供了一种自定义迭代器的方式,
# 可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器
#2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次
# 因为yield可以保存函数执行的状态


#1、必须初始化一次,让函数停在yield的位置
res0=dog1.__next__()
print(res0)

#2、接下来的事,就是喂狗
#send有两方面的功能
#1、给yield传值
#2、同__next__的功能
res1=dog1.send('泔水')
print(res1)
res2=dog1.send('骨头')
print(res2)
res3=dog1.send('shit')
print(res3)

'''
1 面向过程的编程思想
核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么。。。。
基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式。


2、示范:

3、总结优缺点:
优点:复杂的问题流程化,进而简单化
缺点:修改一个阶段,其他阶段都有可能需要做出修改,牵一发而动全身,即扩展性极差
应用:用于扩展性要求低的场景

'''
#1、步骤一:拿到用户输入的合法的信息:用户名、密码、余额、年龄
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():
# bal=int(bal)
return bal
else:
print('\033[45m钱必须是数字,傻叉...\033[0m')

def get_age():
pass

#2、步骤二:写入文件
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():
#步骤1:
uname=get_uname() #拿到合法的用户名
pwd=get_pwd() #拿到合法的密码
bal=get_bal() #拿到合法的余额
#步骤2:
file_hanle(uname,pwd,bal) #写入文件