Python题求解答! Python问题求解答

Python\u9898\u76ee \u6c42\u89e3\u7b54

import matplotlib.pyplot as pltx = range(1, 11)y = [2 * i ** 2 + 3 for i in x]plt.plot(x, y)plt.show()

\u4f7f\u7528jieba\u5206\u8bcd\u5f88\u5bb9\u6613\u641e\u5b9a\uff0c\u8fd9\u662f\u6211\u5199\u7684\u4e00\u7247\u6587\u7ae0\u3002
\u7f51\u9875\u94fe\u63a5

单元测试

如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。


比如对函数abs(),我们可以编写出以下几个测试用例:

输入正数,比如1、1.2、0.99,期待返回值与输入相同;

输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;

输入0,期待返回0;

输入非数值类型,比如None、[]、{},期待抛出TypeError。

把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。

如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。

单元测试通过后有什么意义呢?如果我们对abs()函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改不会对abs()函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。

这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。

我们来编写一个Dict类,这个类的行为和dict一致,但是可以通过属性来访问,用起来就像下面这样:

>>> d = Dict(a=1, b=2)
>>> d['a']
1
>>> d.a
1

mydict.py代码如下:

class Dict(dict):

   def __init__(self, **kw):
       super(Dict, self).__init__(**kw)

   def __getattr__(self, key):
       try:
           return self[key]
       except KeyError:
           raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

   def __setattr__(self, key, value):
       self[key] = value

为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py如下:

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

   def test_init(self):
       d = Dict(a=1, b='test')
       self.assertEquals(d.a, 1)
       self.assertEquals(d.b, 'test')
       self.assertTrue(isinstance(d, dict))

   def test_key(self):
       d = Dict()
       d['key'] = 'value'
       self.assertEquals(d.key, 'value')

   def test_attr(self):
       d = Dict()
       d.key = 'value'
       self.assertTrue('key' in d)
       self.assertEquals(d['key'], 'value')

   def test_keyerror(self):
       d = Dict()
       with self.assertRaises(KeyError):
           value = d['empty']

   def test_attrerror(self):
       d = Dict()
       with self.assertRaises(AttributeError):
           value = d.empty

编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。

以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。

对每一类测试都需要编写一个test_xxx()方法。由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEquals():

self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等

另一种重要的断言就是期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出KeyError:

with self.assertRaises(KeyError):
   value = d['empty']

而通过d.empty访问不存在的key时,我们期待抛出AttributeError:

with self.assertRaises(AttributeError):
   value = d.empty

运行单元测试

一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是在mydict_test.py的最后加上两行代码:

if __name__ == '__main__':
   unittest.main()

这样就可以把mydict_test.py当做正常的python脚本运行:

$ python mydict_test.py

另一种更常见的方法是在命令行通过参数-m unittest直接运行单元测试:

$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK

这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。

setUp与tearDown

可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。

setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:

class TestDict(unittest.TestCase):

   def setUp(self):
       print 'setUp...'

   def tearDown(self):
       print 'tearDown...'

可以再次运行测试看看每个测试方法调用前后是否会打印出setUp...和tearDown...。

小结

单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。

单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。

单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。

单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。



  • 鍊煎緱鑻︾粌鐨100閬Python缁忓吀缁冩墜棰,(闄勮缁嗙瓟妗)寤鸿鏀惰棌
    绛旓細5): if i!=j and j!=k and k!=i: print(i,j,k) total+=1print("鎬荤粍鍚堟暟锛", total)鎴栬咃紝浣犲彲浠ヤ娇鐢Python鐨itertools妯″潡绠鍖栭棶棰橈細import itertoolssum2 = 0a = [1,2,3,4]for i in
  • Python绋嬪簭璁捐,姹傚ぇ绁瑙g瓟
    绛旓細鍦 Python 涓锛宔xcept 璇彞鍙互鎹曡幏浠讳綍绫诲瀷鐨勫紓甯革紝涓嶄竴瀹氳鍜屾姏鍑哄紓甯哥殑绫诲瀷鐩稿悓銆傚彲浠ヤ娇鐢ㄤ竴涓 except 璇彞鏉ユ崟鑾锋墍鏈夌被鍨嬬殑寮傚父锛屼篃鍙互浣跨敤澶氫釜 except 璇彞鏉ュ垎鍒崟鑾蜂笉鍚岀被鍨嬬殑寮傚父銆傞棶棰6绛旀鏄 T.瀵广傚湪 Python 涓紝绫诲彉閲忔槸瀹氫箟鍦ㄧ被涓絾鏄湪鍑芥暟浣撲箣澶栫殑鍙橀噺锛屽畠鏄被鐨勬墍鏈夊璞″叡浜殑鍙橀噺銆傜被...
  • 鐢python璁$畻200浠ュ唴鐨勬墍鏈夊伓鏁颁互鍙婁粬浠殑鍜屾庝箞鍐欏晩姹傚ぇ绁瑙g瓟
    绛旓細1銆佸彧鏄绠楃殑鍙槸100浠ュ唴锛岃繖涓庨涓昏姹備笉绗︺傝屼笖璇硶鏄Python2銆2銆python缂栧啓1鍒100鎵鏈夊伓鏁板拰鏄2250銆100鍐呭伓鏁皐hile\for..in寰幆銆俿um=0銆俰=0銆倃hilei=100銆俿um+=i銆俰+=2銆俻rint(sum)銆俿um=0銆3銆佸叿浣撹В棰樻濊矾濡備笅锛屼娇鐢╢or寰幆杩涜閬嶅巻锛屽悓鏃朵娇鐢ㄦā杩愮畻鍒ゆ柇鍋舵暟銆傚叿浣撲唬鐮佸涓嬫墍绀恒傛眰鍜...
  • python鍒╃敤寰幆璁$畻50鍒100涓鏁扮殑鍜屽拰鍋舵暟鐨勫拰?
    绛旓細鐢python璁$畻200浠ュ唴鐨勬墍鏈夊伓鏁颁互鍙婁粬浠殑鍜屾庝箞鍐欏晩姹傚ぇ绁瑙g瓟1銆佸彧鏄绠楃殑鍙槸100浠ュ唴锛岃繖涓庨涓昏姹備笉绗︺傝屼笖璇硶鏄Python2銆2銆乸ython缂栧啓1鍒100鎵鏈夊伓鏁板拰鏄2250銆100鍐呭伓鏁皐hile\for..in寰幆銆俿um=0銆俰=0銆倃hilei=100銆俿um+=i銆俰+=2銆俻rint(sum)銆俿um=0銆3銆佸叿浣撹В棰樻濊矾濡備笅锛屼娇鐢╢or寰...
  • python宸茬煡X=3,Y=4,姹傝〃杈惧紡(3x+2y)/(4x-y)鐨勫?
    绛旓細浠ヤ笅鏄繖涓棶棰樼殑璇︾粏瑙g瓟锛氱涓姝ワ細鎵撳紑Python缂栬緫鍣ㄥ鏋淧ython瀹夎鎴愬姛锛屽彲浠ョ洿鎺ュ湪cmd涓嬭緭鍏モpython鈥杩涘叆锛屽涓嬪浘 绗簩姝ワ細鍒涘缓琛ㄨ揪寮忓彉閲忎緷娆¤緭鍏ワ紙涓嶅惈寮曞彿锛夆渪=3鈥濓紝鍥炶溅 鈥測=4鈥濓紝鍥炶溅 鈥渮 = (3 * x + 2 * y) / (4 * x - y)鈥濓紝鍥炶溅 鏁堟灉濡傚浘 绗笁姝ワ細鎵撳嵃杈撳嚭琛ㄨ揪寮忕粨鏋滆緭鍏...
  • 闂濡傚浘鎵绀(鐢python,瑙g瓟鍏ㄨ繃绋)?
    绛旓細pip install requests beautifulsoup4 lxml openpyxl 鍙戦 GET 璇锋眰锛岃幏鍙栫綉椤垫簮浠g爜 python Copy code import requests url = "https://ssr1.scrape.center/"headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0....
  • 姹傚ぇ浣府蹇瑙g瓟杩欓亾python棰樼洰!
    绛旓細鍦ㄨ繖涓Python绋嬪簭涓紝鎴戜滑棣栧厛瀹氫箟浜嗕竴涓悕涓篿sprime鐨勫嚱鏁版潵鍒ゆ柇涓涓暟鏄惁涓虹礌鏁般傚鏋滆緭鍏ョ殑鏁板皬浜庣瓑浜1锛屽垯杩斿洖False銆傛帴鐫锛屾垜浠娇鐢ㄤ竴涓猣or寰幆锛岃寖鍥存槸浠2鍒拌緭鍏ユ暟鐨勫钩鏂规牴锛堝彇鏁达級鍔1銆傚鏋滆緭鍏ョ殑鏁拌兘琚惊鐜腑鐨勪换浣曟暟鏁撮櫎锛屽垯杩斿洖False锛屽惁鍒欒繑鍥濼rue銆傚湪main鍑芥暟涓紝鎴戜滑棣栧厛灏濊瘯鑾峰彇鐢ㄦ埛杈撳叆鐨...
  • Python姹傝В绛杩囩▼
    绛旓細鍥犱负鍙栧瓧绗︿覆TempStr鐨勪粠TempStr[3]鍒癟empStr[-2]鐨勫瓧绗,杩欓噷鐨勪笅鏍囬兘鏄粠0寮濮,Python鐨鏁板鍙栧煎尯闂撮兘鏄痆3,-1)鍗婂紑鍖洪棿,鍥犳鍙栧艰寖鍥存槸[3,-2],杩愯缁撴灉鏄3.14159 绗13棰樿繖鏄竴涓眰400鍒500闂寸殑姘翠粰鑺辨暟鐨勭▼搴,姘翠粰鑺辨暟鏄寚鍚勪釜鏁颁綅涓婄殑鏁扮殑3娆℃柟鐨勫拰绛変簬杩欎釜鏁版湰韬殑3浣嶆暟,鍙橀噺i鏄彇杩欎釜3...
  • python姹s=a+aa+aaa+aaaa+aa.a鐨勫,鍏朵腑a鏄竴涓暟瀛
    绛旓細瑙g瓟杩囩▼濡傚浘鎵绀猴細Python鍦ㄦ墽琛屾椂锛岄鍏堜細灏.py鏂囦欢涓殑婧愪唬鐮佺紪璇戞垚Python鐨byte code锛堝瓧鑺傜爜锛夛紝鐒跺悗鍐嶇敱Python Virtual Machine锛圥ython铏氭嫙鏈猴級鏉ユ墽琛岃繖浜涚紪璇戝ソ鐨刡yte code銆
  • 鏈変竴閬Python鐨勯鏄緭鍏ュ渾鍗婂緞鏁版嵁璁$畻鍦嗙殑闈㈢Н,姹傝В杩欓亾棰,姹傜綉鍙瑙g瓟...
    绛旓細r=float(input())print(2*r,3.14*r*r)
  • 扩展阅读:python编程题库100题 ... python在线编程入口 ... python初学编程必背 ... python入门考试题库及答案 ... 查询python题答案app ... python练习题软件 ... 高中python编程例题 ... pythontipapp下载 ... 大学python编程题考试题库 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网