"""
今日内容:
1、带参装饰器及warps
2、迭代器
3、生成器
""" """
# 一、带参装饰器及warps系统装饰器
# 1、为什么需要带参装饰器?
-- 昨天的内容已经讲了装饰器,但是讲的都是增加的函数不需要外界传人参数,如果装饰器也需要外界传入参数呢?
-- 此时就需要带参装饰器 # 2、装饰器的推导过程
-- 如果添加的功能也需要外界传入参数时,参数应该如何通过谁进行传递呢?
-- 如果通过inner传入参数,因为inner中为可变长参数,所以会直接将参数传递给原函数,此方法不可行
-- 如果通过 outter 进行传入,那么需要在func旁再增加参数,在调用outter时就需要将参数传递进去,此时就不能使用语法糖,破坏装饰器的整体结构
-- 所以,最后的办法是根据闭包的方法将整个装饰器作为闭包,在外界增加一层函数,最后将整个装饰器作为返回值进行返回,就可以为装饰器传递参数了 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 -- 此时,整个 warp 就是一个带参装饰器,其语法糖为 @wrap("新功能需要的参数") @wrap('外部参数')
def fn(): pass # 3、什么是wraps装饰器?
-- 系统自带的装饰器,用来在用户查询被装饰函数的doc文档时,将被装饰函数的文档注释打印给用户
-- 因为当我们使用装饰器为某个功能进行装饰时,最后的调用过程虽然看着还是原函数,但是我们已经为原函数进行了重新复制,此时再使用查询原函数的doc等内置功能时,访问的实际是装饰器
-- @warps装饰器的作用就是将原函数的doc等内置功能传递给用户,彻底伪装好装饰器 # 4、如何使用warp装饰器?
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 """ """
# 二、迭代器
# 1、什么是迭代器?
-- 迭代器是一种可以不依赖于索引取值的容器 # 2、迭代器的优缺点:
-- 迭代器优点:可以不用依赖索引取值
-- 迭代器缺点:只能从前往后依次取值 # 3、迭代器对象与可迭代对象
-- 可迭代对象:具有__iter__()方法的对象就叫做可迭代对象,可迭代对象可以通过__iter__()方法转换成迭代器对象 ls = [4, 1, 5, 2, 3]
res = ls.__iter__() # => 可迭代对象
print(res) # <list_iterator object at 0x000002732B0C7470> -- 迭代器对象:具有__next__()方法的对象叫做迭代器对象,迭代器对象可以通过__next__()方法进行取值,一次只能取出一个值 with open('1.txt', 'rb') as f:
res = f.__next__() # 文件中的第一行内容
print(res)
res = f.__next__() # 文件中的第二行内容
print(res) # 4、for循环迭代器
-- 迭代器取值时的问题
-- 在我们从迭代器对象中取值时,可以使用__next__()从迭代器中取值,但是,每使用一次__next__()方法才会取出一个值,那么怎么把迭代器中的值全部取出来呢?
-- 在使用__next__()进行取值时,如果取出所有的值后还有__next__()方法,就会抛出异常 -- for循环迭代器
-- 从迭代器中取值,可以依次取出迭代器中所有的值,
-- for循环中封装了异常处理机制,会自动处理取去所有值后抛出的异常
-- for循环会将 in 后面的可迭代对象或迭代器对象直接添加.__iter__()方法 -- for循环迭代器的工作原理:
for v in obj: pass
-- 获取obj.__iter__()的结果,就是得到要操作的迭代器对象
-- 迭代器对象通过__next__()方法进行取值,依次将当前循环的取值结果赋值给v
-- 当取值抛异常,自动处理StopIteration异常结束取值循环 # 5、枚举器 (enumerate)
-- 枚举器就是给迭代器中的取值结果加索引的,当使用枚举器进行取值时,每次取值时会自动为取的值加上取值索引。
s = 'abc'
for v in enumerate(s):
print(v) # (0 'a') | (1 'b') | (2 'c') """ """
# 四、生成器
# 1、什么是生成器?
-- 生成器就是可以自定义的迭代器
# 2、如何自定义生成器?
-- 我们可以使用函数进行声明,再使用 yeild 返回值,这样在使用函数名()时就不是调用函数,而是生成迭代器对象
-- 在有yield关键字时,再使用return关键字,return关键字不起任何作用
-- 使用yeild关键字生成迭代器时,当使用__next__()进行取值时,每次只会返回一个yeild后的值,并卡在原地,不会执行后面的代码,当再次遇到__next__()时才会继续向下执行
def fn():
yield 1
yield 3
yield 5
obj = fn()
obj.__next__() # 从开始往下执行,遇到第一个yield停止,拿到yield的返回值
obj.__next__() # 从上一次停止的yield往下执行,在再遇到的yield时停止,拿到当前停止的yield的返回值
... # 以此类推,直到无法获得下一个yield,抛StopIteration异常 -- 我们自定义的生成器可以使用for循环直接取值。 # 3、生成器案例 # 案例一:创建生成器,从其取值,依次得到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) # 会自动处理异常停止 # 案例三:
# 自制的range函数
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)))
"""

day14 带参装饰器、迭代器、生成器的更多相关文章

  1. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  2. day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象

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

  3. day-14带参装饰器、迭代器

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

  4. day14(带参装饰器,迭代器,生成器,枚举对象)

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

  5. 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)

    一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...

  6. python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象

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

  7. python带参装饰器的改良版

    简单点就是这种 def deco2(param=1): def _deco2(fun): def __deco2(*args, **kwargs): print (param) fun(*args, ...

  8. python 带参与不带参装饰器的使用与流程分析/什么是装饰器/装饰器使用注意事项

    一.什么是装饰器 装饰器是用来给函数动态的添加功能的一种技术,属于一种语法糖.通俗一点讲就是:在不会影响原有函数的功能基础上,在原有函数的执行过程中额外的添加上另外一段处理逻辑 二.装饰器功能实现的技 ...

  9. Day4 装饰器——迭代器——生成器

    一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...

随机推荐

  1. open-falcon自定义push数据无法在grafana显示

    使用open-falcon自定义push数据,在open-falcon中数据能正常显示,而在grafana中添加监控项时却无法显示. 由上述现象可判断可能是由于open-falcon的api组件有问题 ...

  2. postman的使用大全

    转载 https://blog.csdn.net/fxbin123/article/details/80428216

  3. 微信小程序中用户登录和登录态维护

    提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...

  4. python第九章:面向对象--小白博客

     面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...

  5. DAY16、模块和包

    一.模块 1.模块的加载顺序:内存 =>内置 =>sys.path(一系列自定义模块) 2.sys.path:环境变量,存放文件路径的列表 重点:默认列表第一个元素就是当前被执行文件所在的 ...

  6. mshcMigrate制作的mshc文件中有链接打不开

    网上下载的c3ddotnetapiref.chm文件, 使用mshcMigrate工具(2.0.0.75)转换成mshc文件, 添加到help viewer 2.2中, 有时会遇到这样的错误: 选择是 ...

  7. mpvue——componets中引入vant-weapp组件

    前言 这个问题很奇葩,网上也有很多人,给了很多方法,但是我想说的是,那些方法我用了都没效果,我试了一些都没效果,因为我当时引入时报错说没有export default出来,但是一旦暴露出来就又出其他问 ...

  8. thymeleaf 页面获取当前页面的完整URL地址

    下面两种方法是一样的 <div th:text="${#httpServletRequest.getRequestURL() +'?'+ #httpServletRequest.get ...

  9. jatoolsprinter web打印控件直接打印不弹出

    1.功能 主要是实现页面点击按钮,不弹窗,直接打印. 可以指定某个打印机打印 可以使用默认打印机打印 2.版本 主要有:免费版跟付费版 免费版官网:http://printfree.jatools.c ...

  10. 用python 发 帝国cms 文章

    在e\extent下面放一个jiekou.php     #!/usr/bin/env python3 # -*- coding: utf-8 -*- import time import urlli ...