1. 程式人生 > >python學習筆記——函式 1

python學習筆記——函式 1

呼叫函式

python內建了很多有用的函式,我們可以直接呼叫。

要呼叫一個函式,需要知道函式的名稱和引數,可從python官方網站文件 檢視python的內建函式(Built-in Function).

例如 求絕對值的函式abs,只有一個引數,可從文件檢視,也可在互動式命令列通過help(abs)abs函式的幫助資訊

help(abs)
Help on built-in function abs in module builtins:

abs(x, /)
    Return the absolute value of the argument.

呼叫abs函式:

abs(-2.718218
)
2.718218

python內建的常用函式還包括資料型別轉換函式,比如int()漢畫素可以把其他資料型別轉換為整數:

print(int('123'))
print(int(12.34))
123
12
float('12.34')
12.34
str(1.23)
'1.23'

函式名其實就是指向一個函式物件的引用,完全可以把函式名賦給一個變數,相當於給這個函式起了一個“別名”:

a = abs #變數a指向abs函式
a(-1) 
1

函式定義

定義函式使用def語句,一次寫出 函式名括號括號中的引數冒號:; 然後在縮排快中編寫函式體,函式的返回值用return

語句返回。

自定義一個求絕對值的函式my_abs:

# -*- coding: utf-8 -*-
def my_abs(x):
    if x>=0:
        return x
    else:
        return -x
print(my_abs(-2.71828))
2.71828

函式體內部的語句在執行時,一旦執行到return時,函式就執行完畢,並將結果返回

空函式

如果想定義一個什麼事也不做的空函式,可以用pass語句,pass可以用來作為佔位符。

def nop():
    pass

pass還可用於其他語句,例如:

age = input('please input your age:'
) age = int(age) if age >= 18: pass
please input your age:18

此處若缺少了pass,程式碼執行將有語法錯誤

引數檢查

呼叫函式時,如果引數個數不對,python直譯器會自動檢查出來,並丟擲TypeError;

但如果引數型別不對,python直譯器就無法檢查。

傳入不恰當引數時,內建函式abs會檢查出引數錯誤,而我們定義的my_abs無引數檢查,會導致if語句出錯,出錯資訊和abs不一樣。所以這個函式定義不夠完善。

修改my_abs的定義,對引數型別做檢查,只允許整數和浮點型引數。資料型別檢查可以用內建函式isinstance()實現:

abs('A')
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-22-6eee3e7a739d> in <module>()
----> 1 abs('A')


TypeError: bad operand type for abs(): 'str'
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x
my_abs('A')
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-21-3a4b4137ec2c> in <module>()
----> 1 my_abs('A')


<ipython-input-20-c24a51d84b1e> in my_abs(x)
      1 def my_abs(x):
      2     if not isinstance(x, (int, float)):
----> 3         raise TypeError('bad operand type')
      4     if x >= 0:
      5         return x


TypeError: bad operand type

返回多個值

import math

def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
x, y = move(100, 100, 60, math.pi / 3)
print(x, y)
130.0 48.03847577293369

其實這是一種假象,python函式返回的仍然是單一值:

r = move(100, 100, 60, math.pi / 3)
print(r)
(130.0, 48.03847577293369)

實時上,返回值是一個tuple,但在語法上,返回一個tuple可以省略,而多個變數可以同時接收一個tuple,按位置賦給對應的值;

所以,python的函式返回多值,其實就是返回一個tuple.

小結

  • 定義函式時,需要確定函式名和引數個數;
  • 如果有必要,可以先對引數的資料型別做檢查;
  • 函式體內部可以用return隨時返回函式結果;
  • 函式執行完也沒有return語句時,自動return None;
  • 函式可以同時返回多個值,但其實就是一個tuple.