Python 知识体系补全(闭包、装饰器、关键字参数**kwargs,位置参数*args)

这篇具有很好参考价值的文章主要介绍了Python 知识体系补全(闭包、装饰器、关键字参数**kwargs,位置参数*args)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

闭包:
    什么是闭包,一句话,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了
    一般外部函数的返回值为内部函数
     def outer(x):
         def inner(y):
             return x + y
        return outer     # 外部函数的返回值,是内部函数 
     print(outer(6)(5))
    python 循环中不包含域的概念
        range() 函数饭返回一个可迭代对象(类型是对象)
        xrange() 与range类似,只是返回一个“xragne object” 对象,而非数组list
        要生成很大的数字序列的时候,用xrange回避range性能优很多,因为不需要一上来就开辟一块很大的空间。
装饰器:
     装饰器就是一个闭包,装饰器是闭包的一种应用,python装饰器就是用于拓展原来函数功能一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能,使用时在需要的函数前加上@xx
     #定义了一个函数
def foo():
#函数功能
    print("------1-------")
#定义了另一个函数传入了一个形参
def bar(func):      # 这里啊 func == foo    是 Ture
    #这段代码在干什么
    func()          # func() == foo()    #打印func()  其实就是  foo()
#python的函数可以像普通变量一样作为参数传递给函数,将函数foo 作为bar函数的实参
bar(foo)   # 这边接受的是foo函数,要使用函数不应该是  foo()  如果你知道多线程 中有一个分配线程
           # def test1()
           #      print('-----1------')
           # threading.Thread(target = test1)    # 主线程会分配一个子线程给去执行test1  函数 ,主线程会在这里等待 子线程执行完毕后死掉
    装饰器的本质是一个python函数或类,它可以让其他函数或者类在不需要做任何代码的前提下增加额外的功能,装饰器的返回值也是一个函数/类对象
    def use_logging():

        def wrapper():
            pass
        return wrapper   # 返回的只是局部函数的对象并不会执行内部函数的中代码

        def foo():
            print('i am foo')
        # 执行use_logging() 返回局部函数对象
        use_logging()   
            <function __main__.use_logging.<locals>.wrapper()>   # 函数对象

        def use_logging(func):   # func 形参

            def wrapper():
                print("--------1----------")
                # # logging.warn("%s is running" % func.__name__)
                # return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
            return wrapper   # 返回的只是局部函数的对象并不会执行内部函数的中代码

        def foo():
            print('i am foo')
        #use_logging() [执行效果] ==  返回 wrapper
        foo = use_logging(foo)    # foo 实参  foo 是函数foo 用变量foo接受                               # use_logging(foo)  == wrapper
        foo()   foo()  != 函数foo()   根据51行  所以得出  foo()  == wrapper()   # 它就会返回执行结果 --------1----------
        def use_logging(func):

            def wrapper():
                print("--------1----------")
                # # logging.warn("%s is running" % func.__name__)
                return func()   # 把 foo函数    当做参数传递进来时,执行func()就相当于执行foo()
                # 因此返回了func()  就会去执行 函数foo 中的print('i am foo') 所以打印结果 i am foo
            return wrapper   # 返回的只是局部函数的对象并不会执行内部函数的中代码

        def foo():
            print('i am foo')
        foo = use_logging(foo)   # use_logging(foo)  == wrapper
        foo()
语法糖:
    @ 就是语法糖的标识符  语法糖必须加在你想被作用的函数前面
    例如: 
         @use_logging
         def foo():
            print("i am foo")
    在下面的代码中 
        def use_logging(func):

        def wrapper():
            logging.warn("%s is running" % func.__name__)
            return func()
        return wrapper 
        语法糖的作用返回了 wrapper 
        @use_logging
        # 给函数foo 添加了语法糖use_logging
        def foo():
            print("i am foo")

        foo() #执行foo 函数其实也执行了语法糖use_logging
        #foo()  -  先去执行use_logging(foo)
        。。。。。。
        #暂时理解滞缓
语法糖提高程序的重复利用性 并增加了程序的可读性

*args、**kwargs
args 和 kwargs 通常还会在前面加上一两个星号,其实这是python开发人约定的变量名
其中args 是 arguments 的缩写,表示位置参数,kwargs 是keyword arguments 的缩写, 表示关键字参数这其实python中可变参数的两种形式,而且*args必须放在**kwargs的前面,因为位置参数在关键字参数的前面。
        # 使用这段函数必须清楚元组可以进行遍历
        def test_args(first,*args):
            print('-----1-----',first)
            print(type(args))
            print(args)
            for v in args:
                # 这里的[1,2,3,4]  作为元组的一个元素,这里的元组样式是 ([1,2,3,4],)
                print('-----2----',v)

        test_args(1,[2,3,4],4)
        #得出原因了吧
        for i in ([1,2,3,4],):
            print(i)   
    
    #经过测试 args 接受一个不定参数的元组     
   **kwargs 允许你讲一个补丁长度的键值对,作为参数传递给一个函数
        def greet_me(**kwargs):
            
            for key, value in kwargs.items():
                print('key = {0},value = {1}'.format(key, value))
                
                
            greet_me(小明=18, 小李=20)
        打印结果: 
    #   使用*args和**kwargs来调用函数
def test_args_kwargs(arg1, sex, age):
        print ("年龄:",arg1)
        print("性别:", sex)
        print ("年龄:",age)
args = ('小李','男',18)
# 下面两端注释的原因是 .items()  迭代方法 不可行  元组不能迭代 list 也不能迭代
# for k ,y,e in list(args).items():
#     print(k,y,e)
test_args_kwargs(*args)
 文章来源地址https://www.toymoban.com/news/detail-460445.html

到了这里,关于Python 知识体系补全(闭包、装饰器、关键字参数**kwargs,位置参数*args)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每天一个知识点 - 了解和使用super关键字

    super是一个,super和this很类似 可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作 如果子类重写了父类的中某个方法的实现,可以通过使用 super 来引用父类的方法实现        super( )函数是用于调用父类的一个方法,指向了当前对象自

    2024年02月21日
    浏览(34)
  • 【C++入门必备知识:|引用| +|auto关键字| + |范围for|】

    在这里插入图片描述 引用不是新定义一个变量,而是给已经存在的变量取别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存区间。 比如水浒传里的李逵 小名叫铁牛,江湖人称黑旋风。这些都是他,只不过名字不同。 类型 引用变量名=引用实体

    2023年04月22日
    浏览(41)
  • 用python实现给出关键字查找并标注pdf文件中关键字

    要在Python中标注PDF文件中的,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现查找和标注功能: python 复制代码 import pdfminer   from pdf

    2024年01月16日
    浏览(45)
  • 不可不看的Java基础知识整理,注释、关键字、运算符

    万丈高楼平地起,要想学好汉语首先学拼音,想学好英语首先学26个字母,对于编程语言来说,一样的道理,要想学好必须先掌握其基础语法和知识,今天我们就来唠一唠Java语言中那些出现频率极高,又很基础的知识点吧! 注释的作用:拨云见日! 在日常的工作中,总会遇

    2024年01月16日
    浏览(44)
  • Python | assert关键字

    Python断言assert是帮助代码流畅的调试工具。断言主要是假设程序员知道或总是希望是真的,因此将它们放在代码中,这样这些失败不会允许代码进一步执行。 简单地说,断言是一个布尔表达式,用来检查语句是True还是False。如果语句为True,则不执行任何操作并继续执行,但

    2024年02月11日
    浏览(42)
  • Python Selenium 关键字驱动

    目录 项目目录结构  action目录 config目录 exceptionpictures目录 log目录 testCases目录

    2024年02月05日
    浏览(36)
  • python之except关键字

    在python中,except是用于处理异常的,通常与\\\'try\\\'一起使用。异常处理的基本结构是通过try块包裹可能发生异常的代码,然后使用except块捕获和处理可能发生的异常。 如果在try块中发生异常,python会跳转到与异常类型匹配的except块,执行相应的异常处理代码。 示例:

    2024年01月16日
    浏览(32)
  • 初识Python(注释、编码规范、关键字...)

    🥇 作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥 本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合集 私信未回可以加V:hacker0327 备注零基础学Python 订阅专栏附赠此专栏

    2024年04月11日
    浏览(27)
  • 【python基础】循环语句-break关键字

    break,其作用是在循环中的代码块遇到此,立刻跳出整个循环,执行循环外的下一条语句。 其在while和for循环中的作用示意图如下: 比如我们通过键盘输入单词,输出刚才的单词,编写程序如下所示: 我们发现当我们输入除了quit和break这两个单词之外,输出结果

    2024年02月08日
    浏览(27)
  • 【python基础】循环语句-continue关键字

    continue的作用是:用来告诉 Python 跳过当前循环代码块中的剩余语句,然后继续进行下一轮循环。 其在while循环和for循环中的作用示意图如下 我们通过示意图发现,其只是中断本次循环,本次循环中在continue后面的代码语句将不被执行,直接转向条件测试,测试通过执行

    2024年02月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包