本篇文章將介紹如何將語句組織成函數,以及參數概念以及在程式中的用途,需要的朋友可以參考下
Pythond 的函數是由一個新的語句編寫,即def ,def是可執行的語句--函數並不存在,直到Python運行了def後才存在。
函數是透過賦值傳遞的,參數透過賦值傳遞給函數
def語句將建立一個函數物件並將其賦值給一個變數名,def語句的一般格式如下:
複製程式碼 程式碼如下:
def function_name(arg1,arg2[,...]):
statement
#[return value]
傳回值不是必須的,如果沒有return語句,則Python預設回傳值None。
函數名稱的命名規則:
函數名稱必須以下劃線或字母開頭,可以包含任意字母、數字或底線的組合。不能使用任何的標點符號;
函數名是區分大小寫的。
函數名稱不能是保留字。
Python使用名稱空間的概念儲存對象,這個名稱空間就是物件作用的區域, 不同對象存在於不同的作用域。下面是不同物件的作用域規則:
每個模組都有自已的全域作用域。
函數定義的物件屬局部作用域,只在函數內有效,不會影響全域作用域中的物件。
賦值物件屬局部作用域,除非使用global關鍵字進行宣告。
LGB規則是Python找出名字的規則,以下是LGB規則:
1.大多數名字引用在三個作用域中找出:先局部(Local),次之全域( Global),再次內建(Build-in)。
複製程式碼 程式碼如下:
>>> a=2
>>> b=2
>>> def test(b):
... test=a*b
... return test
>>>print test(10)
20
##20
複製程式碼
程式碼如下:
#沒用global時的情況
>>> name="Jims"
>>> def set():
... name="ringkee"
...
>>> set()
#>>> print name
#使用global後的情況
>>> name="Jims"
>>> def set1():
.. . global name
... name="ringkee"
...
>>> set1()
#>>> print name
#ringkee
複製程式碼
程式碼如下:
>>> a=1
>>> def test(a):
... a=a+1
... print a
...
>>> test(a)
2
>>> a
1 # a值不變
複製程式碼
程式碼如下:
>>> a=1
>>> b=[1,2 ]
>>> def test(a,b):
... a=5
... b[0]=4
... print a,b
#...
>>> test(a,b)
5 [4, 2]
>>> a
1
>>> b
[4, 2] # b值已更改
複製程式碼
程式碼如下:
>>> def test(a,b):
... return a +b
...
>>> test(1,2) #數值類型
3
>>> test("a","b") #字符型
'ab'
>>> test([12],[11]) #列表
[12, 11]
def function(ARG=VALUE)
def function(*ARG)
字典(dictionary)參數:
def function(**ARG)
一些函數規則:
預設值必須在非預設參數之後;
在單一函數定義中,只能使用一個tuple參數(*ARG)和一個字典參數(**ARG)。
tuple參數必須在連接參數和預設參數之後。
字典參數必須在最後定義。
1.常用函數
1.abs(x)
abs()傳回一個數字的絕對值。如果給定複數,回傳值就是該複數的模。
複製程式碼 程式碼如下:
>>>print abs(-100)
100
>>> ;print abs(1+2j)
2.2360679775
2.callable(object)
callable()函數用於測試物件是否可調用,如果可以則傳回1 (真);否則返回0(假)。可呼叫物件包括函數、方法、程式碼物件、類別和已經定義了「呼叫」方法的類別實例。
複製程式碼 程式碼如下:
>>> a="123"
>>> print callable(a )
0
>>> print callable(chr)
1
3.cmp(x,y)
cmp()函數比較x和y兩個對象,並根據比較結果返回一個整數,如果x
複製程式碼 程式碼如下:
>>>a=1
>>>b=2
>>>c=2
>>> print cmp(a,b)
-1
>>> print cmp(b,a)
1
>>> print cmp(b,c)
0
#4.pmod(x,y)
pmod(x,y)函數完成除法運算,返回商數和餘數。
複製程式碼 程式碼如下:
>>> pmod(10,3)
(3, 1)
> ;>> pmod(9,3)
(3, 0)
#5.isinstance(object,class-or-type-or-tuple) -> bool
測試物件類型
複製程式碼 程式碼如下:
#>>> a='isinstance test'
> >> b=1234
>>> isinstance(a,str)
True
>>> isinstance(a,int)
False
> >> isinstance(b,str)
False
>>> isinstance(b,int)
True
複製程式碼 程式碼如下:
def displayNumType(num):
print num, 'is',
if isinstance( num, (int, long, float, complex)):
print 'a number of type:', type(num).__name__
else:## all
displayNumType(-69)
displayNumType(9999999999999999999999999L)
displayNumType(565.8)
displayNumType(-344.3+34.4j)##displayaplaypumType( #程式碼運行結果如下:
複製程式碼
程式碼如下:
9999999999999999999999999 is a number of type : long565.8 is a number of type: float(-344.3+34.4j) is a number of type: complex
xxx is not a number at all!!!
6.len(object) -> integer
複製程式碼
程式碼如下:>>> len("aa")
2>>> ; len([1,2])
2
7.pow(x,y[,z])
複製程式碼
程式碼如下:>>> print pow(2,4)
16>> > print pow(2,4,2)
0
>>> print pow(2.4,3)
13.824
#8.range([lower ,]stop[,step])
複製程式碼
程式碼如下:>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1,10,2)
[1, 3, 5, 7, 9]
9.round(x[,n])
round()函數傳回浮點數x的四捨五入值,如給出n值,則代表捨入到小數點後的位數。
複製程式碼 程式碼如下:
>>> round(3.333)
3.0
>>> round (3)
3.0
>>> round(5.9)
6.0
10.type(obj)
#type()函數可傳回物件的資料類型。
複製程式碼 程式碼如下:
>>> type(a)
>>> type(copy)
>>> type(1)
11.xrange([lower,]stop[,step])
xrange()函數與range()類似,但xrnage()並沒有建立列表,而是傳回一個xrange對象,它的行為與列表相似,但是只在需要時才計算列表值,當列表很大時,這個特性能為我們節省記憶體。
複製程式碼 程式碼如下:
>>> a=xrange(10)
>>> print a[ 0]
0
>>> print a[1]
1
#>>> print a[2]
2
#2.內建型別轉換函數
1.chr(i)
chr()函數傳回ASCII碼對應的字串。
複製程式碼 程式碼如下:
>>> print chr(65)
A
>>> print chr(66)
B
>>> print chr(65)+chr(66)
AB
2.complex(real[,imaginary])
complex()函數可把字串或數字轉換為複數。
複製程式碼 程式碼如下:
>>> complex("2+1j")
(2+1j)
>>> complex("2")
(2+0j)
>>> complex(2,1)
(2+1j)
>> ;> complex(2L,1)
(2+1j)
#3.float(x)
float()函數把一個數字或字串轉換成浮點數。
複製程式碼 程式碼如下:
>>> float("12")
12.0
>>> ; float(12L)
12.0
>>> float(12.2)
12.199999999999999
4.hex(x)
##hex()函數可把整數轉換成十六進位數。複製程式碼 程式碼如下:
>>> hex(16)
'0x10'
>>> ; hex(123)
'0x7b'
複製程式碼 程式碼如下:
>>> long("123")
123L
>>> ; long(11)
11L
複製程式碼 程式碼如下:
>>> list("hello world")
['h', ' e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> list(( 1,2,3,4))
[1, 2, 3, 4]
複製程式碼 程式碼如下:
>>> int(3.3)
3
>>> int (3L)
3
>>> int("13")
13
>>> int("14",15)
19
複製程式碼 程式碼如下:
>>> min(1,2,3,4)
1
> ;>> min((1,2,3),(2,3,4))
(1, 2, 3)
複製程式碼 程式碼如下:
>>> max(1,2,3,4)
4
> ;>> max((1,2,3),(2,3,4))
(2, 3, 4)
複製程式碼 程式碼如下:
>>> oct(8)
'010'
>>> oct( 123)
'0173'
11.ord(x)
ord()函數傳回一個字串參數的ASCII碼或Unicode值。
複製程式碼 程式碼如下:
>>> ord("a")
97
>>> ; ord(u"a")
97
12.str(obj)
str()函數把物件轉換成可列印字串。
複製程式碼 程式碼如下:
>>> str("4")
'4'
>> ;> str(4)
'4'
>>> str(3+2j)
'(3+2j)'
13.tuple (x)
tuple()函數把序列物件轉換成tuple。
複製程式碼 程式碼如下:
>>> tuple("hello world")
('h', 'e' , 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')
>>> tuple([1, 2,3,4])
(1, 2, 3, 4)
#3.序列處理函數
1.常用函數中的len()、max()和min()同樣可用於序列。
2.filter(function,list)
當呼叫filter()時,它會將一個函數套用到序列中的每個項,並傳回該函數傳回真值時的所有項,從而過濾掉返回假值的所有項。
複製程式碼 程式碼如下:
>>> def nobad(s):
... return s.find(" bad") == -1
...
>>> s = ["bad","good","bade","we"]
>>> filter(nobad,s)
['good', 'we']
這個例子透過把nobad()函數應用於s序列中所有項,過濾掉所有包含“bad”的項。
3.map(function,list[,list])
map()函數把一個函數套用到序列中所有項,並傳回一個列表。
複製程式碼 程式碼如下:
>>> import string
>>> s=["python", "zope","linux"]
>>> map(string.capitalize,s)
['Python', 'Zope', 'Linux']
# map()也可同時應用於多個清單。如:
複製程式碼 程式碼如下:
>>> import operator
>>> s=[1, 2,3]; t=[3,2,1]
>>> map(operator.mul,s,t) # s[i]*t[j]
[3, 4 , 3]
如果傳遞一個None值,而不是一個函數,則map()會把每個序列中的對應元素合併起來,並傳回該元組。如:
複製程式碼 程式碼如下:
>>> a=[1,2];b=[3,4]; c=[5,6]
>>> map(None,a,b,c)
[(1, 3, 5), (2, 4, 6)]
4.reduce(function,seq[,init])
reduce()函數取得序列中前兩個項,並把它傳遞給提供的函數,獲得結果後再取序列中的下一項,連同結果再傳遞給函數,以此類推,直到處理完所有項為止。
複製程式碼 程式碼如下:
>>> import operator
>>> reduce(operator.mul,[ 2,3,4,5]) # ((2*3)*4)*5
120
>>> reduce(operator.mul,[2,3,4,5], 1) # (((1*2)*3)*4)*5
120
>>> reduce(operator.mul,[2,3,4,5],2) # (((2*2)*3)*4)*5
240
#5.zip(seq[,seq,...])
zip( )函數可把兩個或多個序列中的對應項合併在一起,並以元組的格式傳回它們,在處理完最短序列中的所有項後就停止。
複製程式碼 程式碼如下:
>>> zip([1,2,3],[4,5],[7 ,8,9])
[(1, 4, 7), (2, 5, 8)]
如果參數是一個序列,則zip()會以一元組的格式傳回每個項,如:
複製程式碼 程式碼如下:
#>>> zip((1,2,3,4 ,5))
[(1,), (2,), (3,), (4,), (5,)]
>>> zip([1,2,3 ,4,5])
[(1,), (2,), (3,), (4,), (5,)]
4.其他
def語句是即時執行的,當它運行的時候,它創建並將一個新的函數物件賦值給一個變數名,Python所有的語句都是即時執行的,沒有像獨立的編譯時間這樣的流程
由於是語句,def可以出現在任一語句可以出現的地方--甚至是嵌套在其他語句中:
複製程式碼 程式碼如下:
if test:
def fun():
...
else:
##...
func()
可以將函數賦值給一個不同的變數名,並且透過新的變數名進行呼叫:
othername=func( )
othername()建立函數
內建的callable函數可以用來判斷函數是否可呼叫:
程式碼如下:
>>> import math>>> x=1
>>> y=math.sqrt
>>>>> y=math.sqrt
>>> ; callable(x)
False
>>> callable(y)
True
#複製程式碼 程式碼如下:
>>> def hello(name):
return 'Hello, '+name+'!'
#>>> ; print hello('world')
Hello, world!
>>> print hello('Gumby')
Hello, Gumby!
複製程式碼 程式碼如下:
#>>> def fibs(num):
result=[0,1 ]
for i in range(num-2):
result.append(result[-2]+result[-1])
約 4 )
[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']
>>> 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 namesFalse
>>> 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)
> >> 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
('Testing',)
>>> print_params(1,2,3)
(1, 2, 3)
複製程式碼 程式碼如下:
>>> def print_params_2(title, *params):
print title
print params
params: 2, 3)
>>> print_params_2('Nothing:')
Nothing:
()
星號的意思是「收集其餘的位置參數”,如果不提供任何供收集的元素,params就是個空元組
但是不能處理關鍵字參數:
複製程式碼程式碼如下:
>>> print_params_2('Hmm...',something=42)Traceback (most recent call last):
File "
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
##>>> 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)
{'y': 22 , 'x': 1, 'z': 3}
>>> #返回的是字典而不是元組
>>> def print_params_4(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
>>> print_params_4(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
1 2 3
()
{}
以上是Python函數基礎入門的詳細內容。更多資訊請關注PHP中文網其他相關文章!