python的装饰器、迭代器、yield_python开发中装饰器-迭代器-生成器定义及用法详细解析...

在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) #写入文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值