我的编程空间,编程开发者的网络收藏夹
学习永远不晚

带参装饰器,迭代器,生成器,枚举对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

带参装饰器,迭代器,生成器,枚举对象

一,复习

'''
函数的嵌套定义:在函数内部定义另一个函数

闭包:被嵌套的函数
    -- 1.外层通过形参给内层函数传参
    -- 2.验证执行

开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变

装饰器:装饰器名就是外层函数 @outer
@outer  # fn = outer(fn)
def fn(): pass
'''

def wrap(func):
    def inner(*args, **kwagrs):
        # res = func(*args, **kwagrs)
        res = outer.inner()
        return res
    return inner

def outer(func):
    def inner(*args, **kwagrs):
        pass
        res = func(*args, **kwagrs)
        pass # res
        return res
    return inner

@wrap   # fn = warp(fn) = wrap(outer.inner) = wrap.inner
@outer  # fn = outer(fn) = outer.inner
def fn(n1, n2, n3): pass

fn(1, 2, 3)

 

二,今日内容

# 1.带参装饰器 | wraps(文档注释)  了了解

# 2.迭代器  *****

# 可迭代对象
# 迭代器对象
# for迭代器
# 枚举对象

# 递归 ***

 

三,带参装饰器

# 通常,装饰器为被装饰的函数添加新功能,需要外界的参数
#    -- outer参数固定一个,就是func
#    -- inner参数固定同被装饰的函数,也不能添加新参数
#    -- 可以借助函数的嵌套定义,外层给内层传参

def wrap(info):
    def outer(func):
        # info = 0
        def inner(*args, **kwargs):
            print('新:拓展的新功能,可能也需要外界的参数%s' % info)
            res = func(*args, **kwargs)
            return res
        return inner
    return outer

@wrap('外部参数')
def fn(): pass



# 系统的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

 

四,迭代器

# 迭代器对象: 可以不用依赖索引取值的容器
# 可迭代对象:可以通过某种方法得到迭代器对象

# 迭代器优点:可以不用依赖索引取值
# 迭代器缺点:只能从前往后依次取值

 

五,可迭代对象

# 可迭代对象:有__iter__()方法的对象是可迭代对象,可迭代对象调用__iter__()得到迭代器对象

ls = [4, 1, 5, 2, 3]
res = ls.__iter__()  # => 可迭代对象
print(res)  # <list_iterator object at 0x000002732B0C7470>

# 可迭代对象有哪些:str | list | tuple | set | dict | range() | enumerate() | file | 生成器对象

 

六,迭代器对象

# 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行取值

with open('1.txt', 'rb') as f:
    res = f.__next__()  # 文件中的第一行内容
    print(res)
    res = f.__next__()  # 文件中的第二行内容
    print(res)

# 迭代器对象有哪些:enumerate() | file | 生成器对象

# 注:迭代器对象调用__iter__()方法返回的还是迭代器对象(返回自身)

 

七,for循环迭代器

# 直接用while True循环在迭代器对象中通过 __next__() 取值,终究会有取空的时候,取空再取值,报StopIteration异常
ls = [3, 1, 2, 3, 5]
iterator = ls.__iter__()
while True:
    try:
        print(iterator.__next__())
    except StopIteration:
        # print('取空了')
        break
        
# for循环就是对while取迭代器对象的封装        
for v in ls:
    print(v)
    
for v in ls.__iter__():  # 可迭代对象.__iter__() => 迭代器对象
    print(v)
    
iterator = ls.__iter__()    
for v in iterator:       # 迭代器对象.__iter__() => 自身
    print(v)

    
# for循环迭代器的工作原理:
# for v in obj: pass
# 1)获取obj.__iter__()的结果,就是得到要操作的 迭代器对象
# 2)迭代器对象通过__next__()方法进行取值,依次将当前循环的取值结果赋值给v
# 3)当取值抛异常,自动处理StopIteration异常结束取值循环

 

八,生成器

# 生成器:自定义的迭代器对象
#     -- 就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有多少变化

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

# 执行流程:
def fn():
    yield 1
    yield 3
    yield 5
obj = fn()
obj.__next__()  # 从开始往下执行,遇到第一个yield停止,拿到yield的返回值
obj.__next__()  # 从上一次停止的yield往下执行,在再遇到的yield时停止,拿到当前停止的yield的返回值
# ...              # 以此类推,直到无法获得下一个yield,抛StopIteration异常

# 可以直接被for循环遍历
for v in fn():
    print v

 

生成器案例:

# 案例一:创建生成器,从其取值,依次得到1! 2! 3! ...
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__())  # 可以无限取


# 案例二:
def jiecheng_num(num):
    ji = 1
    for i in range(1, num + 1):
        ji *= i
        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)  # 会自动处理异常停止


# 案例三:
def my_range(num):  # => [0, 1, 2, ..., num - 1]
    count = 0
    while count < num:
        yield count
        count += 1

for v in my_range(10):
    print(v, end=' ')

print(list(my_range(10)))

 

 

九,枚举对象

# 给可迭代器对象及迭代器对象添加迭代索引
s = 'abc' for v in enumerate(s): print(v) # (0 'a') | (1 'b') | (2 'c')

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

带参装饰器,迭代器,生成器,枚举对象

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

带参装饰器,迭代器,生成器,枚举对象

一,复习'''函数的嵌套定义:在函数内部定义另一个函数闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变装饰器:装饰器名就是外层函数 @out
2023-01-31

生成器,迭代器,装饰器

生成器 (generator)概念在Python中, 一边循环一边计算的机制, 称为生成器: generator 创建生成器: G = ( x*2 for x in range(5)) 可以通过 next(生成器) 函数获得生成器的下一个返
2023-01-31

Python3 迭代器,生成器,装饰器

1.迭代器迭代器有两个基本方法,iter()和next(),next()完成后会引发StopIteration异常a='abcdef'b=iter(a)#创建迭代器对象print(type(b))while True:try:print(n
2023-01-30

python3 迭代器、生成器、装饰器、

本节内容迭代器&生成器装饰器Json & pickle 数据序列化软件目录结构规范作业:ATM项目开发 1.列表生成式迭代器&生成器列表生成式孩子我现在有个需求看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列
2023-01-31

python-装饰器&生成器&迭代器&推

一:普通装饰器概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能普通装饰器编写的格式def 外层函数(参数) def 内层函数(*args,**kwargs) #函数
2023-01-31

python中的迭代器,生成器与装饰器怎么用

这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!迭代器每一个可迭代类内部都要实
2023-06-29

python中的生成器、迭代器、装饰器怎么使用

本篇内容介绍了“python中的生成器、迭代器、装饰器怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、装饰器由于一个函数能实现一种
2023-07-02

Python容器、可迭代对象、迭代器及生成器这么应用

这篇文章主要讲解了“Python容器、可迭代对象、迭代器及生成器这么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python容器、可迭代对象、迭代器及生成器这么应用”吧!一、容器1.什
2023-06-29

Python学习之三大名器-装饰器、迭代器、生成器

一、装饰器装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善。其核心原理其实是利用闭包。格式 @关键字+装饰函数被装饰函数()注意:
2023-06-02

​​​​​​​python可迭代对象,迭代器,生成器,协程实例分析

这篇文章主要介绍了python可迭代对象,迭代器,生成器,协程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python可迭代对象,迭代器,生成器,协程实例分析文章都会有所收获,下面我们一起来看看吧。设
2023-06-30

怎样理解Python迭代对象和迭代器以及生成器

这篇文章将为大家详细讲解有关怎样理解Python迭代对象和迭代器以及生成器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在了解Python的数据结构时,容器(container)、可迭代对象
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录