欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python3標(biāo)準(zhǔn)庫函數(shù),python38標(biāo)準(zhǔn)庫

Python常用函數(shù)三有哪些?這7個(gè)函數(shù)使用頻率最高,總算搞明白了

1.1 例如:print(hex(2))案例

創(chuàng)新互聯(lián)2013年至今,公司自成立以來始終致力于為企業(yè)提供官網(wǎng)建設(shè)、移動(dòng)互聯(lián)網(wǎng)業(yè)務(wù)開發(fā)(成都小程序開發(fā)、手機(jī)網(wǎng)站建設(shè)、重慶APP軟件開發(fā)等),并且包含互聯(lián)網(wǎng)基礎(chǔ)服務(wù)(域名、主機(jī)服務(wù)、企業(yè)郵箱、網(wǎng)絡(luò)營銷等)應(yīng)用服務(wù);以先進(jìn)完善的建站體系及不斷開拓創(chuàng)新的精神理念,幫助企業(yè)客戶實(shí)現(xiàn)互聯(lián)網(wǎng)業(yè)務(wù),嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致贊譽(yù)。

1.2 輸出函數(shù):print(hex(2))

1.3 輸出結(jié)果:0x2

1.4 解析說明:返回16進(jìn)制的數(shù)。

2.1 例如:print(chr(10))案例

2.2 輸出函數(shù):print(chr(10))

2.3 輸出結(jié)果:0o12

2.4 解析說明:返回當(dāng)前整數(shù)對(duì)應(yīng)的ASCll碼

3.1 例如:print(ord("b"))案例

3.2 輸出函數(shù):print(ord("b"))

3.3 輸出結(jié)果:98

3.4 解析說明:返回當(dāng)前ASCll碼的10進(jìn)制數(shù)

4.1 例如:print(chr(97))

4.2 輸出函數(shù):print(chr(97))

4.3 輸出結(jié)果:b

4.4 解析說明:返回當(dāng)前ASCll碼的10進(jìn)制數(shù)。

案例一:給你一個(gè)字符串,s = 'hello kitty'

1.1 輸出函數(shù):print(s.capitalize())

1.2 輸出結(jié)果:0x2

1.3 解析說明:返回16進(jìn)制的數(shù)。

2.1輸出函數(shù):print(s.replace('kitty','kuang'))

2.2 輸出結(jié)果:hello kuang

2.3 解析說明:替換功能,將kitty換成kuang。

2.4 輸出函數(shù):print(s.replace('4','KK'))

2.5 輸出結(jié)果:12KK12KK

2.6 解析說明:所有的4都替換成KK

2.7 輸出函數(shù):print(s.replace('4','KK'))

2.8 輸出結(jié)果:12KK12KK124

2.9 解析說明:將前兩個(gè)的4替換成go

案例一:給你一個(gè)字符串,ip = '192.168.1.1'

3.1 輸出函數(shù):print(ip.split(','))

3.2 輸出結(jié)果:['192.168.1.1']

3.3 解析說明:將字符串分割成列表

案例一:給你一個(gè)字符串,ip = '192.168.1.1'

3.3 輸出函數(shù):print(ip.split(',',2))

3.4 輸出結(jié)果:['192.168.1.1']

3.5 解析說明:從第二個(gè)開始分割成列表

后端編程Python3-調(diào)試、測(cè)試和性能剖析(下)

單元測(cè)試(Unit Testing)

為程序編寫測(cè)試——如果做的到位——有助于減少bug的出現(xiàn),并可以提高我們對(duì)程序按預(yù)期目標(biāo)運(yùn)行的信心。通常,測(cè)試并不能保證正確性,因?yàn)閷?duì)大多數(shù)程序而言, 可能的輸入范圍以及可能的計(jì)算范圍是如此之大,只有其中最小的一部分能被實(shí)際地進(jìn) 行測(cè)試。盡管如此,通過仔細(xì)地選擇測(cè)試的方法和目標(biāo),可以提高代碼的質(zhì)量。

大量不同類型的測(cè)試都可以進(jìn)行,比如可用性測(cè)試、功能測(cè)試以及整合測(cè)試等。這里, 我們只講單元測(cè)試一對(duì)單獨(dú)的函數(shù)、類與方法進(jìn)行測(cè)試,確保其符合預(yù)期的行為。

TDD的一個(gè)關(guān)鍵點(diǎn)是,當(dāng)我們想添加一個(gè)功能時(shí)——比如為類添加一個(gè)方法—— 我們首次為其編寫一個(gè)測(cè)試用例。當(dāng)然,測(cè)試將失敗,因?yàn)槲覀冞€沒有實(shí)際編寫該方法。現(xiàn)在,我們編寫該方法,一旦方法通過了測(cè)試,就可以返回所有測(cè)試,確保我們新添加的代碼沒有任何預(yù)期外的副作用。一旦所有測(cè)試運(yùn)行完畢(包括我們?yōu)樾鹿δ芫帉懙臏y(cè)試),就可以對(duì)我們的代碼進(jìn)行檢查,并有理有據(jù)地相信程序行為符合我們的期望——當(dāng)然,前提是我們的測(cè)試是適當(dāng)?shù)摹?/p>

比如,我們編寫了一個(gè)函數(shù),該函數(shù)在特定的索引位置插入一個(gè)字符串,可以像下面這樣開始我們的TDD:

def insert_at(string, position, insert):

"""Returns a copy of string with insert inserted at the position

string = "ABCDE"

result =[]

for i in range(-2, len(string) + 2):

... result.append(insert_at(string, i,“-”))

result[:5]

['ABC-DE', 'ABCD-E', '-ABCDE','A-BCDE', 'AB-CDE']

result[5:]

['ABC-DE', 'ABCD-E', 'ABCDE-', 'ABCDE-']

"""

return string

對(duì)不返回任何參數(shù)的函數(shù)或方法(通常返回None),我們通常賦予其由pass構(gòu)成的一個(gè)suite,對(duì)那些返回值被試用的,我們或者返回一個(gè)常數(shù)(比如0),或者某個(gè)不變的參數(shù)——這也是我們這里所做的。(在更復(fù)雜的情況下,返回fake對(duì)象可能更有用一一對(duì)這樣的類,提供mock對(duì)象的第三方模塊是可用的。)

運(yùn)行doctest時(shí)會(huì)失敗,并列出每個(gè)預(yù)期內(nèi)的字符串('ABCD-EF'、'ABCDE-F' 等),及其實(shí)際獲取的字符串(所有的都是'ABCD-EF')。一旦確定doctest是充分的和正確的,就可以編寫該函數(shù)的主體部分,在本例中只是簡(jiǎn)單的return string[:position] + insert+string[position:]。(如果我們編寫的是 return string[:position] + insert,之后復(fù)制 string [:position]并將其粘貼在末尾以便減少一些輸入操作,那么doctest會(huì)立即提示錯(cuò)誤。)

Python的標(biāo)準(zhǔn)庫提供了兩個(gè)單元測(cè)試模塊,一個(gè)是doctest,這里和前面都簡(jiǎn)單地提到過,另一個(gè)是unittest。此外,還有一些可用于Python的第三方測(cè)試工具。其中最著名的兩個(gè)是nose (code.google.com/p/python-nose)與py.test (codespeak.net/py/dist/test/test.html), nose 致力于提供比標(biāo)準(zhǔn)的unittest 模塊更廣泛的功能,同時(shí)保持與該模塊的兼容性,py.test則采用了與unittest有些不同的方法,試圖盡可能消除樣板測(cè)試代碼。這兩個(gè)第三方模塊都支持測(cè)試發(fā)現(xiàn),因此沒必要寫一個(gè)總體的測(cè)試程序——因?yàn)槟K將自己搜索測(cè)試程序。這使得測(cè)試整個(gè)代碼樹或某一部分 (比如那些已經(jīng)起作用的模塊)變得很容易。那些對(duì)測(cè)試嚴(yán)重關(guān)切的人,在決定使用哪個(gè)測(cè)試工具之前,對(duì)這兩個(gè)(以及任何其他有吸引力的)第三方模塊進(jìn)行研究都是值 得的。

創(chuàng)建doctest是直截了當(dāng)?shù)模何覀冊(cè)谀K中編寫測(cè)試、函數(shù)、類與方法的docstrings。 對(duì)于模塊,我們簡(jiǎn)單地在末尾添加了 3行:

if __name__ =="__main__":

import doctest

doctest.testmod()

在程序內(nèi)部使用doctest也是可能的。比如,blocks.py程序(其模塊在后面)有自己函數(shù)的doctest,但以如下代碼結(jié)尾:

if __name__== "__main__":

main()

這里簡(jiǎn)單地調(diào)用了程序的main()函數(shù),并且沒有執(zhí)行程序的doctest。要實(shí)驗(yàn)程序的 doctest,有兩種方法。一種是導(dǎo)入doctest模塊,之后運(yùn)行程序---比如,在控制臺(tái)中輸 入 python3 -m doctest blocks.py (在 Wndows 平臺(tái)上,使用類似于 C:Python3 lpython.exe 這樣的形式替代python3)。如果所有測(cè)試運(yùn)行良好,就沒有輸出,因此,我們可能寧愿執(zhí)行python3-m doctest blocks.py-v,因?yàn)檫@會(huì)列出每個(gè)執(zhí)行的doctest,并在最后給出結(jié)果摘要。

另一種執(zhí)行doctest的方法是使用unittest模塊創(chuàng)建單獨(dú)的測(cè)試程序。在概念上, unittest模塊是根據(jù)Java的JUnit單元測(cè)試庫進(jìn)行建模的,并用于創(chuàng)建包含測(cè)試用例的測(cè)試套件。unittest模塊可以基于doctests創(chuàng)建測(cè)試用例,而不需要知道程序或模塊包含的任何事物——只要知道其包含doctest即可。因此,為給blocks.py程序制作一個(gè)測(cè)試套件,我們可以創(chuàng)建如下的簡(jiǎn)單程序(將其稱為test_blocks.py):

import doctest

import unittest

import blocks

suite = unittest.TestSuite()

suite.addTest(doctest.DocTestSuite(blocks))

runner = unittest.TextTestRunner()

print(runner.run(suite))

注意,如果釆用這種方法,程序的名稱上會(huì)有一個(gè)隱含的約束:程序名必須是有效的模塊名。因此,名為convert-incidents.py的程序的測(cè)試不能寫成這樣。因?yàn)閕mport convert-incidents不是有效的,在Python標(biāo)識(shí)符中,連接符是無效的(避開這一約束是可能的,但最簡(jiǎn)單的解決方案是使用總是有效模塊名的程序文件名,比如,使用下劃線替換連接符)。這里展示的結(jié)構(gòu)(創(chuàng)建一個(gè)測(cè)試套件,添加一個(gè)或多個(gè)測(cè)試用例或測(cè)試套件,運(yùn)行總體的測(cè)試套件,輸出結(jié)果)是典型的機(jī)遇unittest的測(cè)試。運(yùn)行時(shí),這一特定實(shí)例產(chǎn)生如下結(jié)果:

...

.............................................................................................................

Ran 3 tests in 0.244s

OK

每次執(zhí)行一個(gè)測(cè)試用例時(shí),都會(huì)輸出一個(gè)句點(diǎn)(因此上面的輸出最前面有3個(gè)句點(diǎn)),之后是一行連接符,再之后是測(cè)試摘要(如果有任何一個(gè)測(cè)試失敗,就會(huì)有更多的輸出信息)。

如果我們嘗試將測(cè)試分離開(典型情況下是要測(cè)試的每個(gè)程序和模塊都有一個(gè)測(cè)試用例),就不要再使用doctests,而是直接使用unittest模塊的功能——尤其是我們習(xí)慣于使用JUnit方法進(jìn)行測(cè)試時(shí)ounittest模塊會(huì)將測(cè)試分離于代碼——對(duì)大型項(xiàng)目(測(cè)試編寫人員與開發(fā)人員可能不一致)而言,這種方法特別有用。此外,unittest單元測(cè)試編寫為獨(dú)立的Python模塊,因此,不會(huì)像在docstring內(nèi)部編寫測(cè)試用例時(shí)受到兼容性和明智性的限制。

unittest模塊定義了 4個(gè)關(guān)鍵概念。測(cè)試夾具是一個(gè)用于描述創(chuàng)建測(cè)試(以及用完之后將其清理)所必需的代碼的術(shù)語,典型實(shí)例是創(chuàng)建測(cè)試所用的一個(gè)輸入文件,最后刪除輸入文件與結(jié)果輸出文件。測(cè)試套件是一組測(cè)試用例的組合。測(cè)試用例是測(cè)試的基本單元—我們很快就會(huì)看到實(shí)例。測(cè)試運(yùn)行者是執(zhí)行一個(gè)或多個(gè)測(cè)試套件的對(duì)象。

典型情況下,測(cè)試套件是通過創(chuàng)建unittest.TestCase的子類實(shí)現(xiàn)的,其中每個(gè)名稱 以“test”開頭的方法都是一個(gè)測(cè)試用例。如果我們需要完成任何創(chuàng)建操作,就可以在一個(gè)名為setUp()的方法中實(shí)現(xiàn);類似地,對(duì)任何清理操作,也可以實(shí)現(xiàn)一個(gè)名為 tearDown()的方法。在測(cè)試內(nèi)部,有大量可供我們使用的unittest.TestCase方法,包括 assertTrue()、assertEqual()、assertAlmostEqual()(對(duì)于測(cè)試浮點(diǎn)數(shù)很有用)、assertRaises() 以及更多,還包括很多對(duì)應(yīng)的逆方法,比如assertFalse()、assertNotEqual()、failIfEqual()、 failUnlessEqual ()等。

unittest模塊進(jìn)行了很好的歸檔,并且提供了大量功能,但在這里我們只是通過一 個(gè)非常簡(jiǎn)單的測(cè)試套件來感受一下該模塊的使用。這里將要使用的實(shí)例,該練習(xí)要求創(chuàng)建一個(gè)Atomic模塊,該模塊可以用作一 個(gè)上下文管理器,以確保或者所有改變都應(yīng)用于某個(gè)列表、集合或字典,或者所有改變都不應(yīng)用。作為解決方案提供的Atomic.py模塊使用30行代碼來實(shí)現(xiàn)Atomic類, 并提供了 100行左右的模塊doctest。這里,我們將創(chuàng)建test_Atomic.py模塊,并使用 unittest測(cè)試替換doctest,以便可以刪除doctest。

在編寫測(cè)試模塊之前,我們需要思考都需要哪些測(cè)試。我們需要測(cè)試3種不同的數(shù)據(jù)類型:列表、集合與字典。對(duì)于列表,需要測(cè)試的是插入項(xiàng)、刪除項(xiàng)或修改項(xiàng)的值。對(duì)于集合,我們必須測(cè)試向其中添加或刪除一個(gè)項(xiàng)。對(duì)于字典,我們必須測(cè)試的是插入一個(gè)項(xiàng)、修改一個(gè)項(xiàng)的值、刪除一個(gè)項(xiàng)。此外,還必須要測(cè)試的是在失敗的情況下,不會(huì)有任何改變實(shí)際生效。

結(jié)構(gòu)上看,測(cè)試不同數(shù)據(jù)類型實(shí)質(zhì)上是一樣的,因此,我們將只為測(cè)試列表編寫測(cè)試用例,而將其他的留作練習(xí)。test_Atomic.py模塊必須導(dǎo)入unittest模塊與要進(jìn)行測(cè)試的Atomic模塊。

創(chuàng)建unittest文件時(shí),我們通常創(chuàng)建的是模塊而非程序。在每個(gè)模塊內(nèi)部,我們定義一個(gè)或多個(gè)unittest.TestCase子類。比如,test_Atomic.py模塊中僅一個(gè)單獨(dú)的 unittest-TestCase子類,也就是TestAtomic (稍后將對(duì)其進(jìn)行講解),并以如下兩行結(jié)束:

if name == "__main__":

unittest.main()

這兩行使得該模塊可以單獨(dú)運(yùn)行。當(dāng)然,該模塊也可以被導(dǎo)入并從其他測(cè)試程序中運(yùn)行——如果這只是多個(gè)測(cè)試套件中的一個(gè),這一點(diǎn)是有意義的。

如果想要從其他測(cè)試程序中運(yùn)行test_Atomic.py模塊,那么可以編寫一個(gè)與此類似的程序。我們習(xí)慣于使用unittest模塊執(zhí)行doctests,比如:

import unittest

import test_Atomic

suite = unittest.TestLoader().loadTestsFromTestCase(test_Atomic.TestAtomic)

runner = unittest.TextTestRunner()

pnnt(runner.run(suite))

這里,我們已經(jīng)創(chuàng)建了一個(gè)單獨(dú)的套件,這是通過讓unittest模塊讀取test_Atomic 模塊實(shí)現(xiàn)的,并且使用其每一個(gè)test*()方法(本實(shí)例中是test_list_success()、test_list_fail(),稍后很快就會(huì)看到)作為測(cè)試用例。

我們現(xiàn)在將查看TestAtomic類的實(shí)現(xiàn)。對(duì)通常的子類(不包括unittest.TestCase 子類),不怎么常見的是,沒有必要實(shí)現(xiàn)初始化程序。在這一案例中,我們將需要建立 一個(gè)方法,但不需要清理方法,并且我們將實(shí)現(xiàn)兩個(gè)測(cè)試用例。

def setUp(self):

self.original_list = list(range(10))

我們已經(jīng)使用了 unittest.TestCase.setUp()方法來創(chuàng)建單獨(dú)的測(cè)試數(shù)據(jù)片段。

def test_list_succeed(self):

items = self.original_list[:]

with Atomic.Atomic(items) as atomic:

atomic.append(1999)

atomic.insert(2, -915)

del atomic[5]

atomic[4]= -782

atomic.insert(0, -9)

self.assertEqual(items,

[-9, 0, 1, -915, 2, -782, 5, 6, 7, 8, 9, 1999])

def test_list_fail(self):

items = self.original_list[:]

with self.assertRaises(AttributeError):

with Atomic.Atomic(items) as atomic:

atomic.append(1999)

atomic.insert(2, -915)

del atomic[5]

atomic[4] = -782

atomic.poop() # Typo

self.assertListEqual(items, self.original_list)

這里,我們直接在測(cè)試方法中編寫了測(cè)試代碼,而不需要一個(gè)內(nèi)部函數(shù),也不再使用unittest.TestCase.assertRaised()作為上下文管理器(期望代碼產(chǎn)生AttributeError)。 最后我們也使用了 Python 3.1 的 unittest.TestCase.assertListEqual()方法。

正如我們已經(jīng)看到的,Python的測(cè)試模塊易于使用,并且極為有用,在我們使用 TDD的情況下更是如此。它們還有比這里展示的要多得多的大量功能與特征——比如,跳過測(cè)試的能力,這有助于理解平臺(tái)差別——并且這些都有很好的文檔支持。缺失的一個(gè)功能——但nose與py.test提供了——是測(cè)試發(fā)現(xiàn),盡管這一特征被期望在后續(xù)的Python版本(或許與Python 3.2—起)中出現(xiàn)。

性能剖析(Profiling)

如果程序運(yùn)行很慢,或者消耗了比預(yù)期內(nèi)要多得多的內(nèi)存,那么問題通常是選擇的算法或數(shù)據(jù)結(jié)構(gòu)不合適,或者是以低效的方式進(jìn)行實(shí)現(xiàn)。不管問題的原因是什么, 最好的方法都是準(zhǔn)確地找到問題發(fā)生的地方,而不只是檢査代碼并試圖對(duì)其進(jìn)行優(yōu)化。 隨機(jī)優(yōu)化會(huì)導(dǎo)致引入bug,或者對(duì)程序中本來對(duì)程序整體性能并沒有實(shí)際影響的部分進(jìn)行提速,而這并非解釋器耗費(fèi)大部分時(shí)間的地方。

在深入討論profiling之前,注意一些易于學(xué)習(xí)和使用的Python程序設(shè)計(jì)習(xí)慣是有意義的,并且對(duì)提高程序性能不無裨益。這些技術(shù)都不是特定于某個(gè)Python版本的, 而是合理的Python程序設(shè)計(jì)風(fēng)格。第一,在需要只讀序列時(shí),最好使用元組而非列表; 第二,使用生成器,而不是創(chuàng)建大的元組和列表并在其上進(jìn)行迭代處理;第三,盡量使用Python內(nèi)置的數(shù)據(jù)結(jié)構(gòu) dicts、lists、tuples 而不實(shí)現(xiàn)自己的自定義結(jié)構(gòu),因?yàn)閮?nèi)置的數(shù)據(jù)結(jié)構(gòu)都是經(jīng)過了高度優(yōu)化的;第四,從小字符串中產(chǎn)生大字符串時(shí), 不要對(duì)小字符串進(jìn)行連接,而是在列表中累積,最后將字符串列表結(jié)合成為一個(gè)單獨(dú)的字符串;第五,也是最后一點(diǎn),如果某個(gè)對(duì)象(包括函數(shù)或方法)需要多次使用屬性進(jìn)行訪問(比如訪問模塊中的某個(gè)函數(shù)),或從某個(gè)數(shù)據(jù)結(jié)構(gòu)中進(jìn)行訪問,那么較好的做法是創(chuàng)建并使用一個(gè)局部變量來訪問該對(duì)象,以便提供更快的訪問速度。

Python標(biāo)準(zhǔn)庫提供了兩個(gè)特別有用的模塊,可以輔助調(diào)査代碼的性能問題。一個(gè)是timeit模塊——該模塊可用于對(duì)一小段Python代碼進(jìn)行計(jì)時(shí),并可用于諸如對(duì)兩個(gè)或多個(gè)特定函數(shù)或方法的性能進(jìn)行比較等場(chǎng)合。另一個(gè)是cProfile模塊,可用于profile 程序的性能——該模塊對(duì)調(diào)用計(jì)數(shù)與次數(shù)進(jìn)行了詳細(xì)分解,以便發(fā)現(xiàn)性能瓶頸所在。

為了解timeit模塊,我們將查看一些小實(shí)例。假定有3個(gè)函數(shù)function_a()、 function_b()、function_c(), 3個(gè)函數(shù)執(zhí)行同樣的計(jì)算,但分別使用不同的算法。如果將這些函數(shù)放于同一個(gè)模塊中(或分別導(dǎo)入),就可以使用timeit模塊對(duì)其進(jìn)行運(yùn)行和比較。下面給出的是模塊最后使用的代碼:

if __name__ == "__main__":

repeats = 1000

for function in ("function_a", "function_b", "function_c"):

t = timeit.Timer("{0}(X, Y)".format(function),"from __main__ import {0}, X, Y".format(function))

sec = t.timeit(repeats) / repeats

print("{function}() {sec:.6f} sec".format(**locals()))

賦予timeit.Timer()構(gòu)造子的第一個(gè)參數(shù)是我們想要執(zhí)行并計(jì)時(shí)的代碼,其形式是字符串。這里,該字符串是“function_a(X,Y)”;第二個(gè)參數(shù)是可選的,還是一個(gè)待執(zhí)行的字符串,這一次是在待計(jì)時(shí)的代碼之前,以便提供一些建立工作。這里,我們從 __main__ (即this)模塊導(dǎo)入了待測(cè)試的函數(shù),還有兩個(gè)作為輸入數(shù)據(jù)傳入的變量(X 與Y),這兩個(gè)變量在該模塊中是作為全局變量提供的。我們也可以很輕易地像從其他模塊中導(dǎo)入數(shù)據(jù)一樣來進(jìn)行導(dǎo)入操作。

調(diào)用timeit.Timer對(duì)象的timeit()方法時(shí),首先將執(zhí)行構(gòu)造子的第二個(gè)參數(shù)(如果有), 之后執(zhí)行構(gòu)造子的第一個(gè)參數(shù)并對(duì)其執(zhí)行時(shí)間進(jìn)行計(jì)時(shí)。timeit.Timer.timeit()方法的返回值是以秒計(jì)數(shù)的時(shí)間,類型是float。默認(rèn)情況下,timeit()方法重復(fù)100萬次,并返回所 有這些執(zhí)行的總秒數(shù),但在這一特定案例中,只需要1000次反復(fù)就可以給出有用的結(jié)果, 因此對(duì)重復(fù)計(jì)數(shù)次數(shù)進(jìn)行了顯式指定。在對(duì)每個(gè)函數(shù)進(jìn)行計(jì)時(shí)后,使用重復(fù)次數(shù)對(duì)總數(shù)進(jìn)行除法操作,就得到了平均執(zhí)行時(shí)間,并在控制臺(tái)中打印出函數(shù)名與執(zhí)行時(shí)間。

function_a() 0.001618 sec

function_b() 0.012786 sec

function_c() 0.003248 sec

在這一實(shí)例中,function_a()顯然是最快的——至少對(duì)于這里使用的輸入數(shù)據(jù)而言。 在有些情況下一一比如輸入數(shù)據(jù)不同會(huì)對(duì)性能產(chǎn)生巨大影響——可能需要使用多組輸入數(shù)據(jù)對(duì)每個(gè)函數(shù)進(jìn)行測(cè)試,以便覆蓋有代表性的測(cè)試用例,并對(duì)總執(zhí)行時(shí)間或平均執(zhí)行時(shí)間進(jìn)行比較。

有時(shí)監(jiān)控自己的代碼進(jìn)行計(jì)時(shí)并不是很方便,因此timeit模塊提供了一種在命令行中對(duì)代碼執(zhí)行時(shí)間進(jìn)行計(jì)時(shí)的途徑。比如,要對(duì)MyModule.py模塊中的函數(shù)function_a()進(jìn)行計(jì)時(shí),可以在控制臺(tái)中輸入如下命令:python3 -m timeit -n 1000 -s "from MyModule import function_a, X, Y" "function_a(X, Y)"(與通常所做的一樣,對(duì) Windows 環(huán)境,我們必須使用類似于C:Python3lpython.exe這樣的內(nèi)容來替換python3)。-m選項(xiàng)用于Python 解釋器,使其可以加載指定的模塊(這里是timeit),其他選項(xiàng)則由timeit模塊進(jìn)行處理。 -n選項(xiàng)指定了循環(huán)計(jì)數(shù)次數(shù),-s選項(xiàng)指定了要建立,最后一個(gè)參數(shù)是要執(zhí)行和計(jì)時(shí)的代碼。命令完成后,會(huì)向控制臺(tái)中打印運(yùn)行結(jié)果,比如:

1000 loops, best of 3: 1.41 msec per loop

之后我們可以輕易地對(duì)其他兩個(gè)函數(shù)進(jìn)行計(jì)時(shí),以便對(duì)其進(jìn)行整體的比較。

cProfile模塊(或者profile模塊,這里統(tǒng)稱為cProfile模塊)也可以用于比較函數(shù) 與方法的性能。與只是提供原始計(jì)時(shí)的timeit模塊不同的是,cProfile模塊精確地展示 了有什么被調(diào)用以及每個(gè)調(diào)用耗費(fèi)了多少時(shí)間。下面是用于比較與前面一樣的3個(gè)函數(shù)的代碼:

if __name__ == "__main__":

for function in ("function_a", "function_b", "function_c"):

cProfile.run("for i in ranged 1000): {0}(X, Y)".format(function))

我們必須將重復(fù)的次數(shù)放置在要傳遞給cProfile.run()函數(shù)的代碼內(nèi)部,但不需要做任何創(chuàng)建,因?yàn)槟K函數(shù)會(huì)使用內(nèi)省來尋找需要使用的函數(shù)與變量。這里沒有使用顯式的print()語句,因?yàn)槟J(rèn)情況下,cProfile.run()函數(shù)會(huì)在控制臺(tái)中打印其輸出。下面給出的是所有函數(shù)的相關(guān)結(jié)果(有些無關(guān)行被省略,格式也進(jìn)行了稍許調(diào)整,以便與頁面適應(yīng)):

1003 function calls in 1.661 CPU seconds

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.003 0.003 1.661 1.661 :1 ( )

1000 1.658 0.002 1.658 0.002 MyModule.py:21 (function_a)

1 0.000 0.000 1.661 1.661 {built-in method exec}

5132003 function calls in 22.700 CPU seconds

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.487 0.487 22.700 22.700 : 1 ( )

1000 0.011 0.000 22.213 0.022 MyModule.py:28(function_b)

5128000 7.048 0.000 7.048 0.000 MyModule.py:29( )

1000 0.00 50.000 0.005 0.000 {built-in method bisectjeft}

1 0.000 0.000 22.700 22.700 {built-in method exec}

1000 0.001 0.000 0.001 0.000 {built-in method len}

1000 15.149 0.015 22.196 0.022 {built-in method sorted}

5129003 function calls in 12.987 CPU seconds

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.205 0.205 12.987 12.987 :l ( )

1000 6.472 0.006 12.782 0.013 MyModule.py:36(function_c)

5128000 6.311 0.000 6.311 0.000 MyModule.py:37( )

1 0.000 0.000 12.987 12.987 {built-in method exec}

ncalls ("調(diào)用的次數(shù)")列列出了對(duì)指定函數(shù)(在filename:lineno(function)中列出) 的調(diào)用次數(shù)。回想一下我們重復(fù)了 1000次調(diào)用,因此必須將這個(gè)次數(shù)記住。tottime (“總的時(shí)間”)列列出了某個(gè)函數(shù)中耗費(fèi)的總時(shí)間,但是排除了函數(shù)調(diào)用的其他函數(shù)內(nèi)部花費(fèi)的時(shí)間。第一個(gè)percall列列出了對(duì)函數(shù)的每次調(diào)用的平均時(shí)間(tottime // ncalls)。 cumtime ("累積時(shí)間")列出了在函數(shù)中耗費(fèi)的時(shí)間,并且包含了函數(shù)調(diào)用的其他函數(shù)內(nèi)部花費(fèi)的時(shí)間。第二個(gè)percall列列出了對(duì)函數(shù)的每次調(diào)用的平均時(shí)間,包括其調(diào)用的函數(shù)耗費(fèi)的時(shí)間。

這種輸出信息要比timeit模塊的原始計(jì)時(shí)信息富有啟發(fā)意義的多。我們立即可以發(fā)現(xiàn),function_b()與function_c()使用了被調(diào)用5000次以上的生成器,使得它們的速度至少要比function_a()慢10倍以上。并且,function_b()調(diào)用了更多通常意義上的函數(shù),包括調(diào)用內(nèi)置的sorted()函數(shù),這使得其幾乎比function_c()還要慢兩倍。當(dāng)然,timeit() 模塊提供了足夠的信息來查看計(jì)時(shí)上存在的這些差別,但cProfile模塊允許我們了解為什么會(huì)存在這些差別。正如timeit模塊允許對(duì)代碼進(jìn)行計(jì)時(shí)而又不需要對(duì)其監(jiān)控一樣,cProfile模塊也可以做到這一點(diǎn)。然而,從命令行使用cProfile模塊時(shí),我們不能精確地指定要執(zhí)行的 是什么——而只是執(zhí)行給定的程序或模塊,并報(bào)告所有這些的計(jì)時(shí)結(jié)果。需要使用的 命令行是python3 -m cProfile programOrModule.py,產(chǎn)生的輸出信息與前面看到的一 樣,下面給出的是輸出信息樣例,格式上進(jìn)行了一些調(diào)整,并忽略了大多數(shù)行:

10272458 function calls (10272457 primitive calls) in 37.718 CPU secs

ncalls tottime percall cumtime percall filename:lineno(function)

10.000 0.000 37.718 37.718 :1 ( )

10.719 0.719 37.717 37.717 :12( )

1000 1.569 0.002 1.569 0.002 :20(function_a)

1000 0.011 0.000 22.560 0.023 :27(function_b)

5128000 7.078 0.000 7.078 0.000 :28( )

1000 6.510 0.007 12.825 0.013 :35(function_c)

5128000 6.316 0.000 6.316 0.000 :36( )

在cProfile術(shù)語學(xué)中,原始調(diào)用指的就是非遞歸的函數(shù)調(diào)用。

以這種方式使用cProfile模塊對(duì)于識(shí)別值得進(jìn)一步研究的區(qū)域是有用的。比如,這里 我們可以清晰地看到function_b()需要耗費(fèi)更長(zhǎng)的時(shí)間,但是我們?cè)鯓荧@取進(jìn)一步的詳細(xì)資料?我們可以使用cProfile.run("function_b()")來替換對(duì)function_b()的調(diào)用。或者可以保存完全的profile數(shù)據(jù)并使用pstats模塊對(duì)其進(jìn)行分析。要保存profile,就必須對(duì)命令行進(jìn)行稍許修改:python3 -m cProfile -o profileDataFile programOrModule.py。 之后可以對(duì) profile 數(shù)據(jù)進(jìn)行分析,比如啟動(dòng)IDLE,導(dǎo)入pstats模塊,賦予其已保存的profileDataFile,或者也可以在控制臺(tái)中交互式地使用pstats。

下面給出的是一個(gè)非常短的控制臺(tái)會(huì)話實(shí)例,為使其適合頁面展示,進(jìn)行了適當(dāng)調(diào)整,我們自己的輸入則以粗體展示:

$ python3 -m cProfile -o profile.dat MyModule.py

$ python3 -m pstats

Welcome to the profile statistics browser.

% read profile.dat

profile.dat% callers function_b

Random listing order was used

List reduced from 44 to 1 due to restriction

Function was called by...

ncalls tottime cumtime

:27(function_b) - 1000 0.011 22.251 :12( )

profile.dat% callees function_b

Random listing order was used

List reduced from 44 to 1 due to restriction

Function called...

ncalls tottime cumtime

:27(function_b)-

1000 0.005 0.005 built-in method bisectJeft

1000 0.001 0.001 built-in method len

1000 1 5.297 22.234 built-in method sorted

profile.dat% quit

輸入help可以獲取命令列表,help后面跟隨命令名可以獲取該命令的更多信息。比如, help stats將列出可以賦予stats命令的參數(shù)。還有其他一些可用的工具,可以提供profile數(shù)據(jù)的圖形化展示形式,比如 RunSnakeRun (), 該工具需要依賴于wxPython GUI庫。

使用timeit與cProfile模塊,我們可以識(shí)別出我們自己代碼中哪些區(qū)域會(huì)耗費(fèi)超過預(yù)期的時(shí)間;使用cProfile模塊,還可以準(zhǔn)確算岀時(shí)間消耗在哪里。

以上內(nèi)容部分摘自視頻課程 05后端編程Python-19調(diào)試、測(cè)試和性能調(diào)優(yōu)(下) ,更多實(shí)操示例請(qǐng)參照視頻講解。跟著張員外講編程,學(xué)習(xí)更輕松,不花錢還能學(xué)習(xí)真本領(lǐng)。

Python 常用的標(biāo)準(zhǔn)庫以及第三方庫有哪些

推薦5個(gè)常用的Python標(biāo)準(zhǔn)庫:

1、os:提供了不少與操作系統(tǒng)相關(guān)聯(lián)的函數(shù)庫

os包是Python與操作系統(tǒng)的接口。我們可以用os包來實(shí)現(xiàn)操作系統(tǒng)的許多功能,比如管理系統(tǒng)進(jìn)程,改變當(dāng)前路徑,改變文件權(quán)限等。但要注意,os包是建立在操作系統(tǒng)的平臺(tái)上的,許多功能在Windows系統(tǒng)上是無法實(shí)現(xiàn)的。另外,在使用os包中,要注意其中的有些功能已經(jīng)被其他的包取代。

我們通過文件系統(tǒng)來管理磁盤上儲(chǔ)存的文件。查找、刪除、復(fù)制文件以及列出文件列表等都是常見的文件操作。這些功能通常可以在操作系統(tǒng)中看到,但現(xiàn)在可以通過Python標(biāo)準(zhǔn)庫中的glob包、shutil包、os.path包以及os包的一些函數(shù)等,在Python內(nèi)部實(shí)現(xiàn)。

2、sys:通常用于命令行參數(shù)的庫

sys包被用于管理Python自身的運(yùn)行環(huán)境。Python是一個(gè)解釋器,也是一個(gè)運(yùn)行在操作系統(tǒng)上的程序。我們可以用sys包來控制這一程序運(yùn)行的許多參數(shù),比如說Python運(yùn)行所能占據(jù)的內(nèi)存和CPU,Python所要掃描的路徑等。另一個(gè)重要功能是和Python自己的命令行互動(dòng),從命令行讀取命令和參數(shù)。

3、random:用于生成隨機(jī)數(shù)的庫

Python標(biāo)準(zhǔn)庫中的random函數(shù),可以生成隨機(jī)浮點(diǎn)數(shù)、整數(shù)、字符串,甚至幫助你隨機(jī)選擇列表序列中的一個(gè)元素,打亂一組數(shù)據(jù)等。

4、math:提供了數(shù)學(xué)常數(shù)和數(shù)學(xué)函數(shù)

標(biāo)準(zhǔn)庫中,Python定義了一些新的數(shù)字類型,以彌補(bǔ)之前的數(shù)字類型可能的不足。標(biāo)準(zhǔn)庫還包含了random包,用于處理隨機(jī)數(shù)相關(guān)的功能。math包補(bǔ)充了一些重要的數(shù)學(xué)常數(shù)和數(shù)學(xué)函數(shù),比如pi、三角函數(shù)等等。

5、datetime:日期和時(shí)間的操作庫

日期和時(shí)間的管理并不復(fù)雜,但容易犯錯(cuò)。Python的標(biāo)準(zhǔn)庫中對(duì)日期和時(shí)間的管理頗為完善,你不僅可以進(jìn)行日期時(shí)間的查詢和變換,還可以對(duì)日期時(shí)間進(jìn)行運(yùn)算。通過這些標(biāo)準(zhǔn)庫,還可以根據(jù)需要控制日期時(shí)間輸出的文本格式

python常用函數(shù)包有哪些?

一些python常用函數(shù)包:

1、Urllib3

Urllib3是一個(gè) Python 的 HTTP 客戶端,它擁有 Python 標(biāo)準(zhǔn)庫中缺少的許多功能:

線程安全

連接池

客戶端 SSL/TLS 驗(yàn)證

使用分段編碼上傳文件

用來重試請(qǐng)求和處理 HTTP 重定向的助手

支持 gzip 和 deflate 編碼

HTTP 和 SOCKS 的代理支持

2、Six

six 是一個(gè)是 Python 2 和 3 的兼容性庫。這個(gè)項(xiàng)目旨在支持可同時(shí)運(yùn)行在 Python 2 和 3 上的代碼庫。它提供了許多可簡(jiǎn)化 Python 2 和 3 之間語法差異的函數(shù)。

3、botocore、boto3、s3transfer、awscli

Botocore是 AWS 的底層接口。Botocore是 Boto3 庫(#22)的基礎(chǔ),后者讓你可以使用 Amazon S3 和 Amazon EC2 一類的服務(wù)。Botocore 還是 AWS-CLI 的基礎(chǔ),后者為 AWS 提供統(tǒng)一的命令行界面。

S3transfer(#7)是用于管理 Amazon S3 傳輸?shù)?Python 庫。它正在積極開發(fā)中,其介紹頁面不推薦人們現(xiàn)在使用,或者至少等版本固定下來再用,因?yàn)槠?API 可能發(fā)生變化,在次要版本之間都可能更改。Boto3、AWS-CLI和其他許多項(xiàng)目都依賴s3transfer。

4、Pip

pip是“Pip Installs Packages”的首字母遞歸縮寫。

pip很容易使用。要安裝一個(gè)包只需pip install package name即可,而刪除包只需pip uninstall package name即可。

最大優(yōu)點(diǎn)之一是它可以獲取包列表,通常以requirements.txt文件的形式獲取。該文件能選擇包含所需版本的詳細(xì)規(guī)范。大多數(shù) Python 項(xiàng)目都包含這樣的文件。

如果結(jié)合使用pip與virtualenv(列表中的 #57),就可以創(chuàng)建可預(yù)測(cè)的隔離環(huán)境,同時(shí)不會(huì)干擾底層系統(tǒng),反之亦然。

5、Python-dateutil

python-dateutil模塊提供了對(duì)標(biāo)準(zhǔn)datetime模塊的強(qiáng)大擴(kuò)展。我的經(jīng)驗(yàn)是,常規(guī)的Python datetime缺少哪些功能,python-dateutil就能補(bǔ)足那一塊。

6、Requests

Requests建立在我們的 #1 庫——urllib3基礎(chǔ)上。它讓 Web 請(qǐng)求變得非常簡(jiǎn)單。相比urllib3來說,很多人更喜歡這個(gè)包。而且使用它的最終用戶可能也比urllib3更多。后者更偏底層,并且考慮到它對(duì)內(nèi)部的控制級(jí)別,它一般是作為其他項(xiàng)目的依賴項(xiàng)。

7、Certifi

近年來,幾乎所有網(wǎng)站都轉(zhuǎn)向 SSL,你可以通過地址欄中的小鎖符號(hào)來識(shí)別它。加了小鎖意味著與該站點(diǎn)的通信是安全和加密的,能防止竊聽行為。

8、Idna

根據(jù)其 PyPI 頁面,idna提供了“對(duì) RFC5891 中指定的應(yīng)用程序中國際化域名(IDNA)協(xié)議的支持。”

IDNA的核心是兩個(gè)函數(shù):ToASCII和ToUnicode。ToASCII會(huì)將國際 Unicode 域轉(zhuǎn)換為 ASCII 字符串。ToUnicode則逆轉(zhuǎn)該過程。在IDNA包中,這些函數(shù)稱為idna.encode()和idna.decode()

9、PyYAML

YAML是一種數(shù)據(jù)序列化格式。它的設(shè)計(jì)宗旨是讓人類和計(jì)算機(jī)都能很容易地閱讀代碼——人類很容易讀寫它的內(nèi)容,計(jì)算機(jī)也可以解析它。

PyYAML是 Python 的YAML解析器和發(fā)射器,這意味著它可以讀寫YAML。它會(huì)把任何 Python 對(duì)象寫成YAML:列表、字典,甚至是類實(shí)例都包括在內(nèi)。

10、Pyasn1

像上面的IDNA一樣,這個(gè)項(xiàng)目也非常有用:

ASN.1 類型和 DER/BER/CER 編碼(X.208)的純 Python 實(shí)現(xiàn)

所幸這個(gè)已有數(shù)十年歷史的標(biāo)準(zhǔn)有很多信息可用。ASN.1是 Abstract Syntax Notation One 的縮寫,它就像是數(shù)據(jù)序列化的教父。它來自電信行業(yè)。也許你知道協(xié)議緩沖區(qū)或 Apache Thrift?這就是它們的 1984 年版本。

11、Docutils

Docutils是一個(gè)模塊化系統(tǒng),用來將純文本文檔處理為很多有用的格式,例如 HTML、XML 和 LaTeX 等。Docutils能讀取reStructuredText格式的純文本文檔,這種格式是類似于 MarkDown 的易讀標(biāo)記語法。

12、Chardet

你可以用chardet模塊來檢測(cè)文件或數(shù)據(jù)流的字符集。比如說,需要分析大量隨機(jī)文本時(shí),這會(huì)很有用。但你也可以在處理遠(yuǎn)程下載的數(shù)據(jù),但不知道用的是什么字符集時(shí)使用它。

13、RSA

rsa包是一個(gè)純 Python 的 RSA 實(shí)現(xiàn)。它支持:

加密和解密

簽名和驗(yàn)證簽名

根據(jù) PKCS#1 1.5 版生成密鑰

它既可以用作 Python 庫,也能在命令行中使用。

14、Jmespath

JMESPath,發(fā)音為“James path”,使 Python 中的 JSON 更容易使用。它允許你聲明性地指定如何從 JSON 文檔中提取元素。

15、Setuptools

它是用于創(chuàng)建 Python 包的工具。不過,其文檔很糟糕。它沒有清晰描述它的用途,并且文檔中包含無效鏈接。最好的信息源是這個(gè)站點(diǎn),特別是這個(gè)創(chuàng)建 Python 包的指南。

16、Pytz

像dateutils一樣,這個(gè)庫可幫助你處理日期和時(shí)間。有時(shí)候,時(shí)區(qū)處理起來可能很麻煩。幸好有這樣的包,可以讓事情變得簡(jiǎn)單些。

17、Futures

從 Python 3.2 開始,python 提供current.futures模塊,可幫助你實(shí)現(xiàn)異步執(zhí)行。futures 包是該庫適用于 Python 2 的 backport。它不適用于 Python3 用戶,因?yàn)?Python 3 原生提供了該模塊。

18、Colorama

使用 Colorama,你可以為終端添加一些顏色:

更多Python知識(shí)請(qǐng)關(guān)注Python自學(xué)網(wǎng)

二級(jí)Python----Python的內(nèi)置函數(shù)及標(biāo)準(zhǔn)庫(DAY 8)

python的內(nèi)置函數(shù)(68個(gè))

Python考核31個(gè)內(nèi)置函數(shù),

python內(nèi)置了很多內(nèi)置函數(shù)、類方法屬性及各種模塊。當(dāng)我們想要當(dāng)我們想要了解某種類型有哪些屬性方法以及每種方法該怎么使用時(shí),我們可以使用dir()函數(shù)和help()函數(shù)在python idle交互式模式下獲得我們想要的信息。

? dir()函數(shù)獲得對(duì)象中可用屬性的列表

Python中的關(guān)鍵詞有哪些?

dir(__builtins__):查看python內(nèi)置函數(shù)

help(‘keywords‘):查看python關(guān)鍵詞

如微分積分方程的求解程序、訪問互聯(lián)網(wǎng)、獲取日期和時(shí)間、機(jī)器學(xué)習(xí)算法等。這些程序往往被收入程序庫中,構(gòu)成程序庫。

只有經(jīng)過嚴(yán)格檢驗(yàn)的程序才能放在程序庫里。檢驗(yàn),就是對(duì)程序作充分的測(cè)試。通常進(jìn)行的有正確性測(cè)試、精度測(cè)試、速度測(cè)試、邊界條件和出錯(cuò)狀態(tài)的測(cè)試。經(jīng)過檢驗(yàn)的程序不但能保證計(jì)算結(jié)果的正確性,而且對(duì)錯(cuò)誤調(diào)用也能作出反應(yīng)。程序庫中的程序都是規(guī)范化的。所謂規(guī)范化有三重含義:①同一庫里所有程序的格式是統(tǒng)一的;② 對(duì)這些程序的調(diào)用方法是相同的;③ 每個(gè)程序所需參數(shù)的數(shù)目、順序和類型都是嚴(yán)格規(guī)定好的。

Python的庫包含標(biāo)準(zhǔn)庫和第三方庫

標(biāo)準(zhǔn)庫:程序語言自身擁有的庫,可以直接使用。help('modules')

第三方庫:第三方者使用該語言提供的程序庫。

標(biāo)準(zhǔn)庫: turtle 庫(必選)、 random 庫(必選)、 time 庫(可選)。

? turtle 庫:圖形繪制庫

原理如同控制一只海龜,以不同的方向和速度進(jìn)行位移而得到其運(yùn)動(dòng)軌跡。

使用模塊的幫助時(shí),需要先將模塊導(dǎo)入。

例如:在IDLE中輸入import turtle

dir(turtle)

help(turtle.**)

1.畫布

畫布就是turtle為我們展開用于繪圖區(qū)域, 我們可以設(shè)置它的大小和初始位置。

setup()方法用于初始化畫布窗口大小和位置,參數(shù)包括畫布窗口寬、畫布窗口高、窗口在屏幕的水平起始位置和窗口在屏幕的垂直起始位置。

參數(shù):width, height: 輸入寬和高為整數(shù)時(shí),表示 像素 ;為小數(shù)時(shí),表示占據(jù)電腦屏幕的比例。(startx,starty):這一坐標(biāo)表示

矩形窗口左上角頂點(diǎn)的位置,如果為空,則窗口位于屏幕中心:

例如:setup(640,480,300,300)表示在桌面屏幕(300,300)位置開始創(chuàng)建640×480大小的畫布窗體。

2、畫筆

? color() 用于設(shè)置或返回畫筆顏色和填充顏色。

例如:color(‘red’)將顏色設(shè)為紅色,也可用fillcolor()方法設(shè)置或返回填充顏色,或用pencolor()方法設(shè)置或返回筆觸顏色。

新聞名稱:python3標(biāo)準(zhǔn)庫函數(shù),python38標(biāo)準(zhǔn)庫
標(biāo)題來源:http://chinadenli.net/article44/dsiohee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作網(wǎng)站設(shè)計(jì)公司做網(wǎng)站網(wǎng)站策劃云服務(wù)器軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)