C++ 逐漸 Python 化
近幾年C++有了很多變化。最新的兩個版本C++11和C++14,引入瞭如此多的新特性,用 Bjarne Stroustrup的話說就是“感覺就像一個新語言一樣。”
真的。現代c++形成了一個全新的程式設計風格,我不能不注意到它帶有更多的Python味道。基於範圍(Range)的迴圈、型別推導、向量、map初始化和lambda表示式。你越是探索現代C++,你越能夠發現它裡面的Python痕跡。
是Python直接影響了現代C++嗎?還是在C++傳開前,Python已經採用了一些有用的結構?由你自己判斷。
字面值
Python在2008年引入二進位制字面值。現在C++14也有了。【更新:Thiago Macieira在評論中指出,GCC實際上早在2007年就已經支援了。】
C++
static const int primes = 0b10100000100010100010100010101100;
Python早在1998年引入了 原始字串字面值。在硬編碼正規表示式或Windows路徑時很方便。 C++11也新增了同樣的特性,只是語法上略有不同:
C++
const char* path = R"(c:\this\string\has\backslashes)";
基於範圍的For迴圈(Range-Based For Loops)
在Python中,for迴圈總是迭代遍歷一個Python物件:
Python
for x in myList: print(x)
與此同時,在近30年裡。C++僅支援C風格for迴圈。最後,在C++11中, 基於範圍的for迴圈被新增進去。
C++
for (int x : myList) std::cout << x;
與Python迭代協議不同,你可以迭代一個 std::vector 或任何實現了begin和end成員函式的類。有了基於範圍的for迴圈後,我經常發現自己希望C++能內建像Python的xrange函式一樣的函式。
自動化
Python一直以來都是一個動態型別語言。你不需要宣告變數型別,因為型別是物件本身的屬性。
Python
x = "Hello world!"print(x)
從另一方面來說,C++不是動態型別語言。是靜態型別。不過在C++11中將 auto 關鍵字 改作他用以用於型別推導,你能夠寫 看起來很像動態型別的程式碼:
C++
auto x = "Hello world!"; std::cout << x;
當你呼叫過載幾個型別的函式時,比如 std::ostream::operator<< 或者一個模板函式,C++更像一個動態型別語言。C++14進一步充實以支援auto關鍵字,為auto新增了 返回值支援和lambda函式 引數支援。
元組
Python從一開始就很好的定義了元組型別。當你需要把幾個值整合在一起的時候,元組就非常適合,這樣就再不需要命名類來實現同樣的功能了。
Python
triple = (5, 6, 7) print(triple[0])
C++在C++11標準庫中新增了對元組的支援。C++11的建議書 甚至還提到了這麼做是受Python啟發的:
C++
auto triple = std::make_tuple(5, 6, 7); std::cout << std::get<0>(triple);
Pyton允許你把一個元組解析為多個獨立的變數:
Python
x, y, z = triple
在C++裡,你可以使用std::tie實現同樣的功能:
C++
std::tie(x, y, z) = triple;
統一的初始化
在Python裡,列表是內建型別。因此,你可以只使用一個表示式來建立Python列表:
Python
myList = [6, 3, 7, 8] myList.append(5);
C++的向量(std::vector)與Python的列表最為相似。如今,C++11裡新增的 統一的初始化可以讓我們只使用一個表示式來建立向量和列表了:
C++
auto myList = std::vector<int>{ 6, 3, 7, 8 }; myList.push_back(5);
在Python裡,你還可以只使用一個表示式來建立一個 字典:
Python
myDict = {5: "foo", 6: "bar"} print(myDict[5])
與此類似,統一的初始化也適用於有序對映(std::map)和無序對映(unordered_map):
C++
auto myDict = std::unordered_map<int, const char*>{ { 5, "foo" }, { 6, "bar" } }; std::cout << myDict[5];
Lambda表示式
Python從1994年開始支援lambda函式。
Python
myList.sort(key = lambda x: abs(x))
Lambda表示式是在C++11中被新增進去。
C++
std::sort(myList.begin(), myList.end(), [](int x, int y){ return std::abs(x) < std::abs(y); });
2001年,Python新增了 靜態巢狀作用域,可以讓lambda函式抓取定義在封閉函式內的變數。
Python
def adder(amount): return lambda x: x + amount ... print(adder(5)(5))
同樣,C++ lambda表示式支援一堆靈活的 抓取規則,可以讓你做相似的事情:
C++
auto adder(int amount) { return [=](int x){ return x + amount; }; } ... std::cout << adder(5)(5);
標準演算法
Python內建 filter 函式可以讓你有選擇的從一個列表中拷貝項(雖然列表解析是首先):
Python
result = filter(lambda x: x >= 0, myList)
C++11中 引入了 std::copy_if ,讓你可以使用一個類似的、相當功能的型別:
auto result = std::vector<int>{}; std::copy_if(myList.begin(), myList.end(), std::back_inserter(result), [](int x){ return x >= 0; });
C++
其他的C++ 演算法模仿了Python的內建函式包括 transform、 any_of、 all_of, min 以及 max。即將到來的 範圍提案有潛力進一步簡化這些表示式。
引數打包
Python 從 1988 年就開始支援任意長度的引數列表. 你可以定義一個函式接受任意數量的實參,Python 會將他們放到一個元組(tuple)中, 你還可以將這個元組重新展開為一個實參列表,並把他們傳遞進另一個函式:
def foo(*args): return tuple(*args) ... triple = foo(5, 6, 7)
C++11 引入了對 引數包(parameter packs) 的支援. 它類似於 Python 的任意長度引數列表,而不同於 C 風格的可變引數列表, 這個引數包有自己的識別符號來表示整個實參序列。關鍵區別在於:在 C++ 中,這個引數包不能在執行時做為一個單獨的物件來操作。你只能通過模板超程式設計技術在編譯時來操縱他們。
template <typename... T> auto foo(T&&... args) { return std::make_tuple(args...); } ...auto triple = foo(5, 6, 7);
並非所有的 C++ 11 和 14 中的特性都借鑑於 Python。只是其中很大一部分特性看似如此。 Python 被認為是一種對使用者親近友好的程式語言。隨著時間的推移以及這些特性逐漸被其他語言借鑑,它其中一些特質也逐漸暗淡下來。
你怎麼看呢?C++ 中的這些新特性會不會使 C++ 更加簡單,親和,更具表現力呢?
原文地址:http://preshing.com/20141202/cpp-has-become-more-pythonic/
相關文章
- 逐漸深入地理解Ajax
- Octane記憶體逐漸增大記憶體
- 美國網路安全形式不斷變化自動化需求逐漸增加
- iOS之移動中變化的cell(cell逐漸變大效果)iOS
- 智慧手機真的會逐漸影響人類的進化嗎?
- WebAssembly正逐漸成為FaaS的主力Web
- MySQL 在逐漸背離開源麼?MySql
- vue寫的商城後臺,會逐漸完善Vue
- TCP/TP協議棧(逐漸更新版)TCP協議
- iPinYou:中國程式化購買廣告支出逐漸向移動渠道轉移
- 小島秀夫:遊戲和電影的界限會逐漸模糊遊戲
- 為什麼 Tetrate 逐漸成為 Envoy Gateway 的主心骨?Gateway
- 為何電子遊戲行業逐漸拋棄好萊塢模式遊戲行業模式
- WebAssembly 的未來:將逐漸解鎖整個“技能樹”Web
- PHP指令碼:隨心所欲的程式碼逐漸流行(轉)PHP指令碼
- CNNIC:網路文學使用者穩定增長,產業生態化已逐漸形成CNN產業
- 為了保護環境,遊戲行業正在逐漸遠離塑料遊戲行業
- Strategy Analytics:邊緣計算在物聯網部署中逐漸崛起
- 一對一直播原始碼逐漸變為生活中的主角原始碼
- 高等教育會逐漸轉向線上嗎?(附原資料表)
- 逐漸復甦的旅遊業如何開展郵件推廣
- 三星透過智慧手錶逐漸侵蝕蘋果?野心不小蘋果
- 在兩性關係中你的吸引力正在逐漸枯萎
- 資料圖表告訴您蘋果為何逐漸放棄iPod蘋果
- Jesse Meixsell:電子遊戲中逐漸消失的4大元素遊戲
- 深度分析:Web OS概念誕生十週年 逐漸成現實Web
- c++學習漸進數目C++
- 用Visual C++實現圖象漸顯和漸隱 (轉)C++
- 雲資料庫逐漸成熟,阿里雲提出“去O”小目標資料庫阿里
- 從厭惡到逐漸喜歡上前端,僅因為一個理由前端
- 區塊鏈挖礦演變史,一鍵挖礦逐漸成主流區塊鏈
- 國內智慧音響市場逐漸崛起,那麼問題來了……
- CNNIC:電影線上選座迅猛發展,傳統團購業務逐漸消亡CNN
- “後紅包”思考 百度錢包金融“活水”效應逐漸顯現
- 休閒遊戲逐漸霸佔市場,小步快跑的小遊戲如何取勝?遊戲
- 熱度逐漸走低,無法逆轉的老遊戲使用者流失困境遊戲
- FAQ:關於aspspider.net的申請與使用(逐漸整理中)IDE
- MySQL資料庫伺服器逐漸變慢 該如何分析與解決MySql資料庫伺服器