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 後面加函式名,表示結束本次並且呼叫新的函式