偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

騰訊在職8年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)給初學(xué)者的總結(jié),希望有用

開(kāi)發(fā) 后端
當(dāng)我開(kāi)始學(xué)習(xí)Python的時(shí)候,有些事我希望我一早就知道。我花費(fèi)了很多時(shí)間才學(xué)會(huì)這些東西。我想要把這些重點(diǎn)都編纂到一篇文章當(dāng)中。

 當(dāng)我開(kāi)始學(xué)習(xí)Python的時(shí)候,有些事我希望我一早就知道。我花費(fèi)了很多時(shí)間才學(xué)會(huì)這些東西。我想要把這些重點(diǎn)都編纂到一篇文章當(dāng)中。這篇文章的目標(biāo)讀者,是剛剛開(kāi)始學(xué)習(xí)Python語(yǔ)言的有經(jīng)驗(yàn)的程序員,想要跳過(guò)前幾個(gè)月研究Python使用的那些他們已經(jīng)在用的類似工具。包管理和標(biāo)準(zhǔn)工具這兩節(jié)對(duì)于初學(xué)者來(lái)說(shuō)同樣很有幫助。 

我的經(jīng)驗(yàn)主要基于Python 2.7,但是大多數(shù)的工具對(duì)任何版本都有效。

如果你從來(lái)沒(méi)有使用過(guò)Python,我強(qiáng)烈建議你閱讀Python introduction,因?yàn)槟阈枰阑镜恼Z(yǔ)法和類型。

包管理

Python世界最棒的地方之一,就是大量的第三方程序包。同樣,管理這些包也非常容易。按照慣例,會(huì)在 requirements.txt 文件中列出項(xiàng)目所需要的包。每個(gè)包占一行,通常還包含版本號(hào)。這里有一個(gè)例子,本博客使用Pelican:

  1. ; html-script: false ]pelican==3.3 
  2. Markdown 
  3. pelican-extended-sitemap==1.0.0 

Python 程序包有一個(gè)缺陷是,它們默認(rèn)會(huì)進(jìn)行全局安裝。我們將要使用一個(gè)工具,使我們每個(gè)項(xiàng)目都有一個(gè)獨(dú)立的環(huán)境,這個(gè)工具叫virtualenv。我們同樣要安裝一個(gè)更高級(jí)的包管理工具,叫做pip,他可以和virtualenv配合工作。

首先,我們需要安裝pip。大多數(shù)python安裝程序已經(jīng)內(nèi)置了easy_install(python默認(rèn)的包管理工具),所以我們就使用easy_install pip來(lái)安裝pip。這應(yīng)該是你***一次使用easy_install 了。如果你并沒(méi)有安裝easy_install ,在linux系統(tǒng)中,貌似從python-setuptools 包中可以獲得。

如果你使用的Python版本高于等于3.3, 那么Virtualenv 已經(jīng)是標(biāo)準(zhǔn)庫(kù)的一部分了,所以沒(méi)有必要再去安裝它了。

下一步,你希望安裝virtualenv和virtualenvwrapper。Virtualenv使你能夠?yàn)槊總€(gè)項(xiàng)目創(chuàng)造一個(gè)獨(dú)立的環(huán)境。尤其是當(dāng)你的不同項(xiàng)目使用不同版本的包時(shí),這一點(diǎn)特別有用。Virtualenv wrapper 提供了一些不錯(cuò)的腳本,可以讓一些事情變得容易。

Shell

  1. ; html-script: false ]sudo pip install virtualenvwrapper 

當(dāng)virtualenvwrapper安裝后,它會(huì)把virtualenv列為依賴包,所以會(huì)自動(dòng)安裝。

打開(kāi)一個(gè)新的shell,輸入mkvirtualenv test 。如果你打開(kāi)另外一個(gè)shell,則你就不在這個(gè)virtualenv中了,你可以通過(guò)workon test 來(lái)啟動(dòng)。如果你的工作完成了,可以使用deactivate 來(lái)停用。  

騰訊在職8年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)給初學(xué)者的總結(jié),希望有用

IPython

IPython是標(biāo)準(zhǔn)Python交互式的編程環(huán)境的一個(gè)替代品,支持自動(dòng)補(bǔ)全,文檔快速訪問(wèn),以及標(biāo)準(zhǔn)交互式編程環(huán)境本應(yīng)該具備的很多其他功能。

當(dāng)你處在一個(gè)虛擬環(huán)境中的時(shí)候,可以很簡(jiǎn)單的使用pip install ipython 來(lái)進(jìn)行安裝,在命令行中使用ipython 來(lái)啟動(dòng)。 

騰訊在職8年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)給初學(xué)者的總結(jié),希望有用

另一個(gè)不錯(cuò)的功能是”筆記本”,這個(gè)功能需要額外的組件。安裝完成后,你可以使用ipython notebook,而且會(huì)有一個(gè)不錯(cuò)的網(wǎng)頁(yè)UI,你可以創(chuàng)建筆記本。這在科學(xué)計(jì)算領(lǐng)域很流行。 

騰訊在職8年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)給初學(xué)者的總結(jié),希望有用

測(cè)試

我推薦使用nose或是py.test。我大部分情況下用nose。它們基本上是類似的。我將講解nose的一些細(xì)節(jié)。

這里有一個(gè)人為創(chuàng)建的可笑的使用nose進(jìn)行測(cè)試的例子。在一個(gè)以test_開(kāi)頭的文件中的所有以test_開(kāi)頭的函數(shù),都會(huì)被調(diào)用:

  1. Python 
  2.  
  3. ; html-script: false ]def test_equality(): 
  4.  assert True == False 

不出所料,當(dāng)運(yùn)行nose的時(shí)候,我們的測(cè)試沒(méi)有通過(guò)。

Shell

  1. ; html-script: false ](test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests  
  2. ====================================================================== 
  3. FAIL: test_nose_example.test_equality 
  4. ---------------------------------------------------------------------- 
  5. Traceback (most recent call last): 
  6.  File "/Users/jhaddad/.virtualenvs/test/lib/python2.7/site-packages/nose/case.py", line 197, in runTest 
  7.  self.test(*self.arg) 
  8.  File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 3, in test_equality 
  9.  assert True == False 
  10. AssertionError 
  11.   
  12. ---------------------------------------------------------------------- 

nose.tools中同樣也有一些便捷的方法可以調(diào)用。

Python

  1. ; html-script: false ]from nose.tools import assert_true 
  2. def test_equality(): 
  3.  assert_true(False

如果你想使用更加類似JUnit的方法,也是可以的:

Python

  1. ; html-script: false ]from nose.tools import assert_true 
  2. from unittest import TestCase 
  3.   
  4. class ExampleTest(TestCase): 
  5.   
  6.  def setUp(self): # setUp & tearDown are both available 
  7.  self.blah = False 
  8.   
  9.  def test_blah(self): 
  10.  self.assertTrue(self.blah) 

開(kāi)始測(cè)試:

Shell

  1. ; html-script: false ](test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests  
  2. ====================================================================== 
  3. FAIL: test_blah (test_nose_example.ExampleTest) 
  4. ---------------------------------------------------------------------- 
  5. Traceback (most recent call last): 
  6.  File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 11, in test_blah 
  7.  self.assertTrue(self.blah) 
  8. AssertionError: False is not true 
  9.   
  10. ---------------------------------------------------------------------- 
  11. Ran 1 test in 0.003s 
  12.   
  13. FAILED (failures=1) 

卓越的Mock庫(kù)包含在Python 3 中,但是如果你在使用Python 2,可以使用pypi來(lái)獲取。這個(gè)測(cè)試將進(jìn)行一個(gè)遠(yuǎn)程調(diào)用,但是這次調(diào)用將耗時(shí)10s。這個(gè)例子顯然是人為捏造的。我們使用mock來(lái)返回樣本數(shù)據(jù)而不是真正的進(jìn)行調(diào)用。

Python

  1. ; html-script: false ]import mock 
  2.   
  3. from mock import patch 
  4. from time import sleep 
  5.   
  6. class Sweetness(object): 
  7.  def slow_remote_call(self): 
  8.  sleep(10) 
  9.  return "some_data" # lets pretend we get this back from our remote api call 
  10.   
  11. def test_long_call(): 
  12.  s = Sweetness() 
  13.  result = s.slow_remote_call() 
  14.  assert result == "some_data" 

當(dāng)然,我們的測(cè)試需要很長(zhǎng)的時(shí)間。

Shell

  1. ; html-script: false ](test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py  
  2.   
  3. Ran 1 test in 10.001s 
  4.   
  5. OK 

太慢了!因此我們會(huì)問(wèn)自己,我們?cè)跍y(cè)試什么?我們需要測(cè)試遠(yuǎn)程調(diào)用是否有用,還是我們要測(cè)試當(dāng)我們獲得數(shù)據(jù)后要做什么?大多數(shù)情況下是后者。讓我們擺脫這個(gè)愚蠢的遠(yuǎn)程調(diào)用吧:

Python

  1. ; html-script: false ]import mock 
  2.   
  3. from mock import patch 
  4. from time import sleep 
  5.   
  6. class Sweetness(object): 
  7.  def slow_remote_call(self): 
  8.  sleep(10) 
  9.  return "some_data" # lets pretend we get this back from our remote api call 
  10.   
  11. def test_long_call(): 
  12.  s = Sweetness() 
  13.  with patch.object(s, "slow_remote_call", return_value="some_data"): 
  14.  result = s.slow_remote_call() 
  15.  assert result == "some_data" 

好吧,讓我們?cè)僭囈淮危?/p>

Shell

  1. ; html-script: false ](test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py  
  2. ---------------------------------------------------------------------- 
  3. Ran 1 test in 0.001s 
  4.   
  5. OK 

好多了。記住,這個(gè)例子進(jìn)行了荒唐的簡(jiǎn)化。就我個(gè)人來(lái)講,我僅僅會(huì)忽略從遠(yuǎn)程系統(tǒng)的調(diào)用,而不是我的數(shù)據(jù)庫(kù)調(diào)用。

nose-progressive是一個(gè)很好的模塊,它可以改善nose的輸出,讓錯(cuò)誤在發(fā)生時(shí)就顯示出來(lái),而不是留到***。如果你的測(cè)試需要花費(fèi)一定的時(shí)間,那么這是件好事。

pip install nose-progressive 并且在你的nosetests中添加--with-progressive

調(diào)試

iPDB是一個(gè)極好的工具,我已經(jīng)用它查出了很多匪夷所思的bug。pip install ipdb 安裝該工具,然后在你的代碼中import ipdb; ipdb.set_trace(),然后你會(huì)在你的程序運(yùn)行時(shí),獲得一個(gè)很好的交互式提示。它每次執(zhí)行程序的一行并且檢查變量。 

騰訊在職8年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)給初學(xué)者的總結(jié),希望有用

python內(nèi)置了一個(gè)很好的追蹤模塊,幫助我搞清楚發(fā)生了什么。這里有一個(gè)沒(méi)什么用的python程序:

Python

  1. ; html-script: false ]a = 1 
  2. b = 2 
  3. a = b 

這里是對(duì)這個(gè)程序的追蹤結(jié)果:

Shell

  1. ; html-script: false ](test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python -m trace --trace tracing.py 1 ↵  
  2.  --- modulename: tracing, funcname: <module> 
  3. tracing.py(1): a = 1 
  4. tracing.py(2): b = 2 
  5. tracing.py(3): a = b 
  6.  --- modulename: trace, funcname: _unsettrace 
  7. trace.py(80): sys.settrace(None) 

當(dāng)你想要搞清楚其他程序的內(nèi)部構(gòu)造的時(shí)候,這個(gè)功能非常有用。如果你以前用過(guò)strace,它們的工作方式很相像。

在一些場(chǎng)合,我使用pycallgraph來(lái)追蹤性能問(wèn)題。它可以創(chuàng)建函數(shù)調(diào)用時(shí)間和次數(shù)的圖表。 

騰訊在職8年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的程序員寫(xiě)給初學(xué)者的總結(jié),希望有用

***,objgraph對(duì)于查找內(nèi)存泄露非常有用。這里有一篇關(guān)于如何使用它查找內(nèi)存泄露的好文。

Gevent

Gevent 是一個(gè)很好的庫(kù),封裝了Greenlets,使得Python具備了異步調(diào)用的功能。是的,非常棒。我***的功能是Pool,它抽象了異步調(diào)用部分,給我們提供了可以簡(jiǎn)單使用的途徑,一個(gè)異步的map()函數(shù):

Python

  1. ; html-script: false ]from gevent import monkey 
  2. monkey.patch_all() 
  3.   
  4. from time import sleep, time 
  5.   
  6. def fetch_url(url): 
  7.  print "Fetching %s" % url 
  8.  sleep(10) 
  9.  print "Done fetching %s" % url 
  10.   
  11. from gevent.pool import Pool 
  12.   
  13. urls = ["http://test.com""http://bacon.com""http://eggs.com"
  14.   
  15. p = Pool(10) 
  16.   
  17. start = time() 
  18. p.map(fetch_url, urls) 
  19. print time() - start 

非常重要的是,需要注意這段代碼頂部對(duì)gevent monkey進(jìn)行的補(bǔ)丁,如果沒(méi)有它的話,就不能正確的運(yùn)行。如果我們讓Python連續(xù)調(diào)用 fetch_url 3次,通常我們期望這個(gè)過(guò)程花費(fèi)30秒時(shí)間。使用gevent:

Python

  1. ; html-script: false ](test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python g.py  
  2. Fetching http://test.com 
  3. Fetching http://bacon.com 
  4. Fetching http://eggs.com 
  5. Done fetching http://test.com 
  6. Done fetching http://bacon.com 
  7. Done fetching http://eggs.com 
  8. 10.001791954 

如果你有很多數(shù)據(jù)庫(kù)調(diào)用或是從遠(yuǎn)程URLs獲取,這是非常有用的。我并不是很喜歡回調(diào)函數(shù),所以這一抽象對(duì)我來(lái)說(shuō)效果很好。

結(jié)論

好吧,如果你看到這里了,那么你很可能已經(jīng)學(xué)到了一些新東西。這些工具,在過(guò)去的一年里對(duì)我影響重大。找打它們花費(fèi)了不少時(shí)間,所以希望本文能夠減少其他人想要很好利用這門(mén)語(yǔ)言需要付出的努力。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2014-03-12 10:11:57

Python設(shè)計(jì)模式

2009-11-18 09:30:43

2009-09-28 09:45:00

CCNA學(xué)習(xí)經(jīng)驗(yàn)CCNA

2014-01-03 14:09:57

Git學(xué)習(xí)

2017-12-07 15:38:22

大數(shù)據(jù)HadoopSQL

2014-03-06 11:08:40

自學(xué)編程程序員

2021-10-13 07:22:36

大數(shù)據(jù)面試培訓(xùn)

2024-07-18 08:24:09

2022-12-13 12:55:15

Bash循環(huán)

2020-09-13 09:16:17

TypeScriptJavaScript開(kāi)發(fā)

2021-12-09 05:58:51

編程語(yǔ)言開(kāi)發(fā)代碼

2011-07-04 14:14:54

java

2022-10-10 15:28:45

負(fù)載均衡

2015-07-20 13:56:59

SDN

2011-06-17 15:32:28

Qt

2011-03-10 09:17:25

軟件編程

2020-09-06 22:04:48

Python運(yùn)算符開(kāi)發(fā)

2024-08-17 12:14:06

2011-09-16 09:38:19

Emacs
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)