Python高效編程技巧

摘要:作者有多年的Python編程經驗,并且有很多的編程小技巧和知識,其中大多數是通過閱讀很流行的開源軟件,如Django, Flask, Requests中獲得的。

我已經使用Python編程有多年了,即使今天我仍然驚奇于這種語言所能讓代碼表現出的整潔和對DRY編程原則的適用。這些年來的經歷讓我學到了很多的小技巧和知識,大多數是通過閱讀很流行的開源軟件,如Django, Flask, Requests中獲得的。

下面我挑選出的這幾個技巧常常會被人們忽略,但它們在日常編程中能真正的給我們帶來不少幫助。

1.字典推導(Dictionary comprehensions)和集合推導(Set comprehensions)

大多數的Python程序員都知道且使用過列表推導(list comprehensions)。如果你對list comprehensions概念不是很熟悉——一個list comprehension就是一個更簡短、簡潔的創建一個list的方法。

  1. >>>?some_list?=?[1,?2,?3,?4,?5] ?
  2. ?
  3. >>>?another_list?=?[?x?+?1?for?x?in?some_list?] ?
  4. ?
  5. >>>?another_list ?
  6. [2,?3,?4,?5,?6]?

自從Python 3.1(甚至是Python 2.7)起,我們可以用同樣的語法來創建集合和字典表:

  1. >>>?#?Set?Comprehensions ?
  2. >>>?some_list?=?[1,?2,?3,?4,?5,?2,?5,?1,?4,?8] ?
  3. ?
  4. >>>?even_set?=?{?x?for?x?in?some_list?if?x?%?2?==?0?} ?
  5. ?
  6. >>>?even_set ?
  7. set([8,?2,?4]) ?
  8. ?
  9. >>>?#?Dict?Comprehensions ?
  10. ?
  11. >>>?d?=?{?x:?x?%?2?==?0?for?x?in?range(1,?11)?} ?
  12. ?
  13. >>>?d ?
  14. {1:?False,?2:?True,?3:?False,?4:?True,?5:?False,?6:?True,?7:?False,?8:?True,?9:?False,?10:?True}?

在第一個例子里,我們以some_list為基礎,創建了一個具有不重復元素的集合,而且集合里只包含偶數。而在字典表的例子里,我們創建了一個key是不重復的1到10之間的整數,value是布爾型,用來指示key是否是偶數。

這里另外一個值得注意的事情是集合的字面量表示法。我們可以簡單的用這種方法創建一個集合:

  1. >>>?my_set?=?{1,?2,?1,?2,?3,?4} ?
  2. ?
  3. >>>?my_set ?
  4. set([1,?2,?3,?4])?

而不需要使用內置函數set()。

2.計數時使用Counter計數對象

這聽起來顯而易見,但經常被人忘記。對于大多數程序員來說,數一個東西是一項很常見的任務,而且在大多數情況下并不是很有挑戰性的事情——這里有幾種方法能更簡單的完成這種任務。

Python的collections類庫里有個內置的dict類的子類,是專門來干這種事情的:

  1. >>>?from?collections?import?Counter ?
  2. >>>?c?=?Counter('hello?world') ?
  3. ?
  4. >>>?c ?
  5. Counter({'l':?3,?'o':?2,?'?':?1,?'e':?1,?'d':?1,?'h':?1,?'r':?1,?'w':?1}) ?
  6. ?
  7. >>>?c.most_common(2) ?
  8. [('l',?3),?('o',?2)]?

3.漂亮的打印出JSON

JSON是一種非常好的數據序列化的形式,被如今的各種API和web service大量的使用。使用python內置的json處理,可以使JSON串具有一定的可讀性,但當遇到大型數據時,它表現成一個很長的、連續的一行時,人的肉眼就很難觀看了。

為了能讓JSON數據表現的更友好,我們可以使用indent參數來輸出漂亮的JSON。當在控制臺交互式編程或做日志時,這尤其有用:

  1. >>>?import?json ?
  2. ?
  3. >>>?print(json.dumps(data))??#?No?indention ?
  4. {"status":?"OK",?"count":?2,?"results":?[{"age":?27,?"name":?"Oz",?"lactose_intolerant":?true},?{"age":?29,?"name":?"Joe",?"lactose_intolerant":?false}]} ?
  5. ?
  6. >>>?print(json.dumps(data,?indent=2))??#?With?indention ?
  7. ?
  8. { ?
  9. ??"status":?"OK", ?
  10. ??"count":?2, ?
  11. ??"results":?[ ?
  12. ?
  13. ????{ ?
  14. ??????"age":?27, ?
  15. ??????"name":?"Oz", ?
  16. ?
  17. ??????"lactose_intolerant":?true ?
  18. ????}, ?
  19. ????{ ?
  20. ??????"age":?29, ?
  21. ?
  22. ??????"name":?"Joe", ?
  23. ??????"lactose_intolerant":?false ?
  24. ????} ?
  25. ??] ?
  26. ?
  27. }?

同樣,使用內置的pprint模塊,也可以讓其它任何東西打印輸出的更漂亮。

4.創建一次性的、快速的小型Web服務

有時候,我們需要在兩臺機器或服務之間做一些簡便的、很基礎的RPC之類的交互。我們希望用一種簡單的方式使用B程序調用A程序里的一個方法——有時是在另一臺機器上。僅內部使用。

我并不鼓勵將這里介紹的方法用在非內部的、一次性的編程中。我們可以使用一種叫做XML-RPC的協議 (相對應的是這個Python庫),來做這種事情。

下面是一個使用SimpleXMLRPCServer模塊建立一個快速的小的文件讀取服務器的例子:

  1. from?SimpleXMLRPCServer?import?SimpleXMLRPCServer ?
  2. ?
  3. def?file_reader(file_name): ?
  4. ?
  5. ????with?open(file_name,?'r')?as?f: ?
  6. ????????return?f.read() ?
  7. ?
  8. server?=?SimpleXMLRPCServer(('localhost',?8000)) ?
  9. server.register_introspection_functions() ?
  10. ?
  11. server.register_function(file_reader) ?
  12. ?
  13. server.serve_forever()?

客戶端:

  1. import?xmlrpclib ?
  2. proxy?=?xmlrpclib.ServerProxy('http://localhost:8000/') ?
  3. ?
  4. proxy.file_reader('/tmp/secret.txt')?

我們這樣就得到了一個遠程文件讀取工具,沒有外部的依賴,只有幾句代碼(當然,沒有任何安全措施,所以只可以在家里這樣做)。

5.Python神奇的開源社區

這里我提到的幾個東西都是Python標準庫里的,如果你安裝了Python,你就已經可以這樣使用了。而對于很多其它類型的任務,這里有大量的社區維護的第三方庫可供你使用。

下面這個清單是我認為的好用且健壯的開源庫的必備條件:

好的開源庫必須…

  • 包含一個很清楚的許可聲明,能適用于你的使用場景。
  • 開發和維護工作很活躍(或,你能參與開發維護它。)
  • 能夠簡單的使用pip安裝或反復部署。
  • 有測試套件,具有足夠的測試覆蓋率。

如果你發現一個好的程序庫,符合你的要求,不要不好意思————大部分的開源項目都歡迎捐贈代碼和歡迎提供幫助——即使你不是一個Python高手。

英文來自:Improving Your Python Productivity

譯文:外刊IT時代

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

quartz 任務調試 建表 sql 語句、create table語句

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDUL…

關于ttk的使用與安裝

ttk是tkinter中的子模塊,在python2.x中是作為獨立模塊。但是在python3.x中則是成為了tkinter的子模塊,因此調用時,轉變為 from Tkinter import ttk

SEO藝術

SEO藝術 編輯推薦 在本書中,四位搜索引擎優化(SEO)領域最受矚目的專家闡述了制訂以及執行一個完善的SEO策略時應遵循的一些實用指南與最新技術。 基本信息 原書名: The Art of SEO原出版社: OReilly作者: (…

ActiveMQ支持的傳輸協議

連接到ActiveMQ Connector:ActiveMQ提供的,用來實現連接通信的功能。包括:client-to-broker、broker-to-broker。ActiveMQ允許客戶端使用多種協議來進行連接。 client-to-broker模式一般是配置文件中的transportConnector配置 broker-to-broker:一般是指網絡(networ…

http狀態碼301和302詳解及區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一直對http狀態碼301和302的理解比較模糊,在遇到實際的問題和翻閱各種資料了解后,算是有了一定的理解。這里記錄下…

哪些編程語言需要修復?

摘要:編程語言有十全十美的嗎?每種語言都有缺陷嗎?這不,Java、C、C、Python都中槍了。語言之間也可相互“掐架”,一起來看下。 原文作者Kevin Kelleher采用一種比較新穎的方式來比較編程語言:即描述每個編程…

時間修改,學習

設定時間格式 import datetime print datetime.datetime.now().strftime("%Y-%m-%d %H:%M") # 2018-05-08 16:54 時間增加 import datetime print (datetime.datetime.now()datetime.timedelta(days1)).strftime("%Y-%m-%d %H:%M:%S") days改為hours m…

Python標準庫

《Python標準庫》基本信息原書名: The Python Standard Library by Example 原出版社: Pearson Education 作者: (美)Doug Hellmann 譯者: 劉熾 出版社:機械工業出版社 ISBN:9787111378105上架時間&#xf…

五種世界頂級思維-20190303

一、墨菲定律: 你越害怕什么,就越會發生什么。 二、吉爾伯特定律:工作中最大的困難就是沒人跟你說如何去做。 三、吉德林法則:把問題清楚的寫下來,就已經成功一半了。 四、沃爾森法則:把信息和金錢排在第一…

狀態碼301和302的區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 定義如下: 301 Moved Permanently 被請求的資源已永久移動到新位置,并且將來任何對此資源的引用都應該使用本響應…

Perl迎來25歲生日

摘要:Perl迎來了它的第25歲生日,普天下Perlist都冒泡同慶一下,很多開發者喜歡它的理由是因其具備強力、穩定、成熟、可移植性等特點,Perl的愛好者們趕快送上你的祝福吧! 昨天,Perl迎來了它的第25歲生日&…

20165114 《網絡對抗技術》 Exp0 Kali安裝與配置 Week1

目錄: 一、kail的下載與安裝 二、kali的網絡設置 三、安裝vmware-tools。 四、更新軟件源。 五、共享文件夾 六、安裝中文輸入法 一、kail的下載與安裝 VMware workstation的安裝 因為之前的課程已經涉及,所以本機已經安裝好了VMware workstation&#x…

大數據:互聯網大規模數據挖掘與分布式處理

《大數據:互聯網大規模數據挖掘與分布式處理》基本信息原書名:Mining of Massive Datasets作者: (美)拉賈拉曼(Rajaraman,A.) (美)厄爾曼(Ullman,J.D.) [作譯者介紹]譯者: 王斌叢書名: 圖靈程序設計叢書出版社:人民郵電…

pip 切換源安裝

https://pypi.tuna.tsinghua.edu.cn/simple/ # 清華大學 https://mirrors.aliyun.com/pypi/simple/ # 阿里云 https://pypi.douban.com/simple/ # 豆瓣 https://pypi.mirrors.ustc.edu.cn/simple/ # 中國科學技術大學 https://pypi.hustunique.com/ # 華中科技大學 代碼…

String... 參數定義中有三個點的意思

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 有一個方法: protected void addMessage(String... messages) { ... } String... 是指參數的長度是可以變化的&#xff0…

SpringCloud框架搭建+實際例子+講解+系列五

(4)服務消費者,面向前端或者用戶的服務 本模塊涉及到很多知識點:比如Swagger的應用,SpringCloud斷路器的使用,服務API的檢查、token的校驗,feign消費者的使用。大致代碼框架如下: 先…

軟件開發者最重要的四大技能

摘要:現如今,可供選擇的技術、語言及平臺可謂五花八門,因此要弄明白哪里是花時間訓練的最佳投資點也就難上加難…… 現如今,可供選擇的技術、語言及平臺可謂五花八門,因此作為軟件開發者,要弄明白哪里是花時…

數據缺失的補充與修改

1查看數據情況 df.shape df.info() 2.用指定值填充 df df.fillna(x) 3.判斷是否缺失 df.isnull() 4.刪除缺失數據 df df.dropna() 5.補充平均值 df df.fillna(df.mean()) 6.填充他前面一個元素值(ffill向前填充,bfill向后填充)(limit:可以…

其他-私人♂收藏(比賽記錄 Mar, 2019)

OwO 03.03 [USACO19JAN] A. Redistricting 題意:給 \(g\) ,求 \(f(n)\) 。 \(f(i)f(j)[g(i)\ge g(j)],j \in (i-k,i]\) 。 離散化之后線段樹優化 DP ;或者發現額外貢獻最多只有 \(1\) ,單調隊列。 B. Exercise Route 題意&#xf…

JSR 303 - Bean Validation 簡介及使用方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、JSR-303簡介 JSR-303 是 JAVA EE 6 中的一項子規范,叫做 Bean Validation,官方參考實現是Hibernate Valida…