通常來說,python的函式是由乙個新的語句編寫,即def,def是可執行的語句--函式並不存在,直到python執行了def後才存在。
函式是通過賦值傳遞的,引數通過賦值傳遞給函式
def語句將建立乙個函式物件並將其賦值給乙個變數名,def語句的一般格式如下:
def (arg1,arg2,arg3,……,argn):
def語句是實時執行的,當它執行的時候,它建立並將乙個新的函式物件賦值給乙個變數名,python所有的語句都是實時執行的,沒有像獨立的編譯時間這樣的流程
由於是語句,def可以出現在任一語句可以出現的地方--甚至是巢狀在其他語句中:
if test:
def fun():
...else:
def func():
......f程式設計客棧unc()
可以將函式賦值給乙個不同的變數名,並通過新的變數名進行呼叫:
othername=func()
othername()
建立函式
內建的callable函式可以用來判斷函式是否可呼叫:
>>> import math
>>> x=1
>>> y=math.sqrt
>>> callable(x)
false
>>> callable(y)
true
使用del語句定義函式:
>>> def hello(name):
return 'hello, '+name+'!'
>>> print hello('world')
hello, world!
>>> print hello('gumby')
hello, gumby!
編寫乙個fibnacci數列函式:
>>> def fibs(num):
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
在函式內為引數賦值不會改變外部任何變數的值:
>>> def try_to_change(n):
n='mr.gumby'
>>> name='mrs.entity'
>>> try_to_change(name)
>>> name
'mrs.entity'
由於字串(以及元組和數字)是不可改變的,故做引數的時候也就不會改變,但是如果將可變的資料結構如列表用作引數的時候會發生什麼:
>>> name='mrs.entity'
>>> try_to_change(name)
>>> name
'mrs.entity'
>>> def change(n):
n[0]='mr.gumby'
>>> name=['mrs.entity','mrs.thing']
>>> change(name)
>>> name
['mr.gumby', 'mrs.thing']
引數發生了改變,這就是和前面例子的重要區別
以下不用函式再做一次:
>>> name=['mrs.entity','mrs.thing']
>>> n=name #再來一次,模擬傳參行為
>>> n[0]='mr.gumby' #改變列表
>>> name
['mr.gumby', 'mrs.thing']
當2個變數同時引用乙個列表的時候,它們的確是同時引用乙個列表,想避免這種情況,可以複製乙個列表的副本,當在序列中做切片的時候,返回的切片總是乙個副本,所以複製了整個列表的切片,將會得到乙個副本:
>>> names=['mrs.entity','mrs.thing']
>>> n=names[:]
>>> n is names
false
>>> n==names
true
此時改變n不會影響到names:
>>> n[0]='mr.gumby'
>>> n
['mr.gumby', 'mrs.thing']
>>> names
['mrs.entity', 'mrs.thing']
>>> change(names[:])
>>> names
['mrs.entity', 'mrs.thing']
關鍵字引數和預設值
引數的順序可以通過給引數提供引數的名字(但是參程式設計客棧數名和值一定要對應):
>>> def hello(greeting, name):
print '%s,%s!'%(greeting, name)
>>> hello(greeting='hello',name='world!')
hello,world!!
關鍵字引數最厲害的地方在於可以在引數中給引數提供預設值:
>>> def hello_1(greeting='hello',name='world!'):
print '%s,%s!'%(greeting,name)
>>>www.cppcns.com; hello_1()
hello,world!!
>>> hello_1('greetings')
greetings,world!!
>>> hello_1('greeting','universe')
greeting,universe!
若想讓greeting使用預設值:
>>> hello_1(name='gumby')
hello,gumby!
可以給函式提供任意多的引數,實現起來也不難:
>>> def print_params(*params):
print params
>>> print_params('testing')
('testing',)
>>> print_params(1,2,3)
(1, 2, 3)
混合普通引數:
>>> def print_params_2(title,*params):
print title
print params
>>> print_params_2('params:',1,2,3)
params:
(1, 2, 3)
>>> print_params_2('nothing:')
nothing:
()星號的意思就是「收集其餘的位置引數」,如果不提供任何供收集的元素,params就是個空元組
但是不能處理關鍵字引數:
>>> print_params_2('hmm...',something=42)
traceback (most recent call last):
file "", line 1, in
print_params_2('hmm...',something=42)
typeerror: print_params_2() got an unexpected keyword argument 'something'
試試使用「**」:
>>> def print_params(**params):
print params
>>> print_params(x=1,y=2,z=3)
>>> def parames(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar
>>> parames(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
>>程式設計客棧》 parames(1,2)
1 2 3
(){}
>>> def print_params_3(**params):
print params
>>> print_params_3(x=1,y=2,z=3)
>>> #返回的是字典而不是元組
>>> #組合『#'與'##'
>>> def print_params_4(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar
>>> print_params_4(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
>>> print_params_4(1,2)
1 2 3
(){}
本文標題: python基礎之函式用法例項詳解
本文位址: /jiaoben/python/113430.html
Python學習之函式的用法例項
函式的定義def 函式名 函式體return 返回值1 返回值2函式的呼叫 有引數的函式 形式引數 defadd x,y print x y 實參,x 1,y 2 add 1,2 3def mypow x,y 2 print x y x的y次方 mypow 2 4 形式引數 args可以改為其他變數...
python匿名函式的例項用法
一般情況下,lambda就像是乙個函式簡化器,它允許在所用 中嵌入函式的定義。它們完全是可選的 一直都可以使用def替換它們 但只需嵌入少量可執行 就能使 結構更加簡潔,從而大大簡化 複雜性,提高 可讀性。1 減少重複 2 模組化 def函式 def square x return x 2 squa...
python基礎之注釋用法
ctrl q notepad ctrl pycharm ctrl c ctrl v ctrl x ctrl z 撤銷 ctrl y 反撤銷 windows快捷鍵 注釋的種類 1 單行注釋 2 多行注釋 1 單行注釋 python 2.x print 你好 了解 再其他語言中 注釋使用 比如php.2...