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