Python核心編程學習日記之函數式編程

來源:互聯網
上載者:User
 /****   在寫筆記之前,首先吐槽一下,感覺Python核心編程這本書不是太適合對Python入門的人使用。*讀這本書讓我有種大一剛學C語言讀 <The C Programming Language>的感覺。*可能因為我的學習能力不是很強吧,但是一本入門級的書本最好是有個順序的使用一門語言的文法。 *在前面盡量不要使用太多的後面的文法,否則很容易讓學習者迷亂。就我個人閱讀習慣,我不是很喜*歡在書本中看見一句“如果對這段代碼瞭解更多,請先閱讀第N章。”。 *   再者,這幾天過的太懶了,除了玩,什麼都沒幹。本來計劃的今天應該是看到第13章的,現在才 *剛把第10章異常看完。而且除了挑幾個書上的例題做做,沒有進行正兒八經的編程實踐。學習一門語 *言,不運用和沒學沒什麼不同吧。 *    然後,和同學聊天,發現自己的演算法簡直太弱了。好的演算法能力比會這些七七八八的語言重要多 *了。好好調整作息,這個寒假能把Python學習一下,複習一下演算法導論我就滿足了。。。 ***/

 

 

函數和函數式編程

過程是簡單,特殊,沒有傳回值的函數。Python的過程就是函數,因為解譯器會隱式地返回預設值None,類似於C中的void

  1. 返回多個值時,要把這些值放在容器中。多個值用,並列會被放在元組中,因為元組的文法定義並不一定需要圓括弧
  2. 關鍵字參數:在函數調用時,讓調用者通過函數調用中的參數名字來區分參數。這樣允許參數缺失或者不按順序,因為解譯器能通過給出的關鍵字來匹配參數的值。
  3. 執行一個沒有顯示定義參數的函數:通過把元組(非關鍵字參數)或字典(關鍵字參數)作為參數組傳給函數。形式:func(*tuple_grp_nonkw_args, **dict_grp_kw_args)。所以python中允許的函數調用的完整文法為:func(positional_args, keyword_args, *tuple_nonkw_args, **dict_grp_kw__args)
  4. def語句建立函數:
    def function_name(arguments): "function_documentation_string" function_body_suite
  5. 前向引用:和其他進階語言類似,Python不允許在函數未聲明之前,對其進行引用或者調用。注意是在引用或調用之前,只要沒有訪問函數,函數的聲明順序無影響。
  6. 內部/嵌套函數:在函數體內建立另外一個函數,Python支援靜態地嵌套域。方法1:在外部函數的定義內部定義函數;方法2:使用lamda語句
  7. 函數(與方法)裝飾器:僅是當聲明一個函數或者方法的時候,才會應用的額外調用。文法:@decorator(dec_opt_args) \ def funcDecorated(func_opt_args)

    @g \ @f \def foo(): \ pass 等價於 foo= g(f(foo))

    帶參數的裝飾器就是裝飾器調用這些參數。並用自己的傳回值代替自己的位置:@g(arg) \ @f \def foo(): \ pass 等價於 foo= g(arg)(f(foo))

  8. 裝飾器實際上就是函數,他們接受函數對象,進行處理。用裝飾器來:引入日誌;增加計時邏輯來檢測效能;給函數加入事務的能力
  9. 在Python中函數對象和普通對象一樣,可以被引用,訪問,作為參數,作為容器元素。函數名就是對一個函數對象的引用。其獨一無二的特徵是可以被調用。
  10. 形式參數

    聲明函數時所建立的局部命名空間為各個參數值建立一個名字。一旦函數開始執行,既能訪問這個名字

    1. 可變長度的參數:

      (1)非關鍵字可變長參數(元組):def function_name([formal_args,] *vargs_tuple): \ "function_documentation_string" \ function_body_suite

      (2)關鍵字變數參數(Dictionary):有不定數目或者額外集合的關鍵字的情況下,參數被放在一個字典中。字典中鍵為參數名,值為相應的參數值。 def function_name([formal_args,][*vargst,]**vargsd): \ function_documentation_string function_body_suite

      關鍵字和非關鍵字可變長參數都有可能在同一個函數中,只要關鍵字字典是最後一個參數並且非關鍵字元組先於它之前出現。

    2. python 允許用lambda 關鍵字創造匿名函數。文法:lambda [arg1[, arg2, ... argN]]: expression 參數是可選的,如果使用的參數話,參數通常也是運算式的一部分。
  11. 變數範圍:全域變數,局部變數。

    搜尋標識符:先從局部範圍開始搜尋。如果在局部範圍內沒找到,再去全域域尋找,仍未找到,拋出NameError異常。python以前不支援多層嵌套,現在可以。

    global文法:global var1[, var2[, ... varN]] 在局部域中明確引用一個已命名的全域變數。

  12. 定義在外部函數內的但由內建函式引用或者使用的變數被稱為自由變數。如果在一個內建函式裡,對在外部範圍(但不是在全域範圍)的變數進行引用,那麼內建函式就被認為是closure
  13. 從文法上講,產生器是一個帶yield語句的函數。一個函數或者子程式只返回一次,但一個產生器能暫停執行並返回一個中間的結果--那就是yield語句的功能,返回一個值給調用者並暫停執行。當產生器的next()方法被調用的時候,他會準確的從離開地方繼續。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.