知識分享之函數式編程的簡單介紹

2020-12-15 彼岸end

各位小夥伴們大家好,好久不見,這次小編要分享的一個知識是有關於函數式編程的。

函數式編程是近年來比較熱門的一個話題,很多人都在談FunctionalProgramming,函數式編程有如下特點:函數即為數據,第一等公民。

愛立信公司於上世紀八十年代開發出了Erlang語言來解決並發編程的問題。

之後,在網際網路的發展浪潮中,越來越多的語言也開始支持函數式編程: Python、JavaScript、Ruby、Haskell、Scala 等。

函數式通俗來講,就是用程式語言去實現數學函數。函數式=程式語言定義的函數+數學意義的函數。

這種函數內對象是永恆不變的,要麼參數是函數,要麼返回值是函數,沒有for和while循環,所有的循環都由遞歸去實現,無變量的賦值(即不用變量去保存狀態),無賦值即不改變。

狹義地說,函數式編程沒有可變的變量、循環等這些命令式編程方式中的元素,像數學裡的函數一樣,對於給定的輸入,不管你調用該函數多少次,永遠返回同樣的結果。

而在我們常用的命令式編程方式中,變量用來描述事物的狀態,整個程序,不過是根據不斷變化的條件來維護這些變量。

廣義地說,函數式編程重點在函數,函數是這個世界裡的一等公民,函數和其他值一樣,可以到處被定義,可以作為參數傳入另一個函數,也可以作為函數的返回值,返回給調用者。

利用這些特性,可以靈活組合已有函數形成新的函數,可以在更高層次上對問題進行抽象。

函數是Python內建支持的一種封裝,我們通過把大段代碼拆成函數,通過一層一層的函數調用,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程序設計。

函數就是面向過程的程序設計的基本單元。

而函數式編程——Functional Programming,雖然也可以歸結到面向過程的程序設計,但其思想更接近數學計算。

Python並非完全是函數式程式語言,在Python中,存在著可變更對象,也能寫出非純函數。但如果我們借鑑函數式編程,儘量在編程中避免副作用,就會有許多好處。

由於純函數相對獨立,我們不必擔心函數調用對其他函數的影響,所以使用起來更加簡單。另外,純函數也方便進行並行化運算,在並行化編程期間,我們經常擔心不同進程之間相互幹擾的問題。

函數式編程思維是對集合統一處理、統一操作,而命令式編程需要取出來每個單詞單獨處理,單獨計數。

而函數式只需要傳入待處理對象集合、處理規則,我們不需要關注於具體細節,這樣編程不僅僅減少了出現bug的概率而且提高了IT人員開發效率,函數式編程是給軟體開發者提供的另一套工具箱,為我們提供了另外一種抽象和思考的方式。

函數式程式語言強烈要求使用者編寫沒有副作用的函數,它的函數式數學意義上的函數,給定一個輸入就會有一個輸出,而且每次相同的輸入,輸出也肯定一樣,函數式中的變量所代表的意義並不是內存中的一塊存儲單元。

因此多個函數同時操作一個變量或者一個函數調用多次一個變量都不會改變該變量的值,函數每次對於給定的輸入都是作為一個新值來處理。

就是因為它這種沒有狀態、沒有副作用的理念,很適合大數據計算和處理,它只接受固定輸入既可以得到預定計算結果,完全不依賴於外部環境。

因此,函數式編程其特性非常適合於大數據處理、科學計算、數據統計等業務,隨著人工智慧、機器學習、深度學習的流行正在變得重要起來。

函數式編程就像是一個數學公式,我們直接拿過來用就好了,能夠理解這個數學公式是怎麼來的是再好不過了。

以上是小編整理的學習筆記,希望可以幫到大家,也歡迎各位小夥伴補充和糾錯:)

相關焦點

  • 函數式編程很難懂?其實真心很簡單
    話不多說,開始今天的學習:現在直播一直都很火,今天我們就用Java代碼簡單地模擬一個直播案例,以此來一步步說明什麼叫函數式編程。不要看這個名字好像挺難懂的樣子,其實很簡單,兩分鐘時間即可看完。匿名內部類省略了類名,不用創建一個實現類,所以更簡單。那還能不能再簡化?可以的,也就是今天的重點,函數式編程。二、函數式編程函數,這個概念我們在數學裡面我們就接觸過。
  • 大數據入門:Scala函數式編程
    在大數據的學習當中,學到Spark部分,就免不了需要Scala這門語言了,Scala是Spark框架的原生程式語言,想要真正把Spark搞懂,那麼對Scala自然也需要相應程度的掌握。今天的大數據入門分享,我們就來講講Scala函數式編程。
  • 函數式編程那些事兒
    函數式編程是一種編程範式,在其中它試圖將每個函數都綁定到純數學函數中。這是一種聲明式的編程風格,著重於解決什麼而不是如何解決。Clojure,Common Lisp,Erlang,Haskell和Scala是遵循函數式編程方法的一些著名程式語言。
  • 寫Python 代碼不可不知的函數式編程技術
    選自 Medium作者:Raivat Shah參與:魔王、Jamin本文對 Python 中的函數式編程技術進行了簡單的入門介紹。近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。本文對 Python 中的函數式編程技術進行了簡單的入門介紹。本文適合對函數式編程有基本了解的讀者。
  • 輕鬆玩轉函數式編程
    於是我抽時間捋了捋,將平時工作中用到的函數式編程案例和思想整理了出來,相信閱讀本文後,大家都能快速上手函數式編程。 函數式編程目前使用範圍非常廣,常用的框架,語言幾乎都能看到它的身影。 前端框架:react、vue 的 hooks 用法。
  • 從Python到Haskell:程式設計師為何與函數式編程「墜入愛河」?
    儘管像Google這樣的大公司依賴於函數式編程的關鍵概念,但是普通程式設計師對此幾乎一無所知。這種情況即將改變了。不僅是Java或Python這樣的語言越來越多地採用了函數式編程的概念,類似Haskell這樣的新語言也正在完全實現函數式編程。簡單來說,函數式編程就是為不可變變量構建函數。
  • java8的函數式編程解析
    其實在java8就已經有java的函數式編程寫法,只是難度較大,大家都習慣了對象式用法,但在其它語言中都有函數式的用法,如js,scala,函數式其實是抽象到極致的思想。什麼是函數式編程 函數式編程並不是Java新提出的概念,其與指令編程相比,強調函數的計算比指令的計算更重要;與過程化編程相比,其中函數的計算可以隨時調用。
  • 純Java中的函數式編程:Functor和Monad示例
    絕大多數程式設計師,特別是那些沒有功能編程背景的程式設計師,都傾向於認為monad是某種神秘的計算機科學概念,因此從理論上講,它對他們的編程事業沒有幫助。這種消極的觀點可以歸因於數十篇文章或博客文章過於抽象或過於狹窄。但是事實證明,即使在標準Java庫中,monad也無處不在,尤其是從Java Development Kit(JDK)8開始(以後會有更多介紹)。
  • 教孩子學Python編程之海龜畫圖
    課程主題封面大家好,我是踐行計算機教育劉老師,很高興跟大家分享Python編程,建議5年級以上的學生學習。父母也可以陪著孩子一起學習Python編程,對於孩子學編程起到監督和輔助學習。下載我們Python編程工具,如下圖所示,
  • Spark程式語言之scala
    scala具有自己特有的語法:增強,函數式編程,偏函數,函數的柯裡化高階函數,將函數作為參數傳遞等。2.Spark架構由scala語言編寫。3.Scala語言的特點:Scala是以一門以java虛擬機JVM為運行環境的將面向對象,函數式編程結合在一起的靜態類型程式語言。Scala原始碼.scala會被編譯成Java字節碼.class,然後運行於JVM上。
  • C語言編程入門教程 博學谷免費資源分享
    C語言編程入門教程 博學谷免費資源分享發布時間:2020-05-12 14:37:51 瀏覽 4 來源:博學谷作者:吾非魚C語言編程入門教程免費資源分享。小編整理了博學谷C語言編程入門教程免費資源分享給大家:一、《C語言貪吃蛇小項目》通過貪吃蛇小遊戲項目學習C語言,學習C語言數組、
  • Scratch編程27:如何創建函數之自製積木
    當然對於簡單的積木,這些選項是不需要的,只有創建更高級的積木時,才會用到這三個選項。圖4【練習】我們先來創建一個簡單的積木,看看自製積木的創建過程以及如何使用。>)點擊角色設置區的Ballerina角色,將該角色設為當前編程對象。
  • 讓你徹底明白yield語法糖的用法和原理及在C 函數式編程中的作用
    骨架代碼猜想骨架代碼其實很簡單,方法的返回值是IEnumerable,然後return被yield開了光,讓人困惑的地方就是既然方法的返回值是IEnumerable卻在方法體內沒有看到任何實現這個接口的子類,所以第一感覺就是這個yield不簡單,既然代碼可以跑,那底層肯定幫你實現了一個繼承IEnumerable接口的子類,你說對吧?
  • python高階函數:map、filter、reduce的替代品
    什麼是高階函數?高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • 知識分享:C 語言函數指針之回調函數
    如果代碼立即被執行就稱為同步回調,如果過後再執行,則稱之為異步回調。 回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。
  • Java之Runnable表達式的簡單介紹
    各位小夥伴們大家好,這次小編要介紹的是Runnable表達式當我們要啟動一個線程去完成任務的時候,通常的做法會通過java.lang.Runnable接口來定義任務內容,並使用java.lang.Thread類來啟動線程,代碼如下:/*創建Runnable接口的實現類,重寫
  • Scratch編程28:創建帶參數的函數之自製積木選項
    #少兒編程#上一篇我們說了如何創建自製積木,不過那篇創建的積木比較簡單,它很多條件都是定死的,所以使用起來不靈活。>任務內容:製作帶參數的「跳舞」積木,需要滿足如下要求:跳舞的時間和風格通過參數傳遞給積木通過切換造型實現跳舞使用計時器來控制跳舞的時間2、編程實現
  • 大數據入門:Java和Scala編程對比
    在學習大數據之初,很多人都會對程式語言的學習有疑問,比如說大數據編程主要用什麼語言,在實際運用當中,大數據主流編程是Java,但是涉及到Spark、Kafka框架,還需要懂Scala。今天的大數據入門分享,我們就來對Java和Scala這兩門語言的編程做個對比。
  • 基於Python腳本的R語言的函數
    本文介紹了採用創建一個Python腳本,用該腳本模仿R風格的函數的方法來方便地進行統計。 是用R語言還是用Python語言?這是一個曠日持久的爭論。在此,我們可以嘗試採用折中路線:創建一個Python腳本,用該腳本模仿R風格的函數,來方便地進行統計!
  • Python進階之遞歸函數的用法及其示例
    作者 | 程式設計師adny責編 | 徐威龍封圖| CSDN│下載於視覺中國出品 | AI科技大本營(ID:rgznai100)本篇文章主要介紹了Python進階之遞歸函數的用法及其示例,現在分享給大家,也給大家做個參考