函式定義
首先我們來創建一個函式,輸出指定范圍內的斐波拉契數列(Fibonacci series),
#!/usr/bin/env python
#coding=utf-8
'''
Created on 2016年9月4日下午2:37:31
@author: Flowsnow
@file: D:/Workspaces/eclipse/HelloPython/main/FibonacciSeries.py
@function: 定義函式-輸出給定范圍內的斐波拉契數列
'''
def Fibonacci(n):
#print "success"
a=0
b=1
while a<n:
print a,
a,b=b,a+b
#call the function Fibonacci
Fibonacci(2000)
print '\n',
print Fibonacci
f=Fibonacci
f(100)
print '\n',
print Fibonacci(0)
輸出結果如下:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
<function Fibonacci at 0x000000000258D9E8>
0 1 1 2 3 5 8 13 21 34 55 89
None
由第一行可知 Fibonacci函式輸出了2000以內的斐波拉契數列,
由第二行可知 Fibonacci函式在記憶體中的地址
由第三行可知 將Fibonacci函式的地址值賦給另外一個變數f之后,f也就是一個函式了,這類似于重名機制
由第四行可知 雖然Fibonacci函式沒有
return陳述句,但是如果我們使用None,這是Python的內建名稱,
我們也可以寫一個函式,不輸出斐波拉契數列的值,而是把值作為回傳值回傳,
#!/usr/bin/env python
#coding=utf-8
'''
Created on 2016年9月4日下午3:07:06
@author: Flowsnow
@file: D:/Workspaces/eclipse/HelloPython/main/FibonacciSeriesAdv.py
@function: 函式定義-回傳斐波拉契數列,而不是直接列印
'''
def Fibonacci(n):
a=0
b=1
result=[]
while a<n:
result.append(a)
a,b=b,a+b
return result
result=Fibonacci(2000)
for x in result:
print x,
輸出結果:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
引數詳解
Python 的內建標準型別有一種分類標準是分為可變型別與不可變型別
- 可變型別:串列、字典
- 不可變型別:數字、字串、元組
上面函式定義中的引數都是屬于不可變型別的,
可變引數三種情況:默認引數,位置引數*args關鍵字引數**kwargs,
默認引數
默認引數的好處就是在呼叫函式的時候寫上去的引數比在函式定義時的引數少,例如:
#!/usr/bin/env python
#coding=utf-8
'''
Created on 2016年9月5日下午2:50:12
@author: Flowsnow
@file: D:/Workspaces/eclipse/HelloPython/main/askYesOrNo.py
@function: 測驗默認引數的使用
'''
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = raw_input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise IOError('refusenik user')
print complaint
這個函式的呼叫方法有很多,比如:
- 只給必選引數:
ask_ok('OK to overwrite the file?') - 給一個可選引數:
ask_ok('OK to overwrite the file?', 2) - 給所有的可選引數:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
關于默認值,應該注意的是默認值只會在函式定義的時候被python決議一次,因此
i = 5
def f(arg=i):
print arg
i = 6
f()
這段代碼輸出的應該是5,而不是6,就是因為i是在函式定義的時候決議的,這個時候i=5,
重要警告:默認值只會決議一次,當默認引數是可變物件時,影響比較大,比如串列,字典或者類的物件,下面演示的這個函式會把引數積累并傳到隨后的函式呼叫里面:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
這段代碼會輸出
[1]
[1, 2]
[1, 2, 3]
如果不想默認引數在后面的函式呼叫中共享,可以把函式寫成這種形式
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
這段代碼會輸出
[1]
[2]
[3]
位置引數*args
位置引數需要在引數前面加一個星號,把引數收集到一個元tuple中,作為變數args,至于為什么叫位置引數,這個是因為各個引數是按照順序接收的,
def argTest(arg1,*args):
print arg1
print('~start to print *args~')
for x in args:
print x,
argTest(1,'two',3)
這段代碼會輸出
1
~start to print *args~
two 3
args被解釋為包含多個變數的元組tuple,因此也可用如下寫法:
def argTest(arg1,*args):
print arg1
print('~start to print *args~')
for x in args:
print x,
#argTest(1,'two',3)
args=['two',3]
argTest(1,*args)
關鍵字引數**kwargs
函式也能夠按照kwarg=value這種形式的關鍵字引數來呼叫,關鍵字引數需要在引數前面加兩個星號,其作用是把引數收集成一個字典型別,包含引數名和值,
def argTest(arg1,**kwargs):
print 'arg1',arg1
for key in kwargs:
print key,kwargs[key]
argTest(1,arg2='aa',arg3='bb')
argTest(arg1=1,arg2='aa',arg3='bb',arg4='cc')
arg={'arg2':'bb','arg3':'cc','arg4':'dd'}
argTest(arg1='ss',**arg)
argTest(arg1='ss',**arg)
這段代碼會輸出
arg1 1
arg2 aa
arg3 bb
arg1 1
arg2 aa
arg3 bb
arg4 cc
arg1 ss
arg2 bb
arg3 cc
arg4 dd
arg1 ss
arg2 bb
arg3 cc
arg4 dd
參考資料
Python官網-defining-functions
Passing arguments to Python functions1.pdf
Python中*args與**args的區別
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什么?快去關注下載吧!!!

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/132228.html
標籤:Python
