Python編程中用函數還是用復雜的表達式

要不要使用復雜表達式

Perl語言的原作者Larry Wall曾經說過,偉大的程序員都有三個優點:懶惰、暴躁和自負。乍一看這三個詞語沒有一個是褒義詞,但在程序員的世界里,這三個詞有不同的意義。首先,懶惰會促使程序員去寫一些省事兒的程序來輔助自己或別人更好的完成工作,這樣我們就無需做那些重復和繁瑣的勞動;同理能夠用3行代碼解決的事情,我們也絕不會寫出10行代碼來。其次,暴躁會讓程序員主動的去完成一些你還沒有提出的工作,去優化自己的代碼讓它更有效率,能夠3秒鐘完成的任務,我們絕不能容忍1分鐘的等待。最后,自負會促使程序員寫出可靠無誤的代碼,我們寫代碼不是為了接受批評和指責,而是為了讓其他人來膜拜。

那么接下來就有一個很有意思的問題值得探討一下,我們需要一個程序從輸入的三個數中找出最大的那個數。這個程序對任何會編程的人來說都是小菜一碟,甚至不會編程的人經過10分鐘的學習也能搞定。下面是用來解決這個問題的Python代碼。

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
if a > b:the_max = a
else:the_max = b
if c > the_max:the_max = c
print('The max is:', the_max)

但是我們剛才說了,程序員都是懶惰的,很多程序員都會使用三元條件運算符來改寫上面的代碼。

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
the_max = a if a > b else b
the_max = c if c > the_max else the_max
print('The max is:', the_max)

需要說明的是,Python在2.5版本以前是沒有上面代碼第4行和第5行中使用的三元條件運算符的,究其原因是Guido van Rossum(Python之父)認為三元條件運算符并不能幫助 Python變得更加簡潔,于是那些習慣了在C/C++或Java中使用三元條件運算符(在這些語言中,三元條件運算符也稱為“Elvis運算符”,因為?:放在一起很像著名搖滾歌手貓王Elvis的大背頭)的程序員試著用andor運算符的短路特性來模擬出三元操作符,于是在那個年代,上面的代碼是這樣寫的。

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
the_max = a > b and a or b
the_max = c > the_max and c or the_max
print('The max is:', the_max)

但是這種做法在某些場景下是不能成立的,且看下面的代碼。

a = 0
b = -100
# 下面的代碼本來預期輸出a的值,結果卻得到了b的值
# 因為a的值0在進行邏輯運算時會被視為False來處理
print(True and a or b)
# print(a if True else b)

所以在Python 2.5以后引入了三元條件運算符來避免上面的風險(上面代碼被注釋掉的最后一句話)。那么,問題又來了,上面的代碼還可以寫得更簡短嗎?答案是肯定的。

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('The max is:', (a if a > b else b) if (a if a > b else b) > c else c)

但是,這樣做真的好嗎?如此復雜的表達式是不是讓代碼變得晦澀了很多呢?我們發現,在實際開發中很多開發者都喜歡過度的使用某種語言的特性或語法糖,于是簡單的多行代碼變成了復雜的單行表達式,這樣做真的好嗎?這個問題我也不止一次的問過自己,現在我能給出的答案是下面的代碼,使用輔助函數。

def the_max(x, y):return x if x > y else ya = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('The max is:', the_max(the_max(a, b), c))

上面的代碼中,我定義了一個輔助函數the_max用來找出參數傳入的兩個值中較大的那一個,于是下面的輸出語句可以通過兩次調用the_max函數來找出三個數中的最大值,現在代碼的可讀性是不是好了很多。用輔助函數來替代復雜的表達式真的是一個不錯的選擇,關鍵是比較大小的邏輯轉移到這個輔助函數后不僅可以反復調用它,而且還可以進行級聯操作。

當然,很多語言中比較大小的函數根本沒有必要自己來實現(通常都是內置函數),Python也是如此。Python內置的max函數利用了Python對可變參數的支持,允許一次性傳入多個值或者一個迭代器并找出那個最大值,所以上面討論的問題在Python中也就是一句話的事,但是從復雜表達式到使用輔助函數簡化復雜表達式這個思想是非常值得玩味的,所以分享出來跟大家做一個交流。

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('The max is:', max(a, b, c))

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

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

相關文章

智慧園區規劃建設解決方案PPT(40頁)

智慧園區規劃建設解決方案摘要 1. 園區定義與發展歷程 園區,亦稱開發區,是在特定產業和區域政策指導下形成的區域。它們通過提供基礎設施和生產空間,吸引投資,形成技術、資本密集區,推動經濟發展。園區發展經歷了四代…

Docker 部署 ShardingSphere-Proxy 數據庫中間件

文章目錄 Github官網文檔ShardingSphere-Proxymysql-connector-java 驅動下載conf 配置global.yamldatabase-sharding.yamldatabase-readwrite-splitting.yamldockerdocker-compose.yml Apache ShardingSphere 是一款分布式的數據庫生態系統, 可以將任意數據庫轉換為…

【qt】TCP客戶端信息的接受和發送

當有信息時的槽函數關聯 跟服務端收到信息一樣,當可以讀一行的時候,就從套接字讀一行. 發送信息也是和服務端如出一轍,通過write(). 運行結果:

java EnumSet 介紹

EnumSet 是 Java Collections Framework 中專門為枚舉類型設計的高效集合實現。與其他集合類相比,EnumSet 提供了許多優點,如高效性、類型安全和易用性。它只能包含單個枚舉類型的值,并且在內部使用位向量實現,因而在空間和時間上都非常高效。 EnumSet 的特點 高效性:Enu…

Spring MVC 中的文件上傳 和 文件下載

Spring MVC 中的文件上傳 和 文件下載 文章目錄 Spring MVC 中的文件上傳 和 文件下載1. Spring MVC 中的文件上傳2. Spring MVC 中的文件下載3. 總結:4. 最后: 1. Spring MVC 中的文件上傳 文件上傳是:瀏覽器端向服務器發送文件&#xff0c…

C 語言結構體

由于近期項目需求,需使用到大量的指針與結構體,為更好的完成項目,故對結構體與指針的內容進行回顧,同時撰寫本博客,方便后續查閱。 本博客涉及的結構體知識有: 1.0:結構體的創建和使用 2.0: typedef 關…

解鎖音樂密碼,人工智能創作動人歌詞

在音樂的神秘世界里,每一段旋律都像是一把等待開啟的密碼鎖,隱藏著無盡的情感與故事。而如今,人工智能正以其獨特的智慧和創造力,幫助我們解鎖這些音樂密碼,創作出動人的歌詞。 “妙筆生詞智能寫歌詞軟件(…

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider? 顧名思義,Audio音頻數據緩沖提供,就是提供音頻數據的緩沖類,而且這個AudioBufferProvider派生出許多子類,每個子類有不同的用途,至關重要;那它在Android哪個地方使…

訪問 Postman OAuth 2.0 授權的最佳實踐

OAuth 2.0 代表了 web 安全協議的發展,便于在多個平臺上進行授權服務,同時避免暴露用戶憑據。它提供了一種安全的方式,讓用戶可以授權應用程序訪問服務。 在 Postman 中開始使用 OAuth 2.0 Postman 是一個流行的API客戶端,支持 …

亞馬遜店鋪注冊

**步驟一:準備注冊相關資料** 在注冊之前,請準備以下資料: 1.公司營業執照照片(清晰完整的拍照上傳) 2.法人身份證正反面照片(清晰完整的拍照上傳) 3.雙幣付款信用卡(VISA&#xff0…

[PaddlePaddle飛槳] PaddleSpeech-自動語音識別-小模型部署

PaddleSpeech的GitHub項目地址 環境要求&#xff1a; gcc > 4.8.5 paddlepaddle < 2.5.1 python > 3.8 OS support: Linux(recommend), Windows, Mac OSXpip下載指令&#xff1a; python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.c…

探索4D毫米波雷達和攝像頭在自動駕駛中的潛力

隨著自動駕駛技術的快速發展&#xff0c;關于各種傳感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷達&#xff09;與毫米波雷達結合攝像頭的作用&#xff0c;激發了激烈的討論。在這篇博客中&#xff0c;我們將探討4D毫米波雷達和攝像頭的組合是否可能成為自動駕駛車輛…

將vue項目整合到springboot項目中并在阿里云上運行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 導入依賴 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

聊聊接入Arbitrum的正確姿勢

本文首發于公眾號&#xff1a;Keegan小鋼 前言 我們知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 兩大類。而 Optimistic Rollup 的實現方案中&#xff0c;則是 Optimism 和 Arbitrum 最受關注。而我們最近接入了 …

Java套紅:指定位置合并文檔-NiceXWPFDocument

需求&#xff1a;做個公文系統&#xff0c;需要將正文文檔在某個節點點擊套紅按鈕&#xff0c;實現文檔套紅 試了很多方法&#xff0c;大多數網上能查到但是實際代碼不能找到關鍵方法&#xff0c;可能是跟包的版本有關系&#xff0c;下面記錄能用的這個。 一&#xff1a;添加依…

redis-cli 連接Redis

Redis-cli介紹 redis-cli 是原生 Redis 自帶的命令行工具&#xff0c;您可以在云主機或本地設備上通過 redis-cli 連接 Redis 數據庫&#xff0c;進行數據管理。 redis-cli 客戶端的使用方法&#xff0c;請參考官方文檔。 連接命令 redis-cli -h <redis_instance_address…

一個極簡的 Vue 示例

https://andi.cn/page/621516.html

【qt】客戶端連接到服務器

獲取到IP地址和端口號. 通過connectToHost() 來進行連接. 對于客戶端來講,只需要socket即可. 客戶端連接服務端只需要使用套接字(Socket)來進行通信。客戶端通過創建一個套接字來連接服務端&#xff0c;然后可以通過套接字發送和接收數據。套接字提供了一種簡單而靈活的方式來…

接口安全配置

問題點&#xff1a; 有員工在工位在某個接口下鏈接一個集線器&#xff0c;從而擴展上網接口&#xff0c;這種行為在某些公司是被禁止的&#xff0c;那么網絡管理員如何控制呢&#xff1f;可以配置接口安全來限制鏈接的數量&#xff0c;切被加入安全的mac地址不會老化&#xff…

JS實現:統計字符出現頻率/計算文字在文本中的出現次數

要實現這個功能&#xff0c;JavaScript 一個非常強大的方法&#xff0c;那就是reduce() reduce() 它用于將數組的所有元素減少到一個單一的值。這個值可以是任何類型&#xff0c;包括但不限于數字、字符串、對象或數組。 reduce() 方法接收一個回調函數作為參數&#xff0c;這個…