和虫师一起学python(7)
本章介紹如何將語句組織成函數(shù),這樣,可以告訴計(jì)算機(jī)如何做事。
?
下面編寫一小段代碼計(jì)算婓波那契數(shù)列(前兩個(gè)數(shù)的和是第三個(gè)數(shù))
fibs = [0,1] # 定義一個(gè)列表,初始內(nèi)容是0,1 for i in range(8): #循環(huán)8次fibs.append(fibs[-2]+fibs[-1]) #append在末尾追加一個(gè)數(shù),這個(gè)是它前面兩個(gè)數(shù)的和#輸入 >>> fibs #輸出 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]因?yàn)橘x完值fibs已經(jīng)有兩個(gè)數(shù)了(0,1),所以循環(huán)8次之后,列表有10個(gè)數(shù),兩個(gè)數(shù)相加等于第3個(gè)數(shù)。
是不是覺得應(yīng)該由我們輸入來控制打印多少個(gè)數(shù)?只用把程序小變一下就行了。
fibs = [0,1] num = input('How many fibonacci numbers do you want?') for i in range(num-2):fibs.append(fibs[-2]+fibs[-1]) print fibs #輸入 >>> How many fibonacci numbers do you want?12 #輸出 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]?
?
抽象
抽象有可以節(jié)省很多工作,它使得計(jì)算機(jī)程序可以讓人讀懂的關(guān)鍵。計(jì)算機(jī)喜歡處理精確和具體的指令,但人不同,我們更喜歡丟進(jìn)去一個(gè)東西,計(jì)算機(jī)就能反饋給我們想要的結(jié)果,而不是由我們一步一步的告訴它怎么做。因此,上面的代碼抽象一點(diǎn),應(yīng)該是這樣的:
?
num = input('How many fibonacci numbers do you want?') print fibs?
那計(jì)算機(jī)怎么知道要怎么做?我們可以把處理的過程封裝成函數(shù),在我們每次用到時(shí)只用調(diào)用這個(gè)函數(shù)就可以了。
?
?
創(chuàng)建函數(shù)
函數(shù)是可以調(diào)用的,它執(zhí)行某種行為并且返回一個(gè)值。內(nèi)建的callable函數(shù)可以用來判斷函數(shù)是否可調(diào)用:
>>> import math >>> x = 1 >>> y = math.sqrt >>> callable(x) False >>> callable(y) True備注:callable?在python3.0中不再可用。
?
那如何定義一個(gè)函數(shù)呢?使用def語句即可:
>>> def hello(name):return 'hello.'+name+'!' #我們定義了一個(gè)hello函數(shù),它會將輸入的內(nèi)容前面加“hello.”后面加“!”,并返回給用 #戶 >>> print hello('world') hello.world! >>> print hello('zhangsan') hello.zhangsan!?
不錯(cuò)吧!再回過頭去想想怎樣把返回婓波那契數(shù)列定義成一個(gè)函數(shù)。如下:
#定義fibs函數(shù),用于婓波那契數(shù)列 >>> def fibs(num):result = [0,1]for i in range(num-2):result.append(result[-2]+result[-1])return result#直接調(diào)用fibs函數(shù) >>> 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]?
?
局部變量
當(dāng)函數(shù)定義生命變量的時(shí)候,函數(shù)內(nèi)所生命的變理只在其函數(shù)內(nèi)有效,與函數(shù)外具有相同名稱的其他變量沒有任何關(guān)系
#局部變量 def func(x):print 'x is',xx =2 # x=2只在func函數(shù)內(nèi)其作用print 'Changed local x to',xx = 50 func(x) #func函數(shù)并沒有返回?cái)?shù)據(jù)過來。 print 'x is still',x#輸出 >>> x is 50 Changed local x to 2 x is still 50?
?
global?語句
如果想把一個(gè)變量聲名為?全局的,則可以使用global語句。
def func():global xprint 'x is',xx = 2print 'Changed local x to',xx =50 func() print 'Value of x is ',x #輸出 x is 50 Changed local x to 2 Value of x is 2global?語句被用來生命x?是全局,因此在執(zhí)行完func函數(shù)后,x的值已經(jīng)發(fā)生了改變,并且作用于整個(gè)程序,因此最后的輸入結(jié)果為2
?
?
默認(rèn)參數(shù)
對于一些參數(shù),我們希望它的一些參數(shù)是可選的,如果用戶不想要為這些參數(shù)提供值的話,這些參數(shù)就使用默認(rèn)值。
def say(message,times=1):print message*timessay('Hello') say('World',5) #輸出 >>> Hello WorldWorldWorldWorldWorld?
定義的say函數(shù)的第兩個(gè)參數(shù)就是可選的,默認(rèn)為times=1;也就是將兩個(gè)參數(shù)相乘輸出。
?
注意:只有在形參表末尾的那些參數(shù)可以有默認(rèn)參數(shù),如def?func(a=5,b)?是無效的。
?
?
?
關(guān)鍵參數(shù)
如果某個(gè)函數(shù)有許多參數(shù),而我們只想指定其中的一部分,那么可以使用名字(關(guān)鍵字)而不是位置來給函數(shù)指定實(shí)參。----這被稱作?關(guān)鍵參數(shù)
def func(a,b=5,c=10):print 'a is',a, 'and b is',b,'and c is',cfunc(3,7) func(24,c=32) func(c=23,a=14)#輸出 >>> a is 3 and b is 7 and c is 10 a is 24 and b is 5 and c is 32 a is 14 and b is 5 and c is 23
這樣做,我就不必?fù)?dān)心參數(shù)的順序,使用函數(shù)變得更加簡單。假設(shè)其它函數(shù)都有默認(rèn)值,我們可以只給自己想要的參數(shù)賦值。
?
?
遞歸:
有用的遞歸函數(shù)...?等等,什么是無用的遞歸?先來看一個(gè)函數(shù)的定義:
def recursion()return recursion()?
顯然,它什么也干不了,程序的執(zhí)行不斷申請內(nèi)存,直接內(nèi)存耗盡,程序崩潰。
接著,有用的遞歸函數(shù)包含以下幾個(gè)部分:
- 當(dāng)函數(shù)直接返回值時(shí)有基本實(shí)例(最小可能性問題)
- 遞歸實(shí)例,包括一個(gè)或者多個(gè)問題最小部分的遞歸調(diào)用。
?
下面通過遞歸函數(shù)來計(jì)算一個(gè)n的階,n*(n-1)*(n-2)*....*1
def f(n):if n == 1:return 1else:return n*f(n-1)轉(zhuǎn)載于:https://www.cnblogs.com/Magicorer/p/6496632.html
總結(jié)
以上是生活随笔為你收集整理的和虫师一起学python(7)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2学习笔记(4)接收参数
- 下一篇: linux下使用alias提升开发效率