如何进行Python 代码编写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何进行Python 代码编写相关的知识,希望对你有一定的参考价值。

参考技术A 在除去完美的、有意义的语句不用而代之以晦涩的、嵌套的表达式的工作后,一个很自然的问题是:“为什么?!”我对
FP
的所有描述都是使用Python
代码做到的。但最重要的特性
--
可能也是具体情况中最有用的特性。它消除了副作用(或者至少对一些特殊领域,例如单一体,有一些牵制作用)。绝大部分程序错误
--
和促使程序员求助于调试来解决的问题
--
之所以会发生,是因为在程序执行过程期间,变量包含了意外的值。函数程序只不过根本就不为变量分配值,从而避免了这一特殊问题。
让我们看一段相当普通的命令代码。它的目的是打印出乘积大于
25
的几对数字的列表。组成各对的数字本身是从另外两个列表中挑选出的。这种操作与程序员在他们程序段中实际执行的操作差不多。深度剖析Python函数编程技巧设计Python目标何在?总结Python版本大集合讲述Python模块中的Zipfile解析初学Python时注意事项实现这一目的的命令方法如下:这个项目太小,以至于没有什么可能出错。但我们的目的可能嵌在要同时实现许多其它目的的代码中。用
"more
stuff"
注释的那些部分是副作用可能导致错误发生的地方。在这些地方中的任何一处,变量
xs

ys

bigmuls

x

y
有可能获得假设节略代码中的意外值。而且,在执行完这一段代码后,所有变量都可能具有稍后代码可能需要也可能不需要的一些值。很明显,可以使用函数/实例形式的封装和有关作用域的考虑来防止出现这种类型的错误。而且,您总是可以在执行完变量后
del
它们。但在实际中,这些指出类型的错误非常普遍。
目标的函数方法完全消除了这些副作用错误。以下是可能的一段代码:bigmuls
=
lambda
xs,ys:
filter(
lambda
(x,y):x*y
>
25,
combine(xs,ys))
combine
=
lambda
xs,ys:
map(None,
xs*len(ys),
dupelms(ys,len(xs)))
dupelms
=
lambda
lst,n:
reduce(
lambda
s,t:s+t,
map(
lambda
l,nn=n:
[l]*n,
lst))
print
bigmuls((1,2,3,4),(10,15,3,22))
在示例中,我们将匿名
Python
代码与名称进行绑定,但这不是一定必要的。我们可以只嵌套定义。这样做是出于可读性目的;但也是因为
combine()
是一种随处可得的很好实用程序函数(从两个输入列表中产生所有元素对的列表)。随后的
dupelms()
主要只是帮助
combine()
发挥作用的一种方法。即使这一函数示例比命令示例更冗长,但一旦考虑到实用程序函数可以重用,那么
bigmuls()
中的新代码本身可能比命令版本中的代码数量还要少一些。
这种函数示例真正的优势在于绝对不会有变量更改其中的任何值。稍后的代码中没有
可能的不曾预料到的副作用(较早的代码中也不会有)。很明显,它本身没有副作用并不能保证代码
正确,但即使这样,这也是个优点。

25 python入门指南如何编写测试代码

python如何编写测试代码

python内置了unittest,使得写应用层的单元测试变得超乎寻常的简单。

 

1,执行单个测试函数

#!/bin/python

import unittest

class TestMathFunc(unittest.TestCase):
    def test_add(self):
        self.assertEqual(3, 1+2)
        self.assertEqual(4, 2+2)
        self.assertNotEqual(3, 1+3)

    def runTest(self):
        self.test_add()

suite = unittest.TestSuite()
testCase = [TestMathFunc()]
suite.addTests(testCase)
runner = unittest.TextTestRunner(verbosity = 2)
runner.run(suite)

单元测试,只需要仿照上面的例子写就可以完成自己的测试代码。

 

其中包含几个部分:

a,测试类(要继承unittest.TestCase);

b,测试小组件,unittest.TestSuite,负责将测试类装入进来;

c,执行类,unittest.TextTestRunner;

 

2,执行多个测试函数

#!/bin/python

import unittest

class TestMathFunc(unittest.TestCase):
    def test_add(self):
        self.assertEqual(3, 1+2)
        self.assertEqual(4, 2+2)
        self.assertNotEqual(3, 1+3)

    def test_minus(self):
        self.assertEqual(-1, 1-2)

    def runTest(self):
        self.test_add()
        self.test_minus()

suite = unittest.TestSuite()
#testCase = [TestMathFunc(‘test_add‘), TestMathFunc(‘test_minus‘)]
testCase = [TestMathFunc()]
suite.addTests(testCase)
runner = unittest.TextTestRunner(verbosity = 2)
runner.run(suite)

修改runTest函数,将测试函数包含进来即可。

 

3,执行多个测试类

#!/bin/python

import unittest

class TestStringFunc(unittest.TestCase):
    def test_str_concat(self):
        self.assertEqual("abcabc", "abc" + "abc")

    def runTest(self):
        self.test_str_concat()

class TestMathFunc(unittest.TestCase):
    def test_add(self):
        self.assertEqual(3, 1+2)
        self.assertEqual(4, 2+2)
        self.assertNotEqual(3, 1+3)

    def test_minus(self):
        self.assertEqual(-1, 1-2)

    def runTest(self):
        self.test_add()
        self.test_minus()

suite = unittest.TestSuite()
testCase = [TestMathFunc(), TestStringFunc()]
suite.addTests(testCase)
runner = unittest.TextTestRunner(verbosity = 2)
runner.run(suite)

在suite添加多个测试类,即可。

当然还有另外的方式:

...

suite = unittest.TestSuite()

testCase = [TestMathFunc()]
suite.addTests(testCase)

testCase2 = TestStringFunc()
suite.addTest(testCase2)

runner = unittest.TextTestRunner(verbosity = 2)
runner.run(suite)

 

通过以上代码片段,即可实现,自主地控制多个测试类,自主地控制多个函数执行测试,十分方便。

 

4,有时候我们不想每个测试函数都显示调用,而是加载所有test_开头的测试函数,怎么做?

构建两个文件:t3.py,main.py

main文件存放执行代码,t3文件仅存放测试类,不存放任何执行代码

main.py

#!/bin/python
#main.py
import unittest
from t3 import TestMathFunc, TestStringFunc

suite2 = unittest.TestLoader().discover(., t3.py)

runner = unittest.TextTestRunner(verbosity = 2)
runner.run(suite2)

 

 t3.py

#!/bin/python
#t3.py

import unittest

class TestStringFunc(unittest.TestCase):
    def test_str_concat(self):
        self.assertEqual("abcabc", "abc" + "abc")

#    def runTest(self):
#        self.test_str_concat()

class TestMathFunc(unittest.TestCase):
    def test_add(self):
        self.assertEqual(3, 1+2)
        self.assertEqual(4, 2+2)
        self.assertNotEqual(3, 1+3)

    def test_minus(self):
        self.assertEqual(-1, 1-2)

#    def runTest(self):
#        self.test_add()
#        self.test_minus()

 

执行main.py,输出结果:

test_add (t3.TestMathFunc) ... ok
test_minus (t3.TestMathFunc) ... ok
test_str_concat (t3.TestStringFunc) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.001s

 

通过 unittest.TestLoader().discover(‘.‘, ‘t3.py‘) 将t3文件中包含的所有测试类导入到suite中。

依赖这个功能,我们可以将所有的需要测试的文件,导入到main主函数中,进行集中管理和测试。注意:这里不再依赖runTest函数,只要函数名中包含test前缀就会被包含进来。

 

5,有时候测试用例需要提供上下文环境,怎么做?

我们针对例子4,仅修改t3.py测试类。

class TestMathFunc(unittest.TestCase):
    def setUp(self):
        print("
TestMathFunc:setup")
        self.a = 1 
        self.b = 2 

    def test_add(self):
        self.assertEqual(3, 1+2)
        self.assertEqual(4, 2+2)
        self.assertNotEqual(3, 1+3)
        self.assertEqual(3, self.a + self.b)

    def test_minus(self):
        self.assertEqual(-1, 1-2)

 这里我们准备了环境信息(准备两个变量a和b),使用这两个变量进行单元测试。

test_add (t3.TestMathFunc) ... 
TestMathFunc:setup
ok
test_minus (t3.TestMathFunc) ... 
TestMathFunc:setup
ok
test_str_concat (t3.TestStringFunc) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.002s

OK

 

函数的输出如上。

类的单元测试,每个函数执行之前都会执行setUp函数。

对应的是tearDown,用来销毁构建的环境信息。可以自己尝试下。

 

 

参考网站:

更详细的解释:https://www.jianshu.com/p/38948d0d73f5

最详细的官方文档:https://docs.python.org/3/library/unittest.html#module-unittest

以上是关于如何进行Python 代码编写的主要内容,如果未能解决你的问题,请参考以下文章

25 python入门指南如何编写测试代码

使用VS2017进行Python代码的编写并打印出九九乘法表

pytorch 学习笔记之编写 C 扩展,又涨姿势了

Python代码编写过程中有哪些重要技巧?

python同时有两个代码,如何只运行一个

python之路 如何查看python编写代码的时候用的是2个字节还是4个字节