你在濫用Python嗎?初學者常會遇到的5個情景

2021-01-11 讀芯術

全文共3398字,預計學習時長9分鐘

圖源:unsplash

Python擁有眾多學習者,可謂是如今許多編程初學者的首選語言。易學的語法、豐富的庫和大量的社區都是Python飛速發展的主要原因。

6年前,在我掌握了一系列Java之後接觸到Python時,經常發現自己在寫Python代碼時腦子裡還想著Java。作為一個新手,我沒有充分利用Python的優點,甚至在某些情況下,我濫用了它。

現在,我仍然看到一些初學者在沒有先花時間閱讀最佳實踐和建議的情況下就開始用Python寫代碼。為解決這個問題,我列出了下面5個濫用Python的情景,並給出了相關改進建議。

1.使用列表時

列表允許存儲各種數據類型的元素且不限制大小,儘管這種靈活性使列表成為收集數據的首選,但實際上仍有一些使用和不使用它的最佳實踐情景。

圖源:unsplash

在存儲具有相同性質(數據類型和含義)的元素時,應該使用列表。Python不會通過編程來限制這一點,在列表中存儲單個自然項讓開發人員的工作更輕鬆。開發人員很容易預測將來列表會有哪些項,並確信地編寫腳本。

思考下面的物品列表。這個列表並不包含單一性質的項目,開發人員無法確定該列表是否包含房屋部件、尺寸或其他東西,因此他應該分別處理不同的項目:

list_of_things = ['Door', 2,'Window', True, [2.3, 1.4])]

思考下面的水果列表和分數列表。從前兩個項目中,你很容易推斷出第一個列表會始終包含水果名字,而第二個列表始終包含分數值:

list_of_fruits = ['apple','orange', 'pear', 'cherry', 'banana']

list_of_scores = [80, 98, 50, 55, 100]

在存儲具有不同含義或數據類型的項目時,使用元組更合適。元組不具備在不創建新對象的情況下,提供存儲不受限項目的靈活性(因為元組是不可變的)。

2.迭代連接字符串時

圖源:unsplash

在Python中所有東西都是對象,包括可變和不可變對象。每當更新分配給對象的值時,不可變對象需創建新對象,而可變對象則不需要。

假設你想在一個字符串中生成整個字母表。因為字符串是不可變對象,所以每當使用「+」運算符連接字符串值時,就會得到一個新的對象。

one_line_alphabet = ''

for letter_index in range(ord('a'), ord('z')):

one_line_alphabet +=chr(letter_index)

Join函數是連接字符串的首選方法。使用join函數可將計算時間縮短約3倍。在我做的一項測試中,迭代連接100萬個字符串值耗時0.135秒,若使用join( )函數則只需0.044秒。

small_letters = [chr(i) for i inrange(ord('a'), ord('z')+1)]

single_line_alphabet = ''.join(small_letters)

因此,需要連接字符串列表時請使用join函數。若使用join函數連接幾個字符串,這並不會直觀感受到性能的差異。若要連接幾個字符串值,請使用.format而不是「+」運算符。例如:

name = 'John'

surname = 'Doe'

full_name = '{name} {surname}'.format(name=name, surname=surname)

3.讀寫文件時

若要使用Python讀寫文件,首先需要用內置的open函數打開文件。打開文件,讀取或寫入內容以及關閉文件。進行操作時,可能會出現一些問題,比如忘記關閉文件和異常處理失敗。

操作完成後,若忘記關閉文件會導致後續問題。比如,如果在寫入文件後忘記關閉該文件,那麼寫入操作將不會保存至文件中,並且在文件仍然保持打開狀態時,你將保留在計算機中分配的資源。如果在處理文件時,沒有手動處理異常和錯誤,那麼文件將保持打開的狀態。

f = open(file='file.txt', mode='r')

lines = f.readlines()

...

f.close()

建議在打開文件時使用with關鍵字。with是一個上下文管理器,它能封裝代碼並能確保自動處理異常。比如,當你讀寫文件時,with-body中可能出現的任何故障,都能自動處理異常,並且始終保持該文件關閉。

with open('file.txt') as f:

read_data = f.read()

...

如果跳過with時,你需要自己處理一切,關閉文件和異常處理都得親自處理。with會讓你的生活更輕鬆,讓情況得以控制。

圖源:unsplash

4.跳過生成器時

在許多情景中,你需要生成一個值列表,稍後將在腳本中使用這些值。比如,你需要為前100個數字生成所有3個數字的組合。

combinations = []

value = 100

for i in range(value):

for j in range(value):

for k in range(value):

combinations.append((i, j,k))

當執行的命令完成時,列表組合將包含1M元組,每個元組有3個整型值。這些值將保存在內存中,直到被刪除。使用sys模塊中的getobjectsize函數檢查對象大小,結果為8.29MB。

不再使用列表存儲值並將它們全部保存至內存,可以創建一個生成器,每當你使用它時,將生成1個組合。這能減少內存消耗並提高運行速度。

defgenerate_combinations_of_three(value):

for i in range(value):

for j in range(value):

for k in range(value):

yield (i, j, k)gen =generate_combinations_of_three(100)next(gen) # yields (0, 0, 0)

next(gen) # yileds (0, 0, 1)

...

所以,儘可能多地使用生成器。時刻牢記內存容量是有限的,並儘可能優化內存使用。請使用生成器,特別是在開發可伸縮的解決方案時。

5.使用推導式時

有一些程式設計師,他任何用Python編寫代碼都遵循Python之禪(The Zen of Python)的準則。如果是使用Python的新手,可能會傾向於誇大Python之禪的某些觀點,而在其他方面避重就輕。

這一點在逐漸了解推導式時最容易注意到——你傾向於翻譯推導式中的「每一個」循環。假設你有一個三維的數字矩陣,你很可能會想將其平面化。

matrix = [[[ 1, 2, 3 ],

[ 4, 5, 6 ],

[ 7, 8, 9 ]],

[[ 10, 20, 30 ],

[ 40, 50, 60 ],

[ 70, 80, 90 ]]]

使用列表推導式,平面化過程如下:

flatten_list = [x for sub_matrix inmatrix for row in sub_matrix for

x in row]

使用循環,平面化過程如下:

flatten_list = []

for sub_matrix in matrix:

for row in sub_matrix:

for x in row:

flatten_list.append(x)

列表式很酷,但可讀的代碼更酷。不要試圖總是讓自己使用列表式,即使這樣做可能需要編寫更少的代碼,也不會損失代碼的可讀性。

圖源:unsplash

不論是否有編程經驗,每當嘗試使用一種新的程式語言時,請一定要抽出時間閱讀最佳實踐。每種程式語言都有其獨特之處,所以要確保在適當的場景合理地運用它們。

Python致力於幫助程式設計師更高效便捷地完成工作,我們不能忽視可能對代碼生命期產生負面影響的小決策。請儘可能尋找更好的和最佳的解決方案,這是程式設計師的工作使命。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • Python初學者請注意!別這樣直接運行python命令
    比如你編寫了一個模塊my_lib.py,只需在調用這個模塊的程序中加入一行import my_lib即可。這樣設計的好處是,初學者能夠非常方便地執行命令。但是對攻擊者來說,這等於是為惡意程序大開後門。尤其是一些初學者將網上的Python軟體包、代碼下載的到本地~/Downloads文件夾後,就直接在此路徑下運行python命令,這樣做會給電腦帶來極大的隱患。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    想要入門Python 爬蟲首先需要解決四個問題:1.熟悉python編程2.了解HTML3.了解網絡爬蟲的基本原理4.學習使用python爬蟲庫1、熟悉python編程剛開始入門爬蟲,初學者無需學習python的類,多線程,模塊和其他稍微困難的內容。
  • 慢步學習,python語言編程,來扯扯語言的學習理解
    學習在某種情景下使用語言的詞彙/語句來表達。比如表達善意的問候:「你好」、「hello」、「こんにちは(抗你知哇)」。語言的學習,就是不斷的累積相應情景下的語言表達。程式語言的學習,也在於累積程式語言語句的使用情景和效果。因此學習編程最有效的方式就是編寫實例程序。不在於程序的完備,在於理解程序原始碼的適用場景和效果。
  • Python自學行嗎?Python自學能不能學會,有用嗎?-開課吧
    python自學是有一些難度的,當然,如果你現在只想入門,等工作後再同時學習的話,入門是沒問題的。但就是不知道你有編程和計算機方面的基礎嗎?零基礎自學Python編程>>>Python自學能找到工作嗎
  • Python程式設計師最常犯的10個錯誤,你中招了嗎?
    鑑於此,本文列出了Python開發人員常犯的10個小錯誤,資深程序猿也難免會中招哦。本文供Python高級開發人員參考,Python小白可以參考下面這篇文章:http://www.onlamp.com/pub/a/python/2004/02/05/learn_python.html常見錯誤1:濫用表達式作為函數參數的默認值Python允許開發者指定函數參數的默認值
  • 4種方法告訴你!天津0基礎如何學python培訓?
    小夥伴們應該都知道豆瓣網吧,這個真的很強大了,我們一般看的電影評分較高的就會是優zhi電影,這其中豆瓣可是貢獻了不少,看來是有很多小夥伴都很相信豆瓣的評分的,但小夥伴們知道豆瓣是被什麼開發出來的嗎?就是我們的python程式設計師,python可以用來做很多事情,比如:網絡爬蟲、數據分析等。
  • Python最重要的5大功能,要是能早點了解就好了!
    但也正因其功能繁多,初學者一開始是很難掌握所有功能的。即使你是一名從其他語言(比如C語言或MATLAB語言)轉換過來的程式設計師,用更加抽象的Python編寫代碼對你來說也絕對是一次不同的體驗。但功能雖多,總有主次之分。為了方便大家早點了解Python的一些大功能,小芯特別整理出了其中5大最重要的功能。1.
  • python基礎教程之python是什麼?
    如果你聽說過TIOBE排行榜,你就能知道程式語言的大致流行程度。這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。龜叔給Python的定位是「優雅」、「明確」、「簡單」,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常複雜的程序。總的來說,Python的哲學就是簡單優雅,儘量寫容易看明白的代碼,儘量寫少的代碼。
  • Python已是曇花一現,但你卻還在堅持嗎?看看他們的理由
    Python已是曇花一現,你為什麼還在堅持呢?Python,是一門最適合人工智慧的程式語言,並且,這門語言十分適合新手學習,正因為如此,讓發展了近三十年的python,在最近幾年火爆全網。可為什麼說python已是曇花一現呢?因為有人找不到工作。
  • Python 3.8.0來了!
    pickle 協議 5 引入了對於外部緩衝區的支持,這樣 PEP 3118 兼容的數據可以與主 pickle 流分開進行傳輸,這是由通信層來確定的。 Python 的高速發展主要原因是軟體工程的蓬勃發展,它吸引了許多零基礎的初學者。Java 的編程方法對於初學者來說太冗長了,單單想要完全理解和運行在 Java 中的 「hello world」 這樣的簡單程序,你就需要去了解類、靜態方法和包。在 C 語言中,這要簡單一些,但是在內存管理上還是會出現一些問題。但在 Python 這裡,就只是一行代碼的事。
  • 4個Python初學者必學的Numpy小技巧
    圖源:UnsplashPython初學者除了要掌握基礎知識外,了解一些小技巧、小竅門也是學習路上必不可少的一種催化劑,能幫助你更好的學習。下面小芯就基於實踐整理出了Python初學者應該學習的4個numpy技巧,它們能夠幫助你編寫更簡潔易讀的代碼。在學習numpy技巧之前,請確保已熟悉以下文章中的一些Python內置功能。1. 掩碼數組——選擇數據集是不完善的,它們總是包含缺失或無效記錄的數組,而這些記錄是時常需要忽略的。例如,由於傳感器故障,氣象站的測量值可能包含缺失值。
  • 三問Python:能幹什麼?為什麼火?會繼續火嗎?
    --此文是為了增強對python的了解,提升自己對學習python的動力,即是自勉,也是共勉。Python 能幹什麼?1)網站後端程式設計師:使用它單間網站,後臺服務比較容易維護。以前python也挺火的,但沒現在那麼火,因為現在大家都關心大數據和人工智慧。編程簡單明了,非常容易上手 對於新手和初學者來說,Python是非常容易學習和使用的。事實上,它是最容易學習的程式語言之一。
  • windows上python開發環境的搭建
    首先來下載python解釋器,在python官網下載即可,連結如下https://www.python.org/downloads/當前最新版本為v3.8.2有一點很特別,用縮進的方式來表示代碼塊,表示縮進的空白只可以是tab或者空格中的一種,如果混用,則無法正確識別,這一點在使用文本編輯器的時候尤其需要注意,為了保證只出現一種,需要設置文本編輯器,將tab設置成4個空格.。
  • 入門Python,這些JupyterNotebook技巧就是你必須學的
    此系列文章收錄在公眾號(建議按順序閱讀本系列文章) : 數據大宇宙 > Python > 工具轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)Python數據人你竟然不會用JupyterNotebook!
  • 如何自學成 Python 大神?這裡有些建議
    O'Reilly 出版的《Learning Python 第 5 版》和 Google 的 Python 在線教程( https://developers.google.com/edu/python/introduction?csw=1 ) 可以幫助你對 Python 基礎進行足夠的了解。在看書的同時,你還應該跟隨你所學的教程進行編程練習。
  • 使用Python玩轉高等數學(5):三角函數
    安裝matplotlib最簡單的方法就是在作業系統的命令行窗口分別輸入並執行下面的命令:python -m pip install -U pip setuptoolspython -m pip install -U matplotlib使用matplotlib繪圖,會用到Numpy庫,Numpy庫主要用於科學計算。
  • Python開發簡單爬蟲【學習資料總結】
    將這些Handler傳送給urllib2的build_opener方法創建一個opener對象,再傳給urllib2的install_opener方法,urllib2這個模塊就具備了進行特殊情景處理的能力。
  • Python成程式語言首選,人工智慧是其最大推力
    python現在加入了這三種語言。它是當今大學最常教授的第一語言,在統計領域排名第一,在人工智慧編程領域排名第一,在腳本編寫方面排名第一,在系統測試方面排名第一。除此之外,python還在Web編程和科學計算方面處於領先地位(只是列舉一些其他領域)。總之,python無處不在。
  • python是什麼:Python相關內容了解
    今天來聊聊一篇關於python是什麼:Python相關內容了解的文章,現在就為大家來簡單介紹下python是什麼:Python相關內容了解,希望對各位小夥伴們有所幫助。龜叔給Python的定位是「優雅」、「明確」、「簡單」,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常複雜的程序。總的來說,Python的哲學就是簡單優雅,儘量寫容易看明白的代碼,儘量寫少的代碼。如果一個資深程式設計師向你炫耀他寫的晦澀難懂、動不動就幾萬行的代碼,你可以盡情地嘲笑他。
  • python基礎課程 第5章 奇妙的內建函數
    我覺得談戀愛結婚也大概可以如此,大家如果能遵循 「不要重複你自己」 的原則,也就不會有那麼高的離婚率,天下也就沒有那麼多單親家庭了。然而人生遠遠比計算機世界複雜,我們可以用python在計算機中實現這個原則,卻很難在人生中實現它。有人說工程師相對比較單純也是如此吧,工作久了,難免受機器的一些影響。