人們可能不喜歡 Python 的一些方面是什麼?
在本文中,我們將探討大多數人不喜歡 Python 的一些方面。
使用縮排代替花括號
許多人抱怨 Python 完全依賴縮排構建程式碼塊。如你所知,在 Python 中,縮排不是可選的。抱怨各不相同,但通常包括以下一種或多種情況。
很難看出函式在哪裡結束
編寫大型 Python 函式時確實如此。但是,如果你完全避免編寫大型函式,將會更有優勢。這適用於任何語言,而不僅僅是 Python。一個函式應該只做好一件事。如果你發現自己正在開發一個多頁函式,請將其分解成只做一件事的較小函式。
這不僅產生了簡潔易讀的程式碼,還產生了可測試的程式碼。針對只完成一件事情且沒有副作用的短函式的單元測試很容易編寫。當你開發執行許多事情的大型函式時,你只能編寫整合測試。
多個 Python 版本
我們看到使用者不喜歡 Python 是因為它有兩個版本——**Python 2** 和 **Python 3**。
更糟糕的是,它們經常在 Linux 上並排安裝。雖然兩者以前都很流行(並且不相容),但這如今比以前少見得多。
大多數專案現在已將其程式碼遷移到 Python 3,但這並非一直如此。不幸的是,由於許多軟體包花了時間確保轉換為 Python 3,許多 Linux 發行版不得不同時釋出兩個版本的 Python。
總而言之——是的,在 Python 3 過渡期間的幾年裡,這是一個真正的問題,但現在它在很大程度上已經解決了。
Python 速度慢
這是人們不喜歡 Python 的另一個原因。Python 的目標並非成為世界上速度最快的語言。還有 Python 的 GIL(全域性直譯器鎖),它並沒有人們所說的那麼糟糕。
事實上,Python 作為一種語言,優先考慮易於理解、簡潔的程式碼,而不是單純的速度。因此,Python 並非最快的語言。然而,我們發現許多人在沒有實際遇到速度問題,或者至少在沒有首先嚐試修復他們自己的低效程式碼的情況下就抱怨它。
如果你在 Python 中遇到速度問題,你可以採取多種方法來加快程式碼速度。其中之一是使用**併發**。然而,大多數時候,這僅僅是最佳化程式碼的問題。
你可以考慮以下幾點:
快取
布隆過濾器
使用適當的資料結構
儘量減少在迴圈內執行的工作量
避免遞迴。
或者,可以考慮使用更快的 Python 實現,例如 PyPy 和 CPython。如果這還不夠,許多流行的 Python 程式(例如 NumPy)將其核心功能用 C 實現。因此,用這裡的庫函式替換你的程式碼可能會產生更好的結果。
Python 在大型專案中擴充套件性不好
在辯論中,許多人聽到有人為 Python 辯護,但最終得出結論認為它是一種指令碼語言,不能很好地擴充套件到大型專案中。這根本不正確。但人們知道有許多大型應用程式執行良好。事實上,Python 包含所有必要的擴充套件工具:
如果需要,你可以將專案分成不同的包。
可以使用模組。
它允許面向物件程式設計。
Python 的擴充套件性與任何其他語言一樣好,甚至更好。Home Assistant 是一個大型專案,我每天都在家裡使用它。它證明了 Python 可用於建立大型複雜的應用程式。
Python 只是一種無型別的指令碼語言
這部分正確,部分錯誤。Python 是一種優秀的程式語言。它允許我們快速編寫指令碼以完成特定任務,而無需事先顯式定義型別。它使我們能夠進行原型設計和快速測試。
這種型別的靈活性稱為動態型別。變數沒有型別,但你建立的物件有型別。除此之外,Python 是一種強型別語言,這意味著一旦建立了物件,它的型別就不會改變。
例如,字串“2”在像“2”+ 2 這樣的等式中使用時不會突然變成數字。如果你這樣做,Python 將丟擲 TypeError。
透過加入顯式型別支援,Python 現在提供了一個很好的混合模型。他們似乎找到了最佳點。如果你在進行駭客攻擊,可以省略型別。但是,在編寫應用程式時,你可以(也應該)指定型別。直譯器會忽略它們,但你的 linter 和/或 IDE 可以使用它們來捕獲潛在的問題。更好的是,因為它現在知道所有物件的型別,你的 IDE 將提供出色的自動完成功能。
更好的是,因為它現在知道所有物件的型別,你的 IDE 將提供出色的自動完成功能。
Python 社群似乎已經接受了新的顯式型別。流行的 API 框架 FastAPI 廣泛使用型別。這是它易於使用的其中一個原因——由於顯式型別,你還在 Python IDE 中獲得出色的自動完成功能。
Python 包含一些難看的全域性函式
像 Java 這樣的面嚮物件語言中沒有全域性函式。在 Python 中,此類函式的示例有 **len()** 和 **print()**。
我們聽到關於 len() 最常見的問題是長度應該是物件的一部分,而不是全域性函式。
例如,為什麼沒有 length() 方法來檢索 Python 列表的長度?
inputList = [4, 6, 2, 1] # This will NOT work inputList.length() # Also this will NOT work inputList.length # You must use this one len() - #4 len(inputList)
但是,Python 使用 **len()** 函式而不是方法是有原因的。這實際上是一個深思熟慮的設計選擇。
在其他語言(例如 Java)中,可以透過呼叫物件上的方法來獲取長度。但它是哪種方法?是:
.length()
.size()
numItems()
……等等
它是一個變數,例如 **.length** 或 **.size** 嗎?作為一名 Java 開發人員,我見過所有這些以及更多變體。標準化這樣一項常見活動是有意義的。如果你的 Python 物件實現了 __len__() dunder 方法,則 len() 函式將起作用。你只需要習慣它。
結論
在本文中,我們瞭解了很多人不喜歡 Python 程式語言的七個方面。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP