python中的装饰器、生成器与迭代器介绍

装饰器()

1、装饰器:本质是函数;

装饰器(装饰其他函数),就是为其他函数添加附加功能;

原则:1.不能修改被装饰函数的源代码;

   2.不能修改被装饰的函数的调用方式;

立即学习“Python免费学习笔记(深入)”;

装饰器对被装饰的函数完全透明的,没有修改被装饰函数的代码和调用方式。

实现装饰器知识储备:

1.函数即“变量”;

2.高阶函数;

3.嵌套函数

高阶函数+嵌套函数=》装饰器

匿名函数(lambda表达式)

>>> calc = lambda x:x*3
>>> calc(2)
6

高阶函数:

  a.把一个函数名当做实参传递给另外一个函数;

>>> def bar():  print("in the bar.....")  >>> def foo(func):   print(func)>>> foo(bar)  

登录后复制

  b.返回值中包含函数名;

>>> import time>>> def foo():  time.sleep(3)  print("in the foo.....")>>> def main(func):   print(func)   return func>>> t = main(foo)>>> t()in the foo.....

登录后复制

在不修改源代码的情况下,统计程序运行的时间:

 

import time

def timmer(func):
def warpper(*args,**kwargs):   #warpper(*args,**kwargs)万能参数,可以指定参数,也可以不指定参数
start_time = time.time() #计算时间
func()
stop_time = time.time()
print("the func run time is %s" %(stop_time-start_time)) #计算函数的运行时间
return warpper

@timmer    #等价于test1 = timmer(test1),因此函数的执行调用是在装饰器里面执行调用的
def test1():
time.sleep(3)
print("in the test1")

test1()
运行结果如下:

登录后复制

in the test1
the func run time is 3.001983404159546

装饰器带参数的情况:

 

import time

def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time() #计算时间
func(*args,**kwargs)  #执行函数,装饰器参数情况
stop_time = time.time()
print("the func run time is %s" %(stop_time-start_time)) #计算函数的运行时间
return warpper    #返回内层函数名

@timmer
def test1():
time.sleep(3)
print("in the test1")

@timmer    #test2 = timmer(test2)
def test2(name):
print("in the test2 %s" %name)

test1()
test2("alex")
运行结果如下:

登录后复制

in the test1
the func run time is 3.0032410621643066
in the test2 alex
the func run time is 2.3603439331054688e-05

装饰器返回值情况:

 

import timeuser,passwd = "alex","abc123"def auth(func):    def wrapper(*args,**kwargs):        username = input("Username:").strip()        password = input("Password:").strip()if user == username and passwd == password:            print("[32;1mUser has passed authentication.[0m")return func(*args,**kwargs)   #实际上执行调用的函数               # res = func(*args,**kwargs)            # return res   #函数返回值的情况,因为装饰器调用的时候是在装饰器调用的函数,因此返回值也在这个函数中else:            exit("[31;1mInvalid username or password.[0m")return wrapperdef index():    print("welcome to index page...")@authdef home():    #用户自己页面    print("welcome to home page...")return "form home..."@authdef bbs():    print("welcome to bbs page")index()print(home())bbs()

登录后复制

 

装饰器带参数的情况:

实现:1、本地验证;2、远程验证

import timeuser,passwd = "alex","abc123"def auth(auth_type):'''函数的多层嵌套,先执行外层函数'''print("auth_type",auth_type)    def out_wrapper(func):        def wrapper(*args,**kwargs):            print("wrapper func args:",*args,**kwargs)if auth_type == "local":                username = input("Username:").strip()                password = input("Password:").strip()if user == username and passwd == password:                    print("[32;1mUser has passed authentication.[0m")                    func(*args,**kwargs)   #实际上执行调用的函数                    # res = func(*args,**kwargs)                    # return res   #函数返回值的情况,因为装饰器调用的时候是在装饰器调用的函数,因此返回值也在这个函数中else:                    exit("[31;1mInvalid username or password.[0m")            elif auth_type == "ldap":                print("搞毛线lbap,傻逼....")return wrapperreturn out_wrapperdef index():    print("welcome to index page...")@auth(auth_type="local")def home():    #用户自己页面    print("welcome to home page...")return "form home..."@auth(auth_type="ldap")def bbs():    print("welcome to bbs page")index()home()bbs()   #函数没有,因为没有调用函数,函数的调用在装饰器里面,是装饰器调用了函数

登录后复制

   迭代器和生成器

  生成器

  通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

  所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

  >>> l1 = (i for i in range(10))
  >>> l1
   at 0x7f6a9fbcaeb8>
  >>> l1.__next__()
  0
  >>> l1.__next__()
  1
  生成器:只有在调用时才会生成相应的数据;

  只有通过__next__()方法进行执行,这种能够记录程序运行的状态,yield用来生成迭代器函数。(只能往后调用,不能向前或者往后推移,只记住当前状态,因此银行的系统用来记录的时候可以使用yield函数)。

 %=  %= consumer(= consumer( i  range(,)运行如下:A准备吃包子了......B准备吃包子了......包子1被A吃了......包子1被B吃了......包子2被A吃了......包子2被B吃了......包子3被A吃了......包子3被B吃了......包子4被A吃了......包子4被B吃了......包子5被A吃了......包子5被B吃了......包子6被A吃了......包子6被B吃了......包子7被A吃了......包子7被B吃了......包子8被A吃了......包子8被B吃了......包子9被A吃了......包子9被B吃了.....

登录后复制

  迭代器

  我们已经知道,可以直接作用于for循环的数据类型有以下几种:

  一类是集合数据类型,如list、tuple、dict、set、str等;

  一类是generator,包括生成器和带yield的generator function。

  这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

  可以使用isinstance()判断一个对象是否是Iterable对象

>>> from collections import Iterable>>> isinstance([], Iterable)True>>> isinstance({}, Iterable)True>>> isinstance('abc', Iterable)True>>> isinstance((x for x in range(10)), Iterable)True>>> isinstance(100, Iterable)False

登录后复制

以上就是python中的装饰器、生成器与迭代器介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268808.html

(0)
上一篇 2025年2月27日 10:53:31
下一篇 2025年2月25日 16:45:25

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 编程语言主流38种

    目前主流编程语言有 38 种,其中人气排行前 10 的语言为 Python、Java、JavaScript、C++、C#、R、PHP、SQL、Swift 和 Go。这些语言覆盖广泛的应用领域,包括脚本语言、通用编程语言、后端语言、前端语言、…

    2025年2月27日
    200
  • python 2 map() reduce()函数用法讲解

    利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam’, ‘lisa’, ‘bart’],输出:[‘ad…

    2025年2月27日 编程技术
    200
  • 现在最火的编程语言是什么

    目前最热门的编程语言:1. Python:以其易学性、广泛用途和强大的库支持著称,尤适用于数据科学和人工智能。2. JavaScript:无处不在,是 Web 开发的基础,拥有丰富的库和框架。3. C:高效、低级语言,用于操作系统、嵌入式系…

    2025年2月27日
    200
  • Python中对socket的详细介绍

    socket通常也称作”套接字”,用于描述ip地址和端口,是一个通信链的句柄,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本…

    2025年2月27日 编程技术
    200
  • Python中的os模块

    python文件系统功能:os模块 1.os模块方法分类 (1)目录: chdir() 改变工作目录 chroot() 设定当前进程的根目录 listdir() 列出指定目录下的所有文件名 mkdir() 创建指定目录 makedirs()…

    编程技术 2025年2月27日
    200
  • 计算机编程有哪几种语言

    计算机编程语言根据其范式、用途和编译方式进行分类。范式分类包括命令式、声明式、函数式和逻辑编程。用途分类包括通用语言、特定领域语言和脚本语言。编译方式分类包括编译语言和解释语言。 计算机编程语言类型 计算机编程语言是计算机与人类交互的桥梁,…

    2025年2月27日
    200
  • 列举一段计算机编程语言

    计算机编程语言是与计算机沟通的正式语言,分为低级(直接使用硬件指令)和高级(更接近人类语言)两类。高级编程语言具有易读性、可移植性和可维护性,常用语言包括 Python、Java、C++、JavaScript、C# 和 PHP。 计算机编程…

    2025年2月27日
    200
  • Python的由来与使用介绍

        Python语言因为简洁而清晰的风格,有大量适用性甚广的类库和python开源框架可以使用,而受到许多IT界人士的喜爱。Python的由来及发展历程又是怎样的呢,下面我们来简单的了解下。     追溯Python语言的起源,是从20…

    2025年2月27日 编程技术
    200
  • python编写一个三级while的循环菜单实例

    下面这篇文章介绍python是如何编写一个三级while的循环菜单的 1.定义字典,字典里面嵌套字典,内嵌字典的值为列表。 思路: 湖北省的市:字典中的定义3个字典,用于存储{序列-键:市名} 登录后复制 shiqu_dir = {} 登录…

    2025年2月27日
    200
  • 电脑编程常用语言有哪些

    电脑编程常用语言 电脑编程语言是指计算机能够理解并执行的指令集,用于创建软件、应用程序和其他计算任务。有多种编程语言可供选择,每种语言都有其独特的特性和应用领域。 流行的通用编程语言: Python:一种易于学习、通用的解释型语言,用于数据…

    互联网 2025年2月27日
    200

发表回复

登录后才能评论