精华内容
下载资源
问答
  • 点击上方“Python编程...可以计算单元测试用例对于被测代码的覆盖程度,即:被执行的代码数量和代码总数量的比值统计代码覆盖率,经常在单元测试后再进行,可以为测试结果提供评判依据Python 项目最常使用的代码覆...
    点击上方“Python编程时光”,选择“加为星标第一时间关注Python技术干货!193d15b873ff70d24271847d0298c5d7.png

    后台回复关键字 “黑魔法”,即可获取明哥整理的《Python黑魔法指南

    1. 代码覆盖率

    单元测试代码覆盖率作为一种度量方式,可以计算单元测试用例对于被测代码的覆盖程度,即:被执行的代码数量和代码总数量的比值

    统计代码覆盖率,经常在单元测试后再进行,可以为测试结果提供评判依据

    Python 项目最常使用的代码覆盖率统计工具就是:Coverage

    2. Coverage

    Coverage 是用于统计 Python 代码覆盖率的工具,不仅支持分支覆盖率统计,生成 HTML 格式的统计报告,而且可以集成到 Jenkins 中使用

    安装 Coverage 依赖同样是使用 pip 安装

    # 安装 Coverage 依赖
    pip3 install coverage

    Coverage 官方提供了 2 种方式,用于统计代码覆盖率,分别是:

    1、Coverage 命令行

    2、Coverage API 

    更详细的介绍可以参考官方文档:

    https://coverage.readthedocs.io/en/latest/

    3. 实战一下

    首先,用 Python 编写一段简单被测代码,如下:
    # 被测代码 
    # main.py
    def get_level(cource):
        """
        自定义的方法
        :param cource:成绩
        :return:
        """

        if cource >= 90:
            return "优秀"
        elif cource >= 80:
            return "良好"
        elif cource >= 60:
            return "合格"
        elif cource >= 40:
            return "不合格"
        else:
            return "差"
    然后,编写单元测试用例根据上面的被测方法,这里使用 Python 自带的unittest 依赖库来编写 2 个简单的测试用例并且,特意只覆盖到了上面方法的 2 个分支,即:优秀和良好
    # 单元测试 
    # test_get_level.py 
    import unittest

    from main import *


    class GetLevel(unittest.TestCase):

        def test_get_level1(self):
            self.assertEquals(get_level(90), "优秀")

        def test_get_level2(self):
            self.assertEquals(get_level(80), "良好")


    if __name__ == '__main__':
        unittest.main(verbosity=2)
    右键运行单元测试,会发现两个测试用例都是通过的接下来,分别使用 Coverage 命令和 API 在本地生成代码覆盖率统计报告1、Coverage命令在项目根目录下,运行 coverage run 命令,生成 .coverage 文件,搜集被测试源代码覆盖率的信息
    # 1、搜集被测代码覆盖率信息,保存到 .coverage 文件中
    coverage run test_get_level.py

    # 2、生成覆盖率统计结果报告
    coverage html -d coverage_result
    然后,使用 coverage html -d  命令在同级目录下生成代码覆盖率统计报告

    e5d671bf76153786b0f7b1230f44e1b2.png

    用浏览器打开统计报告文件夹中的 index.html 文件,其中:statements:代码总行数,不包含空行和注释行missing:未执行的代码行数coverage:代码覆盖率

    6d28b483410e63aa0c3a86a433ffbd45.png

    点击 test_get_level.py 文件,可以非常直观地查看到,哪些代码执行了,哪些代码没有被执行

    d7dc615e521a9b22ea5a0f9dd937d219.png

    2、Coverage API使用 Coverage API生成代码覆盖率统计报告更方便只需要使用查找测试套件并运行,然后使用 Coverage API 进行分析、保存、展示即可
    # 使用 API 生成代码覆盖率统计报告
    # exec_api.py

    import coverage
    import unittest

    # 实例化一个对象
    cov = coverage.coverage()
    cov.start()

    # 测试套件
    suite = unittest.defaultTestLoader.discover("./""test_get_level.py")
    unittest.TextTestRunner().run(suite)


    # 结束分析
    cov.stop()

    # 结果保存
    cov.save()

    # 命令行模式展示结果
    cov.report()

    # 生成HTML覆盖率报告
    cov.html_report(directory='result_html')

    4. 最后

    上面只是通过一个简单的 Python 方法结合 unittest 单元测试框架,展示了 Coverage 获取代码覆盖率统计报告的方法

    实际项目中,更多应用场景是: Python自动化Django/Flask Web项目统计单元测试用例的代码覆盖率,以提升产品的质量

    我已经将文中全部源码上传到后台,关注公众号后回复「coverage 」即可获得全部源码

    如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

    a8a4fb8f98a5da44b2b9f6bbd418d263.png

    推荐阅读

    太赞了!《Python 黑魔法指南》终于面世了

    深扒微信多开的秘密后,我竟然发现了个 bug

    Python 为什么用 # 号作注释符?

    太好玩了,看看我用 Pyecharts绘制的“时间轮播图”

    Python 10 个习惯用法,看看你都知道不?

    手绘10张图,把CSRF、JWT说得明明白白的

    长按下图  ➡   关注博主

    (按左边关注 Python, 按右边关注 Goalng)

    667de195eb60992fbb4ca949129c80ad.png

    展开全文
  • yield用法详解带有 yield 的函数在 Python 中被称之为 generator(生成器),return和yield的形式和用法很相像,下面用两个例子说明一下。举例1deffoo():print("starting...")whileTrue:res=yield4print("res:",res)g=...
    f4a3bbeea375bac94cc0666c6d1cf13c.png

    yield用法详解

    带有 yield 的函数在 Python 中被称之为 generator(生成器),return和yield的形式和用法很相像,下面用两个例子说明一下。

    举例1

    def foo():    print("starting...")    while True:        res = yield 4        print("res:",res)g = foo()print(next(g))print("*"*20)print(next(g))

    代码输出结果为:


    starting...4********************res: None4
    1. 程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)
    2. 直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环
    3. 程序遇到yield关键字,然后把yield想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果
    4. 程序执行print("*"*20),输出20个*
    5. 又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None
    6. 程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.

    yield和return的关系和区别:带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

    举例2

    def foo():    print("starting...")    while True:        res = yield 4        print("res:",res)g = foo()print(next(g))print("*"*20)print(g.send(7))

    再看一个这个生成器的send函数的例子,这个例子就把上面那个例子的最后一行换掉了,输出结果:


    starting...4********************res: 74

    先大致说一下send函数的概念:此时你应该注意到上面那个res的值为什么是None,这个变成了7。到底为什么? 这是因为,send是发送一个参数给res的,因为上面讲到,return的时候,并没有把4赋值给res,下次执行的时候只好继续执行赋值操作,只好赋值为None了,而如果用send的话,开始执行的时候,先接着上一次(return 4之后)执行,先把7赋值给了res,然后执行next的作用,遇见下一回的yield,return出结果后结束。

    1. 程序执行g.send(7),程序会从yield关键字那一行继续向下运行,send会把7这个值赋值给res变量
    2. 由于send方法中包含next()方法,所以程序会继续向下运行执行print方法,然后再次进入while循环
    3. 程序执行再次遇到yield关键字,yield会返回后面的值后,程序再次暂停,直到再次调用next方法或send方法。

    参考

    python中yield的用法详解——最简单,最清晰的解释

    展开全文
  • 作者:豌豆花下猫来源:Python猫void 是编程语言中最常见的关键字之一,从字面上理解,它是“空的、空集、空白”的意思,最常用于表示函数的一种返回值类型。维基百科上有一个定义:The void type, in several ...

    作者:豌豆花下猫

    来源:Python猫

    void 是编程语言中最常见的关键字之一,从字面上理解,它是“空的、空集、空白”的意思,最常用于表示函数的一种返回值类型。

    维基百科上有一个定义:

    The void type, in several programming languages derived from C and Algol68, is the type for the result of a function that returns normally, but does not provide a result value to its caller.
    在 C、Algol68 及它们所派生的几种编程语言中,void 类型是函数正常返回的一种类型,但是不会给调用者返回一个值。

    简单来说,void 是一种类型(type),但是没有具体的值(value)。

    这到底是什么意思呢?

    以 Python 的几种常见类型为例,我们可以从对比中看出规律:int 是一种表示整数的类型,它有无限个可能的整数值;bool 是一种布尔类型,它有两个可能的值(True 和 False);NoneType 是一种表示 None 的类型,它只有一个值(None)。

    至于 void,它是一种更为抽象的特殊类型,但是不包含任何值。

    介绍完概念上的含义,我们就可以进入正题了。标题中的问题可以进一步分解成两个:

    • 其它语言为什么要使用 void 关键字?
    • Python 为什么不设计出 void 关键字?

    对于第一个问题,我们以 C/C++ 为例,先看看 void 的两种使用场景(PS:此处只考虑函数的用法,不考虑指针的用法,因为 Python 没有指针):

    bfab7dd3c6672498d118246f616df283.png

    当 void 用在函数的参数位置时,它表示该函数不需要传参。

    最初 C 语言的f() 表示参数数量不确定,为了另外表达“不需要参数”的语义,所以引入f(void) 作为限定。后来的语言(包括 Python)基本不在参数中使用 void,而是直接用f() 表示不需传参。C++ 为了兼容 C,所以才同时支持这两种语法。

    当 void 用在函数前作修饰时,它表示该函数没有返回值。

    在 C 语言中,若不声明返回类型,则f() 函数在编译后会返回整型的值。为了避免混乱,当不需要返回值时,就使用void f() 来作限定。

    同时,更主要的是,它还起到了占位符的作用,表明一个函数的类型是已知的,这对代码可读性和编译都有所帮助。

    void 作为函数的空返回值类型,这种用法在 C++/Java 中也被继承了。另外,在 Javascript 中也有 void 的身影,只不过它成了一种操作符,起到了完全不同的作用,此处不表。

    但是,Python 从头到尾都没有 void 关键字。

    为什么会这样?难道是因为在 Python 中不存在其它语言所面对的问题么?还是说,Python 中有自己的一套解决方案?

    仍以跟函数相关的两种用法为例作分析吧。

    在表示函数不需传参时,f(void)这种写法根本就是多余的,所以 Python 使用了最简单明了的无参式写法f()。

    至于返回值类型的用法,在我们定义出一个函数时,例如最简单的def func():pass,为了让它的调用结果func() 是一个合法的对象,那它必须具有一个有效的类型(type)。

    这应该是以类型为基的编程语言都会遇到的共性问题,Python 也不例外。

    这个时候,如果函数本身没有显式地 return 出一个对象的话,就有两种可能的解决办法:

    • 方法一,即声明该函数为 void 类型,像 C 和其它语言所做的那样,只要能通过类型检查即可
    • 方法二,则是 Python 所用的方法,即令解释器隐式地返回一个 None 对象,也就是令函数默认得到一个 NoneType 类型,再用于类型检查(PS:Javascript 也类似,只不过它默认返回的是 undefined,它不是一个对象,而是一种表示“未定义”的类型,类似于 void)

    简单而言,Python 的设计思路是直接复用已有的 NoneType 类型,并让解释器来填补缺失掉的函数类型。

    关于 Python 解释器的这个隐式填补过程,我已在上一篇《Python 函数为什么会默认返回 None?》文章详细分析过,感兴趣的同学可去查阅。

    这样做的好处至少有两点:一是没有引入新的 void 类型和关键字;二是不需要程序员在函数前声明返回类型,这就跟有显式返回值的写法保持了一致。

    试想一下,如果 Python 不让函数默认有返回值的话,就可能要写成 void def func():... 这样的形式,那它就变成了函数定义时的一种特例。与另一种特例函数相比,即异步函数asyc def func():... ,就可能引起混乱。

    总体而言,Python 似乎认为 void 空类型不是那么有存在的必要,似乎 NoneType 类型就足够了,而当缺少返回值时,让解释器统一注入是极为方便的,因此才出现了我们看到的现状。

    至此,文章标题的问题算是圆满回答了。

    最后,让我们开始进入 ending 吧:本文明面上是以“Python 为什么没有 void 关键字”为切入点,然而,它实际上瞄准的却是“Python 为什么需要返回 None”的问题。

    在《Python 函数为什么会默认返回 None?》这篇文章中,我介绍了 Python 中函数默认返回 None 的机制,它是属于“how can”的内容。但是为什么要默认返回 None 呢?这则是属于“why need”或者“why should”的问题,而它需要从 void 关键字的缺失开始谈起……

    那么,为什么 Python 没有 void 关键字呢?请往上翻,重新阅读本文……

    展开全文
  • void是编程语言中最常见的关键字之一,从字面上...维基百科上有一个定义:The void type, in several programming languages derived from C and Algol68, is the type for the result of a function that return...

    cdf0257c3c5b6fbd27917b8a09c5fe16.png

    void是编程语言中最常见的关键字之一,从字面上理解,它是“空的、空集、空白”的意思, 最常用于表示函数的一种返回值类型。

    维基百科上有一个定义:

    The void type, in several programming languages derived from C and Algol68, is the type for the result of a function that returns normally, but does not provide a result value to its caller.
    在 C、Algol68 及它们所派生的几种编程语言中,void 类型是函数正常返回的一种类型,但是不会给调用者返回一个值。

    简单来说,void 是一种类型(type),但是没有具体的值(value)。

    ffca0343dfd25167b79770806a8a7f7b.png

    这到底是什么意思呢?

    以 Python 的几种常见类型为例,我们可以从对比中看出规律:int 是一种表示整数的类型,它有无限个可能的整数值;bool 是一种布尔类型,它有两个可能的值(True 和 False);NoneType 是一种表示 None 的类型,它只有一个值(None)。

    至于 void,它是一种更为抽象的特殊类型,但是不包含任何值。

    介绍完概念上的含义,我们就可以进入正题了。标题中的问题可以进一步分解成两个:

    • 其它语言为什么要使用 void 关键字?
    • Python 为什么不设计出 void 关键字?

    对于第一个问题,我们以 C/C++ 为例,先看看 void 的两种使用场景(PS:此处只考虑函数的用法,不考虑指针的用法,因为 Python 没有指针):

    9a833b26b4ea3adde34828597ddc779f.png

    当 void 用在函数的参数位置时,它表示该函数不需要传参。

    最初 C 语言的f表示参数数量不确定,为了另外表达“不需要参数”的语义,所以引入f(void)作为限定。后来的语言(包括 Python)基本不在参数中使用 void,而是直接用f表示不需传参。C++ 为了兼容 C,所以才同时支持这两种语法。

    当 void 用在函数前作修饰时,它表示该函数没有返回值。

    在 C 语言中,若不声明返回类型,则f函数在编译后会返回整型的值。为了避免混乱,当不需要返回值时,就使用void f来作限定。

    同时,更主要的是,它还起到了占位符的作用,表明一个函数的类型是已知的,这对代码可读性和编译都有所帮助。

    void 作为函数的空返回值类型,这种用法在 C++/Java 中也被继承了。另外,在 Java 中也有 void 的身影,只不过它成了一种操作符,起到了完全不同的作用,此处不表。

    983280c6bcef6cf0a0f0d905ee6d1ee3.png

    但是, Python 从头到尾都没有 void 关键字。

    为什么会这样?难道是因为在 Python 中不存在其它语言所面对的问题么?还是说,Python 中有自己的一套解决方案?

    仍以跟函数相关的两种用法为例作分析吧。

    在表示函数不需传参时,f(void)这种写法根本就是多余的,所以 Python使用了最简单明了的无参式写法 f。

    至于返回值类型的用法,在我们定义出一个函数时,例如最简单的def func:pass,为了让它的调用结果func是一个合法的对象,那它必须具有一个有效的类型(type)。

    这应该是以类型为基的编程语言都会遇到的共性问题,Python 也不例外。

    这个时候,如果函数本身没有显式地 return 出一个对象的话,就有两种可能的解决办法:

    • 方法一,即声明该函数为 void 类型,像 C 和其它语言所做的那样,只要能通过类型检查即可
    • 方法二,则是 Python 所用的方法,即令解释器隐式地返回一个 None 对象,也就是令函数默认得到一个 NoneType 类型,再用于类型检查(PS:Java 也类似,只不过它默认返回的是 undefined,它不是一个对象,而是一种表示“未定义”的类型,类似于 void)

    简单而言,Python 的设计思路是直接复用已有的 NoneType 类型,并让解释器来填补缺失掉的函数类型。

    这样做的好处至少有两点: 一是没有引入新的 void 类型和关键字;二是不需要程序员在函数前声明返回类型,这就跟有显式返回值的写法保持了一致。

    试想一下,如果 Python 不让函数默认有返回值的话,就可能要写成 void def func:...这样的形式,那它就变成了函数定义时的一种特例。与另一种特例函数相比,即异步函数asyc def func:...,就可能引起混乱。

    总体而言,Python 似乎认为 void 空类型不是那么有存在的必要,似乎 NoneType 类型就足够了,而当缺少返回值时,让解释器统一注入是极为方便的,因此才出现了我们看到的现状。

    至此,文章标题的问题算是圆满回答了。

    最后,让我们开始进入 ending 吧:本文明面上是以“Python 为什么没有 void 关键字”为切入点,然而,它实际上瞄准的却是“Python 为什么需要返回 None”的问题。

    Python 中函数默认返回 None 的机制,它是属于“how can”的内容。但是为什么要默认返回 None 呢?这则是属于“why need”或者“why should”的问题,而它需要从 void 关键字的缺失开始谈起……

    展开全文
  • 1. DEAP框架简介DEAP(Distributed Evolutionary Algorithms in Python)是一个热门的Python进化算法框架,我们可以用这个框架在Python内实现遗传算法的应用,本文将介绍DEAP中主要模块的定义与用法,而下一期我们将用...
  • 初学Python要了解什么?装饰器知识汇总有哪些?在Python学习过程中,有多种方法对函数和类进行加工,相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用,比如插入日志、性能...
  • 超级冷门的Python知识点,收集了好久一起分享出来给大家了,不喜勿喷~... 这是省掉号,在Python中,全部皆政策。它也不破例。在 Python 中,它叫做 Ellipsis 。在 Python 3 中你能够直接写…来得到这玩意。python...
  • 本文实例讲述了Pythonreturn语句用法。分享给大家供大家参考。具体如下:return语句:return语句用来从一个函数 返回 即跳出函数。我们也可选从函数 返回一个值 。使用字面意义上的语句#!/usr/bin/python# ...
  • pythonreturn用法

    2020-11-30 17:03:07
    pythonreturn用法 python中,在调用函数的时候,为了使得函数返回我们想要的值,就需要python中的return来解决此问题。 (1)return语句是python语言中函数返回的一个值,每个函数都应该有一个返回值 (2)return...
  • Python中,有些开源项目中的方法返回结果为self....在Python中,return self的作用为:(英语原文,笔者水平有限,暂不翻译)Returning self from a method simply means that your method returns a referen...
  • pythonreturn用法

    万次阅读 多人点赞 2019-07-02 16:45:19
    pythonreturn用法 1、return语句就是把执行结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return。 例如: def haha(x,y): if x==y: ...
  • python return用法

    千次阅读 2018-07-11 10:47:00
    /usr/bin/python # -*- coding: utf-8 -*- def business(): price = 100 print("产品成本价格为:%d"%price) return pricedef shop(price): price = price + 60 print("产品定价为:%d"%...
  • 本文实例讲述了pythonreturn语句用法。分享给大家供大家参考。具体如下:return语句:return语句用来从一个函数 返回 即跳出函数。我们也可选从函数 返回一个值 。使用字面意义上的语句 #!/usr/bin/python# ...
  • (shell语言return的是退出状态,可能差别是比较大的,感兴趣可参见“LinuxShell函数定义与调用”)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别...
  • Python中,有些开源项目中的方法返回结果为self....在Python中,return self的作用为:(英语原文,笔者水平有限,暂不翻译)Returning self from a method simply means that your method returns a referen...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,629
精华内容 651
关键字:

pythonreturn用法

python 订阅