13、函式

水之原發表於2018-01-01

函式

  • 函式就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,並且給它取一個名字。

  • 可以通過函式名在程式的不同地方多次執行(這通常叫做函式呼叫),卻不需要在所有地方都重複編寫這些語句。

自定義函式

  • 使用者自己編寫的

預定義的Python函式

  • 系統自帶的一些函式,還有一些和第三方編寫的函式,如其他程式設計師編寫的一些函式,對於這些現成的函式使用者可以直接拿來使用。

為什麼使用函式

  • 降低程式設計的難度
    • 通常將一個複雜的大問題分解成一系列更簡單的小問題,然後將小問題繼續劃分成更小的問題,當問題細化為足夠簡單時,我們將可以分而治之。這時,我們可以使用函式來處理特定的問題,各個小問題解決了,大問題也就迎刃而解了。
  • 程式碼重用
    • 我們定義的函式可以在一個程式的多個位置使用,也可以用於多個程式。此外,我們還可以把函式放到一個模組中供其他程式設計師使用,同時,我們也可以使用其他程式定義的函式。這就避免了重複勞動,提供了工作效率。

函式定義和呼叫

  • 當我們自己定義一個函式時,通常使用def語句,其語法形式如下所示:

      def 函式名 (引數列表): #可以沒有引數函式體
    
      def add(a, b):
          print a + b
  • 呼叫函式的一般形式是:

      函式名(引數列表)
    
      add(1, 2)

形式引數和實際引數

  • 在定義函式時函式後面圓括號中的變數名稱叫做“形式引數”,或簡稱為“形參”

  • 在呼叫函式時,函式名後面圓括號中的變數名稱叫做“實際引數”,或簡稱為“實參”

預設引數(預設引數)

  • 預設引數只能從右至左給定,如果需要第一個引數給預設值,其他引數不給,那麼把第一個引數移到最後一個即可。

      def add(a, b = 2):
          print a + b
    
      add(3)                  #result : 5

區域性變數和全域性變數

  • Python中的任何變數都有其特定的作用域。

  • 在函式中定義的變數一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數我們稱之為區域性變數。

  • 在一個檔案頂部定義的變數可以供該檔案中的任何函式呼叫,這些可以為整個程式所使用的變數稱為全域性變數。

      x = 100         #全域性變數,可以在檔案任何地方呼叫
    
      def func():
          x = 200     #區域性變數,只能在函式內部呼叫
          print x
    
      func()          #輸出200
      print x         #輸出100

global語句

  • 強制宣告為全域性變數

      x = 100
    
      def func():
          global x    #強制宣告x為全域性變數,導致值被覆蓋
          x = 200
    
      func()
      print x         #輸出200

函式返回值

  • 函式被呼叫後會返回一個指定的值

  • 函式呼叫後預設返回None

  • return返回值

  • 返回值可以是任意型別

  • return執行後,函式終止

  • 區分返回值和列印

      def add(a, b):
          return a + b
    
      ret = add(1, 2)     #將函式返回結果賦值給變數ret
      print ret           #輸出3

向函式傳入元組和字典

  • func (*args)

      def func(x, y):
          print x, y
    
      t = (1, 2)
      func(*t)
  • func (**kw)

      def func(name='jack', age=30):
          print name,age
    
      d = {'age': 22, 'name' : 'mike'};
      func(**d)

處理多餘實參

  • def func(*args, **kw)

      def func(x, *args, **kw):
          print x
          print args
          print kw
    
      func(1, 2, 3, 4, 5, y=10, z=20)
    
      #輸出
      1
      (2, 3, 4, 5)
      {'y': 10, 'z': 20}

lambda表示式

  • 匿名函式
    • lambda函式是一種快速定義單行的最小函式,是從Lisp借用來的,可以用在任何需要函式的地方。

        lambda x,y:x*y
    • 使用Python寫一些執行指令碼時,使用lambda可以省去定義函式的過程,讓程式碼更加精簡。
    • 對於一些抽象的,不會別的地方再複用的函式,有時候給函式起個名字也是個難題,使用lambda不需要考慮命名的問題。
    • 使用lambda在某些時候讓程式碼更容易理解。

lambda基礎

  • lambda語句中,冒號前是引數,可以有多個,用逗號隔開,冒號右邊的返回值。lambda語句構建的其實是一個函式物件

      g = lambda x:x**2
      print g
      <function <lambda> at 0x0000000002643A58>

lambda應用例項

  • reduce為逐次操作list裡的每項,接收的引數為2個,最後返回的為一個結果。

      sum = reduce(lambda x,y:x*y, range(1,6))
      print sum

switch語句

  • switch語句用於編寫多分支結構的程式,類似與if...elif...else語句。
  • switch語句表達的分支結構比if...elif...else語句表達的更清晰,程式碼的可讀性更高。
  • 但是python並沒有提供switch語句

switch實現

  • python可以通過字典實現switch語句的功能。
  • 實現方法分為兩步
    • 首先,定義一個字典
    • 其次,呼叫字典的get()獲取相應的表示式

函式呼叫

  • 通過字典呼叫函式

      def add(a, b):
          return a + b
    
      def sub(a, b):
          return a - b
    
      def mul(a, b):
          return a * b
    
      def div(a, b):
          return a / b
    
      operator = {'+': add, '-': sub, '*': mul, '/': div}     #通過字典實現switch語句的功能
    
      def calc(a, o, b):
          return operator.get(o)(a, b)
    
      print calc(4, '+', 2)
      print calc(4, '-', 2)
      print calc(4, '*', 2)
      print calc(4, '/', 2)

相關文章