1. 程式人生 > >python中的函式,以及函式的可變引數,遞迴函式和高階函式以及練習題目

python中的函式,以及函式的可變引數,遞迴函式和高階函式以及練習題目

函式作用:實現程式碼的複用 函式概念:函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。 函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。 系統的幾個內建函式:現成的函式,不需要定義def # 1、絕對值:abs(-1) # 2、最大最小值:max([1,2,3])、min([1,2,3]),對序列進行操作 # 3、序列長度:len('abc')、len([1,2,3])、len((1,2,3)) # 4、乘方:pow(2,3,4)    // (2**3) % 4 # 5、浮點數:round(3.1415926, 2)    //3.14 四捨五入 ,比較重要,

f=11.0/3 print round(f,3)  #科學的四捨五入 返回:3.667# 6、型別轉換函式:int()、str().... # 7、比較函式cmp() 還有一個重要的函式:匿名函式,lambda表示式,通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式。  def func(x,y):

return x+y func = lambda x,y:x+y  #上面這個函式就可以直接用lambda函式寫出來,是兩個等價的函式 建立函式語法 def 函式名(引數列表): 函式語句/函式體 函式的命名規則:駝峰命名:每個單詞首字母要大寫

小駝峰命名規則,一個單詞直接小寫   # 多個單詞,每個單詞小寫,以下劃線分隔 ge_student_name

大駝峰:單詞首字母大寫

類名,檔名,首字母大寫,每個單詞首字母大寫

方法名:首字母小寫,每個單詞首字母大寫 ,中間可能會加下劃線

文件化說明的函式:注意:函式首行加 ''  或 ''' '''使用函式名.__doc__屬性 可以檢視函式文件

def sum():     ''' 這是第一個函式     '''     pass                            ####pass是用來佔位的

print sum.__doc__  #內建變數,雙下劃線,內建的固定引數,輸出函式說明 輸出函式說明: 這是第一個函式help(函式名),例子:

callable(函式名) --判斷函式是否可以被呼叫:debug的時候經常報錯,xx is not callable --說明你應該在報錯的地方給一個函式,結果你給的xxx不能當函式用

判斷a=0,是否是函式

a=0 print callable(a) 返回結果:False

例子:因為key後面要加一個函式,但是a不是函式,所以就會報錯,截圖錯誤,就表示a不能當函式用

dic=[1,2,3] a=0 print sorted(dic,key=a) 控制檯輸出:

函式的引數:引數可以指定引數名,也可以不指定引數名,下面是兩個例子:

#不指定引數名 def my_function(a,b):     print a+b my_function(1,2) #可以指定引數名 def my_function(name,age):     print '姓名:%s,年齡:%s'%(name,age) my_function(name='zhangsan',age=12) 預設引數的使用 

  *順序:帶預設值的引數往後放,後面不能再有必填引數,帶有預設值的引數後面一定不能再有引數了

def function(age=6,name):   #後面不能再有必填引數的,這種寫法就是錯誤的     print name,age function(6,'zhangsan') function('zhangsan') *初始化邏輯:預設值最好是不可變資料型別:如果是不可變資料型別,預設為空最好用None,別用[],因為第第一次賦值的值,會一直記錄

def extendList(val, list=[]):     list.append(val)     return list list1 = extendList(10) list2 = extendList(123, []) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 結果:

list1 = [10, 'a'] list2 = [123] list3 = [10, 'a']

例子:直接給age指定了年齡18

#使用預設值 def my_function2(name,age=18):     print '姓名:%s,年齡:%s'%(name,age) my_function2('zhangsan') 可變引數:傳遞引數的個數是可變的,引數是不定的,在引數後面加 * ,表示後面有若干個引數,當元祖來處理的      語法:def checkin(name, id, *other):  other  函式是是當元組來處理的

def checkin(name, id, *other):     print '姓名:%s, 工號:%s, 其他資訊:%s' % (name, id, other) # checkin('樑水', '12341', 1231231232, '山西省太原市','water') 也支援多個*號,兩個*的不可變資料型別,在函式內部是當字典來處理的 ,選填引數

def checkin2(name, id, **other):     print '姓名:%s, 工號:%s, 其他資訊:%s' % (name, id, other)

checkin2('water', '1234', phone = 13800000000, address = '北京哇哈哈') **引數定義的順序必須是:必選引數、預設引數、可變引數(name,age=6,**other)

函式的作用域的問題

關於函式返回的幾種理解: return的優先順序高於一切

見到return 函式就結束

舉例說明:

def a():     print '能列印嗎?'     return 0,1 print a()     #結果就是: 能列印嗎?             (0, 1) 下面這種:

def a():     return 0, 1     print '能列印嗎?' print a()

#結果就是 (0, 1)

不寫return無返回--None

只寫return 返回None

def my_function2(name):     print '姓名:%s,' % (name)     return  print my_function2('beijing')   #返回 None return裡面有多個值--實際返回的是元祖,如圖

def my_function2(name):     print '姓名:%s,' % (name)     return 1,2,4,5,6 print my_function2('beijing')       #執行結果:姓名:beijing,     (1, 2, 4, 5, 6) 遞迴:函式自己調自己,如果一個函式在內部呼叫自身,這個函式叫做遞迴函式,遞迴呼叫的次數過多,會導致棧溢位 :要慎重

def a():     print 'a'     a()

a() 遞迴函式的兩個練習:回聲練習和階乘

1.求一個數n的階乘

def fact(n):     if n == 1:         return 1     return n * fact(n - 1)

print fact(5) 2.編寫一個遞迴函式,達到回聲的效果 比如:同志們你們好嗎 輸出:同志們你們好嗎 志們你們好嗎 們你們好嗎 你們好嗎 們好嗎 好嗎 嗎

def fact_voice(context):     if len(context) == 0:         return 0     print context,     context = context[1:]     return fact_voice(context)

fact_voice(u'同志們你們好嗎') 高階函式:可以理解為函式套函式,函式的引數裡面也帶一個函式,最基本的幾個高階函式的應用,函式的引數是函式

map():函式接收兩個引數,一個是函式,一個是序列,將傳入的函式依次作用到序列的每個元素,並把結果作為新的list返回 應用:並行遍歷--序列合併

a = [1, 2, 3, 4, 5] print map(lambda x:x**2,a)  #序列的每一項都2次方 reduce():把一個函式作用在一個序列上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算 a = [1, 2, 3, 4, 5] print reduce(lambda x,y:x*y,a)   #求乘積 filter():“篩選”函式 ·和一個序列 把傳入的函式依次作用於每個元素,根據返回值是True還是False決定保留還是丟棄該元素

a = [1, 2, 3, 4, 5] print filter(lambda x:x%2==0,a)  #篩選偶數 """1.利用map()函式,把使用者輸入的不規範的英文名字,變為首字母大寫,其他小寫的規範名字。 輸入:['adam', 'LISA', 'barT'],輸出:['Adam', 'Lisa', 'Bart']""" data = ['adam', 'LISA', 'barT']

print map(lambda x:x.capitalize(), data) 下面這個函式是自己剛開始學習不太懂,老公給我出的一個題目,哈哈哈哈,讓我明白了函式與函式之間的呼叫:

# 題目# 想和史華濤結婚, 他必須滿足幾個條件, 如果滿足 (每個條件就是一個函式), 輸出結婚的時間# 1. 必須在24-27 之間# 2. 必須愛我

# 3. 必須有money,

哈哈,竟然暴露了自己的結婚日期

def andShtsGetMarry(age,islove,ismoney):     if isageok(age) and isloveme(islove) and hasmoney(ismoney):         return '2016-12-24'     else:         return ''

def isageok(age):     if age in [24,25,26,27]:         return True     else:         return False

def isloveme(love):     if love=='love':         return True     else:         return False

def hasmoney(money):     if money>10000:         return True     else:         return False

print andShtsGetMarry(27,'love',1000000000) 練習題二:#雙11要採購一些生活用品,但是money有限,只有200元, #牛奶 20元 麵包 2元 蘋果5塊 衣服 50 鞋子70 菜10元 零食22 飲料8 水7塊 羽毛球 60

#1:隨便輸入幾件自己喜歡的,輸出購買商品和剩餘的money

goodlist=[{'goodsname':'milk','goodsprice':20}, {'goodsname':'bread','goodsprice':2}, {'goodsname':'apple','goodsprice':5}, {'goodsname':'clothers','goodsprice':50}, {'goodsname':'apple','goodsprice':70}, {'goodsname':'vegetable','goodsprice':10}, {'goodsname':'drunkfood','goodsprice':22}, {'goodsname':'drink','goodsprice':8}, {'goodsname':'water','goodsprice':7}, {'goodsname':'ball','goodsprice':60}] restmonye=200 #判斷輸入的商品名稱是否存在商品列表裡面 def isExitGoodslist(goodsname):     for i in goodlist:         if goodsname == i.values()[0]:             return True     return False

#判斷剩餘餘額是否能購買此商品 def isenoughmoney(goodsname):     global restmonye     for i in goodlist:         if goodsname == i.values()[0]:             price = i['goodsprice']     if restmonye>= price:         restmonye-=price         return True,price     else:         return False,0

def manygoods():     goods=raw_input('請輸入你要購買的商品:')     if isExitGoodslist(goods):#判斷商品存在         if isenoughmoney(goods)[0]: #判斷是否可以購買             print goods,restmonye             return manygoods()         else:             return '錢不夠了'     else:         print '商品不存在'         return manygoods() # print manygoods()

#2:看看最多能買多少件,剩下多少錢 #3:最少能買多少件,剩下多少錢 學到了知識點:

1:如果要在函式裡面修改全域性變數,就需要在函式裡面新增global修飾,即 global 全域性變數名

2:return 後面加函式名,表示結束本次並且呼叫新的函式