Python基础教程:带参装饰器、生成器、迭代器、for循环迭代器、枚举

枫铃3年前 (2021-09-30)Python267

带参装饰器

装饰器为被装饰的函数添加新功能,需要外界参数

  • outer参数固定一个,就是func
  • inner参数固定和被装饰的参数固定,也不能添加新参数

可以借助函数的嵌套定义,外层给内层传参

def wrap(info):#info就是需要的外界参数
    def outer(func):
        def inner (*args,**kwargs):
            新功能
            res=func(*args,**kwargs)
            return res
        return inner
    return outer
@wrap("外部参数"#系统wraps带参装饰器:改变inner的假指向,本质外界使用的还是inner,但是打印显示的是wraps中的函数
from functools import wraps
def outer(func):
    @wraps(func)
    def inner(*args, **kwargs):
       
        res = func(*args, **kwargs)
        return res
    return inner
@outer
def fn(): pass

迭代器

  • 迭代器对象:可以不依赖取值容器,有__next__方法的对象就是迭代器对象,迭代器对象依赖__next__()方法取值

  • 可迭代对象:可以通过某种方法得到迭代器对象,有__iter__()方法的对象就是可迭代对象,可迭代对象通过__iter__()方法得到迭代器对象

迭代器优点:可以不依赖索引取值,

for循环迭代器:

直接用while True循环在迭代器对象中通过__next__()取值,终究会有取空的时候,取空再取值,报stopIteration异常

'''
Python大型免费公开课,适合初学者入门
加QQ群:579817333 获取学习资料及必备软件。
'''
ls = [3, 1, 2, 3, 5]
iterator = ls.__iter__()
while True
    try:
        print(iterator.__next__())
    except StopIteration:
        break

for循环就是while取迭代器对象的封装

for循环迭代器的工作原理:for v in obj:pass

  • 获取obj__iter__()的结果,得到要操作的迭代器对象
  • 迭代器对象通过__next__()方法进行取值,依次将当前循环的取值结果赋值给v
  • 当取值抛异常,自动处理StopIteration异常结束取值循环

枚举对象:

给迭代器对象及迭代器对象添加索引

s="abc"
for v in enumerate(s):
    print(v)#(0 ,'a') | (1 ,'b') | (2 ,'c')

生成器

生成器:自定义的迭代器对象

就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有变化

总结:有yield关键字的函数,函数名()不是调用函数,而是生成得到生成器对象,生成器对象就是迭代器对象,可以通过__next__进行取值

执行流程:

def fn():
    yield 1
    yield 2
    yield 3
obj=fn() #生成一次迭代器对象,赋值给obj
obj.__next__()#从开始往下执行,遇到第一个yield停止,拿到yield的返回值
obj__next__()#从上一次停止的yield往下执行,再遇到yield停止,拿到当前停止的yield返回值

依此类推,直到无法获得下一个yield,抛StopIteration异常
可以被for循环遍历:

for v in fn()print(v)

案例1:

'''
Python大型免费公开课,适合初学者入门
加QQ群:579817333 获取学习资料及必备软件。
'''
def jiecheng():
    ji=1
    count=1
    while True:
        ji*=count
        yield ji
        count+=1
obj=jiecheng()
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())  # 可以无限取

案例2:

def jiecheng_num(num):
    ji=1
    for i in range(1,num+1):
        ji*=1
        yield ji
obj = jiecheng_num(3)
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())  # 有异常了

for v in jiecheng_num(5):
print(v)  # 会自动处理异常停止

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。