python基礎13函數以及函數式編程

来源:http://www.cnblogs.com/cathywu/archive/2017/07/20/7209146.html
-Advertisement-
Play Games

主要內容 函數基本語法及特性 定義 數學函數定義:一般的,在一個變化過程中,如果有兩個變數x和y,並且對於x的每一 個確定的值,y都有唯一確定的值與其對應,那麼我們就把x稱為自變數,把y稱為因變 量,y是x的函數。自變數x的取值範圍叫做這個函數的定義域。 但編程中的「函數」概念,與數學中的函數是有很 ...


 

主要內容

  1. 函數基本語法及特性
  2. 參數與局部變
  3. 返回值 4.遞歸
  4. 名函數 6.函數式編程介紹
  5. 階函數 8.內置函數

函數基本語法及特性

定義

數學函數定義:一般的,在一個變化過程中,如果有兩個變數x和y,並且對於x的每一 個確定的值,y都有唯一確定的值與其對應,那麼我們就把x稱為自變數,把y稱為因變 量,y是x的函數。自變數x的取值範圍叫做這個函數的定義域。

但編程中的「函數」概念,與數學中的函數是有很 同的 函數是邏輯結構化和過程化的一種編程方法

函數的優點

  • 減少重覆代碼
  • 使程式變的可擴展
  • 使程式變得易維護

函數與過程

  • 定義函數
def fun1(): #函數名稱
"The function decription" print("in the func1") return 0 #返回值
  • 定義過程
def fun2():
"The progress decription"
print("in the func2")
  • 函數與過程 過程就是沒有返回值的函數 但是在python中,過程會隱式預設返回none,所以在python中即便是過程也可以算作函數。
def fun1():
    "The function decription"
    print("in the func1")
    return 0
def fun2():
    "The progress decription"
    print("in the func2")

x=fun1()
y=fun2()

print("from func1 return is %s" %x)
print("from func2 return is %s" %y)

結果為:

in the func1
in the func2
from func1 return is 0
from func2 return is None

返回值

要想獲取函數的執 結果,就可以 return語 把結果返回。

  1. 函數在執 過程中只要遇到return語 ,就會停 執 並返回結果,所以也可以 解為 return 語 代表著函數的結束,如果未在函數中指定return,那這個函數的返回值為None。

  2. 接受返回值

    賦予變數,例如:

def test():
    print('in the test')
    return 0
x=test()
  1. 返回什麼樣的變數值

return 個數沒有固定,return的類型沒有固定。 例如:

def test1():
    print('in the test1')


def test2():
    print('in the test2')
    return 0

def test3():
    print('in the test3')
    return 1,'hello',['alex','wupeiqi'],{'name':'alex'}

def test4():
    print('in the test4')
    return test2

x=test1()
y=test2()
z=test3()
u=test4()
print(x)
print(y)
print(z)
print(u)

結果是:

in the test1
in the test2
in the test3
in the test4
None
0
(1, 'hello', ['alex', 'wupeiqi'], {'name': 'alex'})
<function test2 at 0x102439488>
  • 返回值數=0:返回None 沒有return
  • 返回值數=1:返回object return一個值,python 基本所有的數據類型都是對象。
  • 返回值數>1:返回tuple, return多個值。
  • 返回可以返回函數:return test2會將test2的記憶體地址返回。
  1. 為什麼要有返回值?

想要整個函數執行的結果。 可能對執行結果進行相關操作。 比如登陸,返回true 接下來就可以進行其他操作。 如果是false 則不給操作。

函數參數

形參和實參定義

  • 形參

形式參數,不是實際存在,是虛擬變數。在定義函數和函數體的時候使用形參,目的是在函數調用時接收實參(形參個數,類型應與實參一一對應)。
變數只有在被調時才分配記憶體單元

  • 實參

實際參數,調用函數時傳給函數的參數,可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以 把這些值傳送給形參。因此應預先用賦值,輸入 等辦法使參數獲得確定值。

  • 區別

形參是虛擬的,不占用記憶體空間.形參變數只有在被調用時才分配記憶體單元,,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調函數後,則不能再使該形參變數。

實參是一個變數,占用記憶體空間,數據傳送單向,實參傳給形參,不能形參傳給實參。

def calc(x,y): #x,y為形參
    res = x**y
    return res
c = calc(a,b) #a,b為實參
print(c)
def test(x,y): #x,y為形參
    print(x)
    print(y)
x=1 #x為實參
y=2 #y為實參
test(x=x,y=y) #等號左邊x,y為形參,等號右邊x,y為實參,引用不分順序,按關鍵字引用。

預設參數

定義函數的時候,還可以有預設參數。 函數的預設參數的作用是簡化調用,你只需要把必須的參數傳進去。但是在需要的時候,又可以傳入額外的參數來覆蓋預設參數值。

#定義一個計算 x 的N次方的函數,預設是2次方
def test6(x,n=2):
    s=1
    while n>0:
        n=n-1
        s=s*x
    print(s)
    return s
test6(2)

預設參數只能定義在必需參數的後面.

可變參數

如果想讓一個函數能接受任意個參數,我們就可以定義一個可變參數:

def fn(*args):
    print args

可變參數的名字前面有個 * 號,我們可以傳入0個、1個或多個參數給可變參數: Python解釋器會把傳入的一組參數組裝成一個tuple傳遞給可變參數,因此,在函數內部,直接把變數 args 看成一個 tuple 就好了。

定義可變參數的目的也是為了簡化調用。假設我們要計算任意個數的平均值,就可以定義一個可變參數:

def average(*args):
    ...

這樣,在調用的時候,可以這樣寫:

>>> average()
0
>>> average(1, 2)
1.5
>>> average(1, 2, 2, 3, 4)
2.4

位置參數和關鍵字

位置參數調用:實參與形參位置一一對應; 關鍵參數調用:位置無需固定。

正常情況下,給函數傳參數要按順序,如果不按順序就可以用關鍵參數調用,只需指定參數名即可,但關鍵參數必須放在位置參數之後。

def test5(u,v,w):
    print(u)
    print(v)
    print(w)
test5(3,w=2,v=6)

函數調用

Python內置了很多有用的函數,我們可以直接調用。

要調用一個函數,需要知道函數的名稱和參數,比如求絕對值的函數 abs,它接收一個參數。

調用 abs 函數:

>>> abs(-21)
21

調用函數的時候,如果傳入的參數數量不對,會報TypeError的錯誤,並且Python會明確地告訴你:abs()有且僅有1個參數,但給出了兩個:

>>> abs(21,8)
Traceback (most recent call last):
  File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 67, in <module>
    abs(21,8)
TypeError: abs() takes exactly one argument (2 given)

如果傳入的參數數量是對的,但參數類型不能被函數所接受,也會報TypeError的錯誤,並且給出錯誤信息:str是錯誤的參數類型:

>>> abs('a')
Traceback (most recent call last):
  File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 69, in <module>
    abs('a')
TypeError: bad operand type for abs(): 'str'

遞歸函數

在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。

舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * ... * n,用函數 fact(n)表示:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成迴圈的方式,但迴圈的邏輯不如遞歸清晰。

嵌套函數

python允許在定義函數的時候,其函數體內又包含另外一個函數的完整定義。

name = "test1"
def changeout():
    name = "test2"
    def changeinner():
        name = "test3"
        print("changeinner賦值列印", name)

    changeinner()  # 調用內層函數
    print("外層調用內層列印", name)


changeout()
print("調用外層列印", name)

內部函數可以訪問其外部函數的作用域,但是外部函數不能訪問內部函數的作用域。

def change1(name):

匿名函數

匿名函數就是不需要顯式的指定函數

#這段代碼 def calc(n): return n**n print(calc(10))

#換成匿名函數 calc = lambda n:n**n print(calc(10))

函數式編程

單說,"函數式編程"是一種"編程範式"(programming paradigm),也就是如何編寫程式的方法論。

主要思想是把運算過程儘量寫成一系列嵌套的函數調用。

參考頁面

http://www.cnblogs.com/alex3714/articles/5740985.html

http://www.imooc.com/code/3516

http://blog.csdn.net/suncherrydream/article/details/51682560

http://www.jb51.net/article/68314.htm


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家都知道在css中的單位,一般都包括有px,%,em等單位,另外css3新增加一個單位rem。 其中px,%等單位平時在傳統佈局當中使用的比較頻繁,大家也比較熟悉,不過px單位在進行自適應佈局的過程當中則會有些力不從心,大部分的解決方案是使用%為單位配合@media媒介查詢來進行自適應佈局。不過還 ...
  • 首先要能獲取datagrid 的row對象 即:var row = $('#datagrid').datagrid('getData').rows[index]; 之後我們就可以通過類似row.name(欄位名稱)來獲取row各個欄位(列)的值了。 ...
  • 具體代碼如下: ...
  • 1.Xml添加監聽屬性,這裡添加的doClick。 在Activity中添加doClick實現方法。Activity中實現的方法要和XML添加的屬性名相同,不建議實際開發中使用。 2.匿名內部類方式實現。 3.自定義點擊事件實現。 4.Activity繼承View.OnClickListener,由 ...
  • 時間設置 查看系統當前日期/時間: date -R 查看系統硬體時鐘: hwclock --show 設置硬體時間: hwclock --set --date="07/18/17 20:55" 用硬體時間同步系統時間: hwclock --hctosys 時區設置 tzselect 選擇 Asia ... ...
  • 一、終端列印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo 'welcome to bash!' welcome to bash! [cairui@cai ~]$ echo "welcome to ...
  • 一、最小化原則 (1)安裝最小化 (2)開機啟動服務最小化 (3)操作最小化 (4)許可權最小化 (5)配置參數合理,不要最大化 二、埠優化 遠程登錄的埠預設是22號埠,這是大家都知道的。所以為了安全著想,我們要修改伺服器遠程連接埠,這樣黑客就不好破解你的linux伺服器。同時,預設登錄的用戶 ...
  • 前言:這段時間在學習Ant,發現這是一個很強大的構建工具。你可能使用了很長一段時間,才發現Ant能做數不完的事。總之,個人覺得,Ant學習門檻低,入門簡單,能大概看懂程式,寫一些簡單的腳本即可,剩下在遇到的時候邊做邊學就可以了。另外,博主資歷尚淺,有說的不對的地方,還請大家不吝指教。 1、Ant是一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...