在Python开发刚入门的时候肯定对于他的装饰器、迭代器与生成器掌握的并不是很好,有的小伙伴们很多的时候回记混,下面就这三种做一个详细解析。
一、装饰器
1、什么是装饰器?
器=》工具,装饰=》增加功能
1、不修改源代码
2、不修改调用方式
装饰器是在遵循1和2原则的基础上为被装饰对象增加功能的工具
2、实现无参装饰器
1、无参装饰器的模板
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
2、使用:在被装饰对象正上方单独一行
@无参装饰器名
def foo():
pass
3、实现有参装饰器
1、有参装饰器的模板
def outter2(x,y,z):
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return outter
2、使用:在被装饰对象正上方单独一行
@有参装饰器名(1,2,3)
def foo():
pass
二、迭代器
#1、什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来
# while True:
# print('=------->')
# l={'x':1,'y':2}
# n=0
# while n < len(l):
# print(l[n])
# n+=1
#2、要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?
#可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象
num=1
#以下都是可迭代的对象
# str1='hello'
# list1=[1,2,3]
# tup1=(1,2,3)
# dic={'x':1}
# s1={'a','b','c'}
# f=open('a.txt','w',encoding='utf-8')
三、生成器
#生成器:
# 函数内包含有yield关键字,
# 再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象
def chicken():
print('=====>first')
yield 1
print('=====>sencond')
yield 2
print('=====>third')
yield 3
obj=chicken()
# print(obj)
# 生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法
# print(obj.__iter__() is obj)
# res=obj.__next__()
# print(res)
#
# res1=obj.__next__()
# print(res1)
#
# res2=obj.__next__()
# print(res2)
#
# obj.__next__()
# 1、iter_obj=obj.__iter__(),拿到迭代器
#2、出发iter_obj.__next__(),拿到该方法的返回值,赋值给item
#3、周而复始,直到函数内不在有yield,即取值完毕
#4、for会检测到StopIteration异常,结束循环
# for item in obj:
# print(item)
#总结yield:
#1、为我们提供了一种自定义迭代器的方式,
# 可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器
#2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次
# 因为yield可以保存函数执行的状态
# def my_range():
# print('start........')
# n=0
# while True:
# yield n
# n+=1
# obj=my_range()
# print(obj)
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# for i in my_range():
# print(i)
def my_range(start,stop,step=1):
n=start
while n < stop:
yield n #yield 4
n+=step #5
# obj=my_range(3,7,2) #3,5,
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
for item in my_range(5,10,2):
print(item)
四、面向过程编程
1、什么是面向过程编程:
核心是”过程“二字,过程指的是解决问题的步骤
即先干什么,再干什么
基于该思想编写程序就好比在设计一条流水线,是一种
机械式的思维方式
2、优点:
复杂的问题流程化、进而简单化
3、缺点:
扩展性差
xxxx
#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) #写入文件