欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python_装饰器——迭代器——生成器

程序员文章站 2022-05-14 11:03:09
一、装饰器 二、迭代器 三、生成器 四、面向过程编程 xxxx ......

一、装饰器

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