摘要:獲取怎樣的數據在這里首先需要考慮,我們的四則運算計算器的計算復雜度是如何的是僅能計算兩個數值的簡單運算,如還是能進行混合四則運算,如那么你想處理運算的復雜程度就決定了你想獲取怎樣的數據,這是很實際的問題。
引言
在上一篇文章的介紹中,我們提及了Python的三種基本數據類型,如文章末尾所說,Python中的內建數據類型并不僅僅是這幾種,但其實我從接觸Python到現在,往往就是這幾種簡單而又基礎的數據類型占了很大的比重,或許這就是二八法則吧。上一章我們開了個好頭,我希望從本章開始,可以通過實際的案例講解來逐步深入學習。那么經過我這幾天的思索,我認為有必要寫一個簡單的小學生四則運算計算器,來作為本章采用的案例。因為往往貼近實際生活的案例,才是真正能夠吸引你繼續學下去的動力。
數據分析在拿到一個案例(也就是要解決的問題)時,我們首先要進行分析,那么針對本次的四則運算計算器,我們通過以下幾個步驟進行分析:
主題及實現形式主題
簡易四則運算計算器
實現形式
因為考慮初學者,這里暫時不提及GUI編程,如果有對GUI編程感興趣的同學,可以推薦兩個Python的GUI庫:
Python自帶的TK
從QT融合的PyQT
那么為了降低實現難度,我決定采用在命令行輸入值的方式實現計算功能。
要實現什么功能通過簡單的分析,我們鎖定需要實現以下幾項功能:
輸入
如果我們想與計算機進行交互,那么首先就需要通過鍵盤將想要處理的數據輸入到計算機中。
數據處理
輸入的數據可以推斷至少包含兩種:數字數據和文本數據,我們需要考慮如何分拆數據,或者說如何分類對輸入數據進行處理。
運算
我們的簡易計算器要實現的四則運算:
加:‘+’,對應計算機運算符號‘+’
減:‘-’,對應計算機運算符號‘-’
乘:‘×’,對應計算機運算符號‘*’
除:‘÷’,對應計算機運算符號‘/’
這里面需要注意,我們常規手寫體運算符號和計算機運算符號的區別,關鍵是乘法和除法的區別。
輸出結果
當運算結束后,我們的程序需要將生成的計算結果反饋給用戶,在這里我們稱為輸出。
具體的數據分析數據分析的重點是我們要獲取怎樣的數據,怎樣獲取數據,并如何進行數據處理,我們需要依次分析一下。
獲取怎樣的數據?
在這里首先需要考慮,我們的四則運算計算器的計算復雜度是如何的?是僅能計算兩個數值的簡單運算,如:1+2?還是能進行混合四則運算,如:(3+4)*8/6?那么你想處理運算的復雜程度就決定了你想獲取怎樣的數據,這是很實際的問題。那么在本章“簡單數據處理I”中,考慮到迭代式編程,我們就先實現簡單的兩個數值的簡單四則運算計算器,那么這里我們的計算器的名字又變長了:
計算器
命令行計算器
命令行四則運算計算器
僅處理兩個值的命令行四則運算計算器
怎么樣?夠簡單了吧?其實還不夠,讓我們接著往下看。
怎樣獲取數據?
Python的內建IO函數input()可以幫助我們從命令行中獲取用戶的輸入值,但是輸入的值涉及到如何將輸入值取值及賦值的問題,因此就會出現以下兩種方式:
1.分段取值、賦值
分段取值很好理解,舉個例子,我們的兩個值的四則運算,如:1+2共分為三個部分,即兩個常量1和2,還有運算符+。這三個部分我們分別設定三個變量,譬如a、b、c分別進行賦值,即:
a = input("第一個數:") b = input("輸入你想計算的運算符:") c = input("第二個數:")
那么上面這段代碼便是分段取值、賦值,看起來直觀,但問題是用戶需要輸入多次,而且看起來很傻。
可以點擊鏈接參考input()函數使用方法。
2.一次性取值
相對上面的方法,我們可以采用一次性取值賦值的方法,如下:
a = input("輸入你想計算的公式")
通過單次取值,可以減少用戶輸入的復雜度,但是增加了編程的困難度,因為我們需要將單次的取值進行解析,區分開數字型數值和字符型運算符。
在這里我們為了再一次降低難度,我們將計算器的編程要求變為:
計算器
命令行計算器
命令行四則運算計算器
分段取兩個值的命令行四則運算計算器
如何處理數據?
上面一直沒有提到的一點,input()函數獲取的任何數據,賦值時都是字符串類型的數據,也就是說無論用戶在命令行輸入的是什么,賦值后我們的取到的都是字符串,那么這里我們就需要將相應的數據進行轉換,而運算符的對應就需要進行各自邏輯判斷,在這里就需要處理以下兩問題:
上一篇文章中,我們提到了整數和浮點數,它們有各自的內建函數int()和float() (可以點擊鏈接參考使用方法)可以用于數值類型轉換,那么我們需要將兩個取到的字符串型數值轉化為哪種類型的數字?
除了將四種運算符字符串對應到實際運算符時需要邏輯判斷外,是否需要判斷用戶輸入的運算符超出我們所限定的四則運算能力?
這里考慮不清楚沒有關系,我們帶著問題接著往下看,下面開始進入到我們的編程環節。
編程準備工作在正式開始編程前,除了上面需要進行的數據分析外,還我們需要做好以下的準備工作:
編程IDE準備我使用過的幾種而且到現在還在一直使用編輯器:
Emacs
這個編輯器有毒,一旦用過會讓你欲罷不能,尤其是它的快捷鍵,推薦Purcell的配置。
PyCharm
能到達包的函數自動補全,集成化比較合理,推薦,官網(注冊碼可以自行百度)。
Atom
輕量級,拓展也很方便,改版后速度能讓人滿意,官網。
各項功能實現的語言準備input()內建函數,可以獲取命令行輸入值,并進行賦值。
int()和float() ,可以將字符串轉換為對應的數值類型。
print(),可以將計算結果打印輸出到命令行
條件語句if,elif和else,即:
if a == True: # 如果a為真,我們要做什么? elif b == True: # 如果b為真,我們要做什么? else: # 如果a、b都不為真,我們要做什么?
如果這里不太懂,可以參考手冊中條件語句if的用法。
in語句,一般用于序列判斷中,例如:
a = "China" b = "n" b in a # 返回值為True,因為字符“n”在“China”中
not語句,表示否的意思,延續上一個例子:
a = "China" c = "s" c not in a # 返回值為True,因為字符“s”不在“China”中開始編程
我們現在開始編程,但是編程之前需要明確前面最后留下的問題,首先字符串需要轉換為浮點型,因為需要考慮到計算含精度數值的運算;其次,為限制我們的運算規則,我們需要用條件語句if來判斷用戶輸入的運算符是否在我們規定的四則運算中,而且這個判斷的優先級在最高層。下面我們來看看實現 :
分段取值、賦值## 通過input()取值,并直接用float()將獲取的字符串轉化為浮點數 x = float(input("First Num: ")) # 獲取第一個值 o = input("Operator: ") # 獲取運算符 y = float(input("Second Num: ")) # 獲取第二個值 result = 0 # 初始化一個結果變量,賦值為0運算符判斷
## 通過input()取值,并直接用float()將獲取的字符串轉化為浮點數 x = float(input("First Num: ")) # 獲取第一個值 o = input("Operator: ") # 獲取運算符 y = float(input("Second Num: ")) # 獲取第二個值 result = 0 # 初始化一個結果變量,賦值為0 if o not in "+-*/": # 如果運算符不在字符串"+-*/"中,需要輸出的內容 else: # 如果運算符符合要求,開始分類計算運算符字符串對應到實際運算
## 通過input()取值,并直接用float()將獲取的字符串轉化為浮點數 x = float(input("First Num: ")) # 獲取第一個值 o = input("Operator: ") # 獲取運算符 y = float(input("Second Num: ")) # 獲取第二個值 result = 0 # 初始化一個結果變量,賦值為0 if o not in "+-*/": # 如果運算符不在字符串"+-*/"中,需要輸出的內容 print("Sorry! Out of my capability areas!") else: # 如果運算符符合要求,開始分類計算,并賦值到result if o == "+": result = x + y elif o == "-": result = x - y elif o == "*": result = x * y else: result = x / y
輸出結果注意:幾乎大部分語言都相似的語法,賦值使用單個等號=,而兩個等號==用于判斷等號兩側的值是否相等。
## 通過input()取值,并直接用float()將獲取的字符串轉化為浮點數 x = float(input("First Num: ")) # 獲取第一個值 o = input("Operator: ") # 獲取運算符 y = float(input("Second Num: ")) # 獲取第二個值 result = 0 # 初始化一個結果變量,賦值為0 if o not in "+-*/": # 如果運算符不在字符串"+-*/"中,需要輸出的內容 print("Sorry! Out of my capability areas!") else: # 如果運算符符合要求,開始分類計算,并賦值到result if o == "+": result = x + y elif o == "-": result = x - y elif o == "*": result = x * y else: result = x / y # 將結果輸出到命令行 print(result)總結
那么通過上面16行的代碼最終實現了一個簡易的四則運算計算器,本篇的重點不在于編程的復雜與否,而是希望可以通過計算器的編程,對語言初學者推介以下幾點內容:
對實際問題進行編程的數據分析思維
數據分析的細節處理,往往數據分析的越到位,最終實現的效果就會越好
本章的語言內容部分新增介紹的幾個重點:條件判斷語句if、elif、else、in、not和==,內建IO函數input()和print(),以及用內建函數float()進行數據類型轉換
更簡單的方法實現最復雜的功能?其實Python作為動態解釋類腳本語言,在實際使用過程中體現的淋漓盡致,龐大的擴展庫就不深入探究,僅是內建函數的使用就讓人感覺暢快淋漓。下面回顧一下全篇內容,在Python中其實僅用2行代碼就可以實現上面所說的:
不用邏輯判斷
不用區分數值類型
一次性取值(即表達式)
混合四則運算(且不僅限于四則運算)
命令行
計算器
除命令行這點不太讓人滿意外,計算器全部功能的實現僅需引入一個內建函數eval(),讓我們來看看代碼實現:
x = input("Expression Computer: ") print(eval(x))
可點擊eval()鏈接參考詳細使用方法。
那么這便是Python的魅力所在。
關于GUI編程我之前有段時間一直在學習PyQt,但后來考慮到運行效率問題,總感覺Python跟GUI隔層墻,后來索性就閑置了,等回頭哪天又心血來潮,希望自己能重試Pytho的GUI開發夢。
由于Qt是由C++實現的,實際開發效果還算中等偏上,學習中我是參考Qt的C++代碼轉錄為Python代碼,可以正常運行,如果感興趣的同學可以點擊鏈接《PyQt5 - QWidgets部件進階教程之計算器》,如有問題,望各位斧正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38569.html
摘要:除此之外的特定形式還有二進制序列類型,那么我們在這里所說的序列主要包含以下三種列表列表是一種可變序列,一般形式為,方括號內的各項間用逗號分隔。 引言 對于以前沒有接觸過任何編程語言的人來說,首先能明確編程的目的很重要,往往能明確一個目的,在日后的學習中遇到困難時心態就會輕松許多。當今計算機文化的多元化發展,涌現出了大數據、分布式計算、神經網絡、機器學習等眾多新概念,即便這樣,任何意義上...
摘要:是個的一種實現方式,編譯代碼為字節碼,然后由虛擬機執行,這意味著此時程序與程序沒有區別,只是源代碼不一樣。原文鏈接全棧之路系列文章 Python的誕生 Python是著名的龜叔Guido van Rossum(吉多·范羅蘇姆)在1989年圣誕節期間,為了打發無聊的圣誕節而編寫的一個編程語言。 showImg(https://segmentfault.com/img/remote/146...
摘要:本文重點掌握異步編程的相關概念了解期物的概念意義和使用方法了解中的阻塞型函數釋放的特點。一異步編程相關概念阻塞程序未得到所需計算資源時被掛起的狀態。 導語:本文章記錄了本人在學習Python基礎之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握異步編程的相關概念;2、了解期物future的概念、意義和使用方法;3、了解Python...
摘要:變量作為函數返回值時,必須聲明為動態類型。動態變量與中的變量基本完全相同支持在使用時改變類型。比較運算符在運算時考慮變量類型,如果是動態變量與一致。與不一致,語句可以沒有,表示忽略所有異常。 上一篇 《Zephir 簡介》 簡單介紹了環境搭建,編寫了一個的簡單示例。這一篇繼續介紹 Zephir 基礎。 基本語法Zephir 中,每個文件都必須有且只有一個類,每個類都必須有一個命名空間,...
摘要:布爾值布爾值和布爾代數的表示完全一致,一個布爾值只有兩種值的數據類型可以通過內置的函數查詢,例如還可以用來判斷和的區別在于不會認為子類是一種父類類型。會認為子類是一種父類類型。基本功能是進行成員關系測試和刪除重復元素。 ...
閱讀 1104·2021-09-22 15:37
閱讀 1131·2021-09-13 10:27
閱讀 2466·2021-08-25 09:38
閱讀 2444·2019-08-26 11:42
閱讀 1524·2019-08-26 11:39
閱讀 1554·2019-08-26 10:58
閱讀 2316·2019-08-26 10:56
閱讀 2569·2019-08-23 18:08