日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习笔记(四)Python函数

發布時間:2024/4/30 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记(四)Python函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(三)python 函數

一 函數簡介

  • 在日常開發中有很多代碼需要在多處使用 , 為了提高代碼的復用性可以把代碼需要復用的代碼以函數的形式進行封裝 。
  • 二、 函數的調用

  • Python中內置了很多的函數來幫助我們快速的開發 , 我們可以直接調用 。 http://docs.python.org/3/library/functions.html#abs
  • 如: abs()求絕對 值的函數 。 在python的交互環境下可以直接通過help(abs)查看abs函數的幫助信息 。
  • 在調用函數的時候 , 傳入參數的數量和類型不對時都會報出TypeError錯誤 。 并且python會給你報出明確的錯誤信息 。
  • Python中用于數據類型的轉換的函數 :
  • int(): 將其他類型的數據轉換為int類型
  • float() : 將其他類型的數據轉換為float
  • str() : 將其他類型的數據轉換為字符串類型的數據
  • bool() : 將其他類型的數據轉換為布爾值 (只有空字符串或者整數位0是才能轉換為False)
  • 函數名其實就是一個指向函數對象的引用 ,完全可以把函數名賦給另一個變量 , 相當于給函數起別名
  • 三、 定義函數

  • 在python中定義函數要使用def語句 , 一次寫出函數名 、 括號 、 括號中的參數和冒號: , 然后在縮進塊中編寫函數體 , 函數的返回值用return語句返回 。

    # -*- coding: utf-8 -*-#python 中函數定義def testFunction(age):if age>100 :print("你是老年人")else :print("你是年輕人")#調用函數 age=input("請輸入你的年齡:") testFunction(int(age))input("輸入任意字符退出!")
  • 函數內一旦執行到return語句時 , 函數就執行完畢 , 并將結果返回 。 如果函數中沒有return其實也是有返回值的只是返回值為None , return None可以簡寫為return
  • 可以在Python的交互環境下 使用 from test import testFunction (假設你已經定義好了testFunction函數并保存在了 test.py文件中) 。
  • 空函數: 如果想定義一個什么都不做的空函數 , 可以使用pass語句 。 (實際上pass語句相當于一個占位符 , 比如現在還沒想好怎么寫這個函數的代碼 , 但是需要代碼跑起來 。沒有pass語句的空函數會報錯 。 )
  • 函數的參數檢查:

  • 在調用函數時如果參數個數不對會報出TypeError錯誤 , 但是在參數類型不對時 我們自己定義的函數和python內置的函數卻不太一樣 。 這說明自己定義的含義不太完善 。
  • 在自己定義的函數中增加參數類型檢查:

    # -*- coding: utf-8 -*-#python 中函數定義def testFunction(age):if not isinstance(age , int):raise TypeError("參數類型不正確")else :print("參數類型正確") if age>100 :print("你是老年人")else :print("你是年輕人")#調用函數 age=input("請輸入你的年齡:") testFunction(age)input("輸入任意字符退出!")

  • 返回多個值:

  • python中函數可以返回多個值 ,但這只是一種假象 , 實際上是把返回的值放到一個元祖中 , 變量取值時按順序取出元祖中的值 。

    # -*- coding: utf-8-*-#使用數學函數時需要先導入math包 import math #python中定義函數可以返回多個返回值 # 情景: 在游戲開發時 傳入當前的位置橫縱坐標 , 移動角度 , 移動步數 之后返回移動之后的位置橫縱坐標def move(x , y , step , angle) :nx = x + step*math.cos(x)ny = y + step*math.sin(y)return nx , ny#執行代碼 , 并獲取返回值 x, y =move(1 ,1 ,3 ,30) print("移動之后的位置是:" , x , "," ,y)#查看返貨值的實質 r = move(1,1,3,30) print("返回值的實質:" , r)

  • 四 、 函數的參數

  • 常規參數:在定義函數時括號內定義需要的參數

    def move(x , y , step , angle) :nx = x + step*math.cos(x)ny = y + step*math.sin(y)return nx , ny 缺點: 靈活性低 , 必須要求參數個數完全一致時才能正確執行
  • 默認參數 : 在定義函數時 ,定義參數時給定默認值 ,當傳入參數時使用傳入的參數 , 當不傳參數時使用默認的參數值

    def move(x=0 , y=0 , step=1 , angle=45) :nx = x + step*math.cos(x)ny = y + step*math.sin(y)return nx , ny 當傳入參數時使用傳入的參數 , 當不傳入參數時 , 使用默認的參數
  • 使用默認參數時要注意:
  • 必填參數一定要在默認參數之前 , 否則python解釋器會報錯 。
  • 設置默認參數時要考慮之后的使用 。
  • 在使用默認參數時 ,如果def move(x=0 , y=0 , step=1 , angle=45)只想傳入其中第1個和第4個參數 , 則可以move(x=1 , angle=45)在傳參是指定參數名 調用。
  • 默認參數必須是不變對象(str 、 數值類型)Python在定義的時候 , 默認參數的值就被計算出來了 , 如果默認的參數是一個可變變量(引用變量) , 默認參數被操作后參數的內容改變 , 但是參數的引用并沒有被改變如果要用可變對象 , 則默認值設置為None
  • 擴充:
  • 不變對象存在的意義:不變對象一旦創建 , 對象內部的數據就不能修改 , 這樣就減少了由于修改數據導致的錯誤 。 在多線程情境下 , 不變對象讀寫時不需要加鎖 , 效率很高。
  • 可變參數

  • 在定義函數時 , 由于參數個數不確定 , 我們可以定義可變參數 , 在函數調用數 , 可以傳入任意個參數 。
  • 可變參數的定義方式和定義list的方式區別在于定義可變參數前加*

    def calc(*numbers):sum=0for n : numbers :sum = sum + n*nreturn sum 在調用時直接calc(1,3,4)即可
  • 在函數內部參數numbers實際接收到的是一個tuple
  • 當已經有了一個list或tuple需要傳入函數中時該怎么辦?

    nums=[1,2,4] 可以使用在nums前加* 的方式傳入 calc(*nums)
  • 示例

    #Python可變參數 def cacl(*numbers):sum=0for n in numbers:sum=sum+n*nreturn sum#可變參數接收普通參數 r = cacl(1,2,3,4) print(r) #可變參數接收list或tuple nums=(1,2,3,4) r2=cacl(*nums) print(r2)
  • 關鍵字參數

  • 可變參數允許你傳入0個或任意個參數 , 在函數接收時自動組裝成一個tuple , 而關鍵字參數允許你傳入0個或一個鍵值對 , 在函數接收時自動裝成一個

    # -*- coding : utf-8 -*- #python 關鍵字參數 def person (name , age , **kw):print ("name:" , name , " , age:" , age, " , other:" , kw)#調用方式一 person('怪獸1' , 10) #調用方式二 person("怪獸2" , 11 , city="北京" , like="砸房子") #調用方式三 other={'brithday':"國慶節" , 'city':"北京" ,} person("怪獸3",12 , brithday=other["brithday"] , city=other["city"])

  • 可以用于用戶注冊的情景 , 當用戶注冊時除了必填的用戶名密碼外 ,如果用戶還想提供其他的信息 , 就可以使用關鍵字參數 。
  • 在使用時, 可以在參數中填入內容 ,也可以先組裝一個dict在傳進去(類似于可變參數 。 )
  • 命名關鍵字參數

  • 在使用關鍵字參數時 , 函數的調用者可以傳入不收限制的關鍵字參數 , 至于到底傳入了哪些參數 ,在代碼執行中需要用到哪些參數 , 還需要在函數內部進行檢查
  • 如果想要限制關鍵字參數的內容 , 就可以使用命名關鍵字函數

    #python命名關鍵字參數 print("命名關鍵字參數:") #命名關鍵字參數和普通參數之間用*分割 def dog(name , age , * ,city , like) :print ("name:" , name , " , age:" , age, " , city:" , city , " , like:" , like) #如果已經定義了可變參數, ,那么可變參數之后的默認為命名關鍵字參數 def cat(name , age , *nums , like):print ("name:" , name , " , age:" , age, nums, " , like:" , like) #調用 #dog('花花' , 10 , city="北京" , like="皮球" , brithday="2132342")dog('花花' , 10 , city="北京" , like="皮球" ) cat('花花' , 10 , 1,2,4,5,6,7,8, like="皮球" )
  • 參數組合
  • 注意: 在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
  • 最神奇的是你可以通過一個tuple和一個dict 調用任何函數(func(*args , **kw)) , 無論函數是如何定義的(這真的是太沒節操了) 。
  • 雖然支持多種參數組合的形式 , 但是盡量少的使用參數組合 , 否則接口的理解性很差 。
  • 五 、 遞歸函數

  • 遞歸思想: 在函數內部調用自己本身 。

    # -*- coding : utf-8 -*- #Python函數遞歸 def fact(n):if n==1 :return 1return n*fact(n-1)#調用 i = fact(10) print(i)
  • 遞歸函數定義簡單 , 邏輯清晰 , 理論上所有的遞歸函數都可以寫成循環的方式 , 但是循環的邏輯不如遞歸清晰 。
  • 注意 ,使用遞歸函數要防止棧溢出(方法的執行在棧中 , 遞歸層次太多導致棧溢出)
  • 解決遞歸調用棧溢出的方法是通過尾遞歸優化 , 事實上尾遞歸和循環的效果是一樣的 ,所以把循環看成一種特殊的尾遞歸函數也是可以 、
  • 尾遞歸: 尾遞歸是指在函數返回的時候 , 調用自己本身 , 并且return語句不能包含表達式 , 這樣 編譯器或解釋器就可以把尾遞歸做優化 , 使遞歸本身無論調用多少次 , 都只占用一個占內存 , 不會出現 棧溢出的情況 。
  • 遺憾的是大多數編程語言都沒有針對尾遞歸做優化, Python解釋器也沒有做優化 , 所以即使在python中遞歸用尾調用的形式 , 仍然會造成棧溢出 。 (介紹 尾遞歸優化 : https://blog.csdn.net/azhegps/article/details/72638906)
  • 總結

    以上是生活随笔為你收集整理的Python学习笔记(四)Python函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。