Python入門篇之函數

來源:互聯網
上載者:User
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

b在局部範圍中找到,a在全域範圍中找到。

2.如想在局部範圍中改變全域範圍的對象,必須使用global關鍵字。

代碼如下:


#沒用global時的情況
>>> name="Jims"
>>> def set():
... name="ringkee"
...
>>> set()
>>> print name
Jims

#使用global後的情況
>>> name="Jims"
>>> def set1():
... global name
... name="ringkee"
...
>>> set1()
>>> print name
ringkee

3.'global'聲明把賦值的名字映射到一個包含它的模組的範圍中。

函數的參數是函數與外部溝通的橋樑,它可接收外部傳遞過來的值。參數傳遞的規則如下:

4.在一個函數中對參數名賦值不影響調用者。

代碼如下:


>>> a=1
>>> def test(a):
... a=a+1
... print a
...
>>> test(a)
2
>>> a
1 # a值不變

5.在一個函數中改變一個可變的對象參數會影響調用者。

代碼如下:


>>> 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)
元組(Tuples)參數:

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兩個對象,並根據比較結果返回一個整數,如果xy,則返回1,如果x==y則返回0。

代碼如下:


>>>a=1
>>>b=2
>>>c=2
>>> print cmp(a,b)
-1
>>> print cmp(b,a)
1
>>> print cmp(b,c)
0

4.divmod(x,y)

divmod(x,y)函數完成除法運算,返回商和餘數。

代碼如下:


>>> divmod(10,3)
(3, 1)
>>> divmod(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

下面的程式展示了isinstance函數的使用:

代碼如下:


def displayNumType(num):
print num, 'is',
if isinstance(num, (int, long, float, complex)):
print 'a number of type:', type(num).__name__
else:
print 'not a number at all!!!'
displayNumType(-69)
displayNumType(9999999999999999999999999L)
displayNumType(565.8)
displayNumType(-344.3+34.4j)
displayNumType('xxx')

代碼運行結果如下:

代碼如下:


-69 is a number of type: int
9999999999999999999999999 is a number of type: long
565.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()函數返回字串和序列的長度。

代碼如下:


>>> len("aa")
2
>>> len([1,2])
2

7.pow(x,y[,z])

pow()函數返回以x為底,y為指數的冪。如果給出z值,該函數就計算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()函數可按參數產生連續的有序整數列表。

代碼如下:


>>> 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'

5.long(x[,base])

long()函數把數字和字串轉換成長整數,base為可選的基數。

代碼如下:


>>> long("123")
123L
>>> long(11)
11L

6.list(x)

list()函數可將序列對象轉換成列表。如:

代碼如下:


>>> list("hello world")
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> list((1,2,3,4))
[1, 2, 3, 4]

7.int(x[,base])

int()函數把數字和字串轉換成一個整數,base為可選的基數。

代碼如下:


>>> int(3.3)
3
>>> int(3L)
3
>>> int("13")
13
>>> int("14",15)
19

8.min(x[,y,z...])

min()函數返回給定參數的最小值,參數可以為序列。

代碼如下:


>>> min(1,2,3,4)
1
>>> min((1,2,3),(2,3,4))
(1, 2, 3)

9.max(x[,y,z...])

max()函數返回給定參數的最大值,參數可以為序列。

代碼如下:


>>> max(1,2,3,4)
4
>>> max((1,2,3),(2,3,4))
(2, 3, 4)

10.oct(x)

oct()函數可把給出的整數轉換成八位元。

代碼如下:


>>> 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:
def func():
...
...
func()

可以將函數賦值給一個不同的變數名,並通過新的變數名進行調用:

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)

>>> 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)
{'y': 2, 'x': 1, '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)
{'foo': 1, 'bar': 2}
>>> parames(1,2)
1 2 3
()
{}
>>> def print_params_3(**params):
   print params

>>> print_params_3(x=1,y=2,z=3)
{'y': 2, 'x': 1, '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)
{'foo': 1, 'bar': 2}
>>> print_params_4(1,2)
1 2 3
()
{}

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.