Python函數基礎入門

巴扎黑
發布: 2017-08-05 16:10:17
原創
1811 人瀏覽過

本篇文章將介紹如何將語句組織成函數,以及參數概念以及在程式中的用途,需要的朋友可以參考下

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

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

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

複製程式碼 程式碼如下:

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( #程式碼運行結果如下:


複製程式碼
程式碼如下:

#-69 is a number of type: int

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()函數傳回字串和序列的長度。

複製程式碼

程式碼如下:

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


可以將函數賦值給一個不同的變數名,並且透過新的變數名進行呼叫:

othername=func( )

othername()

建立函數

內建的callable函數可以用來判斷函數是否可呼叫:

複製程式碼

程式碼如下:

>>> import math

>>> x=1
>>> y=math.sqrt
>>>>> 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])
  約 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']

>>> 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: 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
##>>> 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': 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}

>>> print_params_4(1,2)

1 2 3
()
{}

以上是Python函數基礎入門的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板