Python函數

Python函數


  • 函數是最基本的一種代碼抽象的方式。
  • Python內置了很多有用的函數,我們可以直接調用。
  • 函數的優點就是簡化編程,我們將公共的代碼邏輯聲明在函數中,例:要求用戶從Cosole臺輸入用戶信息的時候 input()
  • 函數的特徵:能完成某種操作
  • 要調用一個函數,需要知道函數的名稱和參數,比如求絕對值的函數ads(),只有一個參數。可以直接從python的官方查看文檔:http://docs.python.org/3/library/functions.html#abs
  • 也可以再交互式命令行通過help(abs)查看abs函數的幫助信息。

#調用abs函數:

>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34

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

>>> abs(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (2 given)

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

>>> abs('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

#而max函數max()可以接收任意多個參數,並返回最大的那個:

>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3

數據類型轉換


#Python內置的常用函數還包括數據類型轉換函數,比如int()函數可以把其他數據類型轉換爲整數:

>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False

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

>>> a = abs # 變量a指向abs函數
>>> a(-1) # 所以也可以通過a調用abs函數
1

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

#如何定義函數

# -*- coding: utf-8 -*-
def my_abs(n):
    if n >= 0:
        return n;
    else:
        return -n;

#運行調用函數

a=int(input('請輸入要計算的絕對值:'))
print(my_abs(a))

#函數的特點二:函數具有返回值。返回值:運行完函數之後可以接受到的值
#在return字句後的python代碼 雖然不保錯 但也不會執行

def my_abs(n):
    if n >= 0:
        return n;
        print('hiahia')
    else:
        return -n;
        print('hiahia')

空函數


#如果想定義一個什麼事也不做的空函數,可以用pass語句:

def nop():
    pass

#pass語句什麼都不做,那有什麼用?實際上pass可以用來作爲佔位符,比如現在還沒想好怎麼寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。

#pass還可以用在其他語句裏,比如:

if age >= 18:
    pass

#缺少了pass,代碼運行就會有語法錯誤。

參數檢查


#調用函數時,如果參數個數不對,Python解釋器會自動檢查出來,並拋出TypeError:

>>> my_abs(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given

#但是如果參數類型不對,Python解釋器就無法幫我們檢查。試試my_abs和內置函數abs的差別:

>>> my_abs('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in my_abs
TypeError: unorderable types: str() >= int()
>>> abs('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

#當傳入了不恰當的參數時,內置函數abs會檢查出參數錯誤,而我們定義的my_abs沒有參數檢查,會導致if語句出錯,出錯信息和abs不一樣。所以,這個函數定義不夠完善。

#讓我們修改一下my_abs的定義,對參數類型做檢查,只允許整數和浮點數類型的參數。數據類型檢查可以用內置函數isinstance()實現:

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')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in my_abs
TypeError: bad operand type
錯誤和異常處理將在後續講到。

返回多個值


#函數可以返回多個值嗎?答案是肯定的。
#返回值會被包裝成一個tuple(元組)但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。

def hiahia():
    return 1,2,3,4,5,6
print(hiahia())

小結


  1. 定義函數時,需要確定函數名和參數個數;
  2. 如果有必要,可以先對參數的數據類型做檢查;
  3. 函數體內部可以用return隨時返回函數結果;
  4. 函數執行完畢也沒有return語句時,自動return None。
  5. 函數可以同時返回多個值,但其實就是一個tuple。

函數高級


#迭代函數:可以聲明一種函數 可以將另一個函數作爲參數之後調用
#函數與函數之間相互調用

def a(number):
    print('我是number:%s'%number)
def b(a):
    a(8);
b(a);

#遞歸函數 函數是否可以自己調用自己呢? 形成一種循環的方式 但是 要避免的無限遞歸 所以說在函數的函數體 需要聲明函數的出口。

#藉助遞歸函數 第一個例子:階乘 12345 計算的是階乘的積

sum=1;
for i in range(1,6):
    sum*=i;
print(sum)

#藉助遞歸 實現階乘

def clac(n):#求5的階乘 代表 1*2*3*4*5
   #遞歸函數的出口
   if n==1:
       return 1;
   return n*clac(n-1)
print(clac(5))

#計算機底層的算法:黃金分割法非常常見的
#計算斐波那契數列的合

he=0
def fb(b):
    if b<=1:
        return b;
    else:
        return fb(b-1)+fb(b-2);
a=int(input('請輸入要計算斐波那契數列的位數:'))
for i in range(a):
    he=he+fb(i)
print(he)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章