


def 函數(shù)名(參數(shù)): ... 函數(shù)體 ...
函數(shù)的定義主要有如下要點:
以上要點中,比較重要有參數(shù)和返回值:
和其他高級語言區(qū)別:
1.聲明函數(shù)名尾部要有冒號.
2.它不需要用花括號將語句塊括起來,用TAB鍵縮進.
函數(shù)式編程最重要的是增強代碼的重用性和可讀性
實例:
def test_a(): PRint 'hello world' print 'www.jeapedu.com'def test_b(varl,var2): #函數(shù)定義,形參,提供給使用者一個接口. print val1, print val2,print 'Entry programme'test_a()test_b(12,13) #函數(shù)調(diào)用,實參.print 'leave programme'
1、返回值
函數(shù)是一個功能塊,該功能到底執(zhí)行成功與否,需要通過返回值來告知調(diào)用者。
def 發(fā)送短信(): 發(fā)送短信的代碼... if 發(fā)送成功: return True else: return Falsewhile True: # 每次執(zhí)行發(fā)送短信函數(shù),都會將返回值自動賦值給result # 之后,可以根據(jù)result來寫日志,或重發(fā)等操作 result = 發(fā)送短信() if result == False: 記錄日志,短信發(fā)送失敗...
2、參數(shù)
為什么要有參數(shù)?看下下面的例子:
如果不定義參數(shù),用函數(shù)的話:(每個有相同功能的都寫個函數(shù),說好的代碼簡化呢?)
def CPU報警郵件() #發(fā)送郵件提醒 連接郵箱服務器 發(fā)送郵件 關閉連接def 硬盤報警郵件() #發(fā)送郵件提醒 連接郵箱服務器 發(fā)送郵件 關閉連接def 內(nèi)存報警郵件() #發(fā)送郵件提醒 連接郵箱服務器 發(fā)送郵件 關閉連接 while True: if cpu利用率 > 90%: CPU報警郵件() if 硬盤使用空間 > 90%: 硬盤報警郵件() if 內(nèi)存占用 > 80%: 內(nèi)存報警郵件()
函數(shù)有三中不同的參數(shù):
1,接收多個參數(shù)
2,內(nèi)部自動構造元組
3,序列,*,避免內(nèi)部構造元組
1 >>> li = (1,2,3,4,5,66,'alex') 2 >>> 3 >>> def func(*args): 4 ... print args 5 ... 6 >>> func(li) 7 ((1, 2, 3, 4, 5, 66, 'alex'),) 8 >>> func(*li) 9 (1, 2, 3, 4, 5, 66, 'alex')10 >>> li = [1,2,3,4,5,66,'alex']11 >>> def func(*args):12 ... print args13 ... print args[0] 通過下標獲取元素14 >>> func(li)15 ([1, 2, 3, 4, 5, 66, 'alex'],)16 >>> func(*li)17 (1, 2, 3, 4, 5, 66, 'alex')18 >>>
如果一個函數(shù)定義中的最后一個形參有 ** (雙星號)前綴,所有正常形參之外的其他的關鍵字參數(shù)都將被放置在一個字典中傳遞給函數(shù),比如:
1 def contacs(a,**b): 2 print "a is: %s" %a 3 for i in b: 4 print i + ":" + str(b[i]) 5 6 contacs(100, saneri=1234567890,rain=007) #調(diào)用 7 8 a is: 100 #執(zhí)行結果 9 saneri:123456789010 rain:7
擴展:發(fā)送郵件實例
import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddrdef email(message): msg = MIMEText("郵件報警測試", 'plain', 'utf-8') msg['From'] = formataddr(["saneri",'saneri@126.com']) #發(fā)件人和發(fā)件郵箱 msg['To'] = formataddr(["收件人",'838118461@QQ.com']) msg['Subject'] = message #這里我調(diào)用了參數(shù) server = smtplib.SMTP("smtp..com", 25) server.login("saneri@126.com", "密碼") server.sendmail('shuaige@126.com', ['451161316@qq.com',], msg.as_string()) server.quit()if __name__ == u'__main__': cpu = 100 disk = 500 ram = 50 for i in range(1): if cpu > 90: alert = u'CPU出問題了' #這里設置了一個變量 email(alert) #這里調(diào)用函數(shù)的時候引用了上面的變量,當執(zhí)行函數(shù)的時候形參講會被替換掉,message='CPU出問題了' 發(fā)送郵件! if disk > 90: alert = u'硬盤出問題了' email(alert) if ram> 80: alert = u'內(nèi)存出問題了' email(alert)
--------------------------------------------------------------------------------------------------
如果執(zhí)行python test.py 等同于 __name__ == '__mail__'
被執(zhí)行的腳步,__name_'值 ==__mail__

條件運算時,對于簡單的 if else 語句,可以使用三元運算來表示,即:
1 # 普通條件語句 2 3 if 1 == 1: 4 5 name = 'wusiri' 6 7 else: 8 9 name = 'asir'10 13 # 三元運算14 15 name = 'wusiri' if 1 == 1 else 'asir'
對于簡單的函數(shù),也存在一種簡便的表示方式,即:lambda表達式
1 # ###################### 普通函數(shù) ###################### 2 3 # 定義函數(shù)(普通方式) 4 5 def fun(arg): 6 7 return arg + 1 8 9 # 執(zhí)行函數(shù)10 11 result = fun(123)12 13 # ###################### lambda ######################14 17 # 定義函數(shù)(lambda表達式)18 19 my_lambda = lambda arg : arg + 1 22 23 # 執(zhí)行函數(shù)24 25 result = my_lambda(123)
#lambda存在意義就是對簡單函數(shù)的簡潔表示:

一、map
遍歷序列,對序列中每個元素進行操作,最終獲取新的序列。
map()函數(shù)接收兩個參數(shù),一個是函數(shù),一個是序列,map將傳入的函數(shù)依次作用到序列的每個元素,并把結果作為新的list返回。
>>> def f(x):... return x * x...>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])[1, 4, 9, 16, 25, 36, 49, 64, 81]#map()傳入的第一個參數(shù)是f,即函數(shù)對象本身。
1 #每個元素增加100 2 3 li = [11, 22, 33] 4 5 new_list = map(lambda a: a + 100, li) 6 7 8 #兩個列表對應元素相加 9 10 li = [11, 22, 33]11 sl = [1, 2, 3]12 new_list = map(lambda a, b: a + b, li, sl)
k1 = [11,20,23]
k2 = [2,5,8]
def func4(a1,a2):
return a1 + a2
print map(func4,k1,k2)
二、filter
對序列中的元素依次進行篩選,將執(zhí)行結果為True的元素組成一個序列(List/String/Tuple)(取決于序列的類型)返回:
1 li = [11, 22, 33]2 3 new_list = filter(lambda arg: arg > 22, li)4 5 #filter第一個參數(shù)為空,將獲取原來序列
1 def f(x):2 return x != 'a' 3 4 filter(f, "abcdef") 5 'bcdef'
三、reduce
對于序列內(nèi)所有元素進行累計操作:
1 def add(x,y): 2 return x + y 3 4 5 reduce(add, range(1, 11)) 6 值: 7 55 (注:1+2+3+4+5+6+7+8+9+10) 8 9 reduce(add, range(1, 11), 20) 10 值為:11 12 75 (注:1+2+3+4+5+6+7+8+9+10+20)
li = [1,2,3,4,5,6,7,8,9]
print reduce(lambda arg1,arg2:arg1*arg2,li) //對li中的元素進行壘乘計算
362880
li = [1,2,3,4,5,6,7,8,9]
print reduce(lambda arg1,arg2:arg1*arg2,li,100) #100為基數(shù),再100的基礎上進行加減乘除.# reduce的第一個參數(shù),函數(shù)必須要有兩個參數(shù)# reduce的第二個參數(shù),要循環(huán)的序列# reduce的第三個參數(shù),初始值

1、對比range 和 xrange 的區(qū)別:
1 >>> print range(10)2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]3 >>> print xrange(10)4 xrange(10)
如上代碼所示,range會在內(nèi)存中創(chuàng)建所有指定的數(shù)字,而xrange不會立即創(chuàng)建,只有在迭代循環(huán)時,才去創(chuàng)建每個數(shù)組。
1 def funt(): 2 yield 1 3 yield 2 4 yield 3 5 6 for i in funt(): 7 print i 8 ################################## 9 10 def mrange(arg):11 seed = 012 while True:13 seed += 114 if seed > 10:15 return16 else:17 yield seed18 19 for i in mrange(10):20 print i
2、文件操作的 read 和 xreadlinex 的的區(qū)別:
read會讀取所有內(nèi)容到內(nèi)存
xreadlines則只有在循環(huán)迭代時才獲取1 基于seek和tell自定義生成器NReadlines: 2 3 def NReadlines(): 4 with open('log','r') as f: 5 seek = 0 6 while True: 7 f.seek(seek) 8 data = f.readline() 9 if data:10 seek = f.tell()11 yield data12 else:13 return14 15 for item in NReadlines():16 print item

裝飾器是函數(shù),只不過該函數(shù)可以具有特殊的含義,裝飾器用來裝飾函數(shù)或類,使用裝飾器可以在函數(shù)執(zhí)行前和執(zhí)行后添加相應操作。
使用裝飾函數(shù)在函數(shù)執(zhí)行前和執(zhí)行后分別附加額外功能: 1 #使用裝飾函數(shù)在函數(shù)執(zhí)行前和執(zhí)行后分別附加額外功能 2 #裝飾函數(shù)的參數(shù)是被裝飾的函數(shù)的對象,返回原函數(shù)對象
3 下例為替換函數(shù)(裝飾): 4 5 def deco(func): #裝飾函數(shù) 6 print "before myfunc() called" 7 func() 8 print "after myfunc() called." 9 return func10 11 def myfunc(): #被裝飾函數(shù)12 print "myfunc() called."13 14 #myfunc = deco(myfunc)
#myfunc()
#myfunc()
15 result = deco(myfunc)16 result()17 result()
使用語法糖@來裝飾函數(shù):
1 使用語法糖@來裝飾函數(shù),相當于上例中 “myfunc= deco(myfunc)” 2 3 def deco(func): 4 print("before myfunc() called.") 5 func() 6 print(" after myfunc() called.") 7 return func 8 9 @deco10 def myfunc():11 print(" myfunc() called.")12 13 myfunc()14 myfunc()

return 語句用來從函數(shù)中return(返回),也就是說跳出函數(shù)。同樣,我們也可以從函數(shù)中選擇性地返回一個值。
1 def maximum(x, y):2 if x > y:3 return x4 elif x == y:5 return '兩個數(shù)相等'6 else:7 return y8 9 print(maximum(2, 3))
輸出:
3

冒泡算法:將需要排序的元素看作是一個個“氣泡”,最小的“氣泡”最先浮出水面,排在最前面。從小到大依次排列。
實例:
1 需求:請按照從小到大對列表 [13, 22, 6, 99, 11] 進行排序 2 3 思路:相鄰兩個值進行比較,將較大的值放在右側(cè),依次比較! 4 5 li = [13, 22, 6, 99, 11] 6 7 for m in range(len(li)-1): 8 9 for n in range(m+1, len(li)):10 11 if li[m] > li[n]:12 temp = li[n]13 14 li[n] = li[m]15 li[m] = temp16 print li
實例2:
1 def popo(numbers): 2 for x in xrange(len(numbers)-1, -1, -1): 3 for i in xrange(x): 4 if numbers[i] > numbers[i+1]: 5 numbers[i], numbers[i+1] = numbers[i+1], numbers[i] # 交換數(shù)據(jù) 6 print numbers 7 8 def main(): 9 numbers = [23, 12, 9, 15, 6]10 popo(numbers)11 12 if __name__ == '__main__':13 main()
1 #將a和b的值互換位置,使a =123 ,b =abc: 2 a = "abc" 3 b = 123 4 5 temp = a #定義中間變量temp 6 a= b 7 b = temp 8 print "a = %s" %a ,"/n" "b = %s" %b, 9 10 打印輸出:11 12 a = 123 13 b = abc
遞歸:
規(guī)律:除過第一個和第二個數(shù)外,前兩個數(shù)相加都是第三個數(shù)的值?。?!
斐波那契數(shù)列指的是這樣一個數(shù)列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657
1 def func(arg1,arg2):2 if arg1 == 0: #如果arg1等于0
3 print arg1, arg2 #打印出arg1,arg24 arg3 = arg1 + arg25 print arg36 func(arg2, arg3) #將func(arg2,arg3)的值給func(arg1,arg2)再執(zhí)行
7 8 func(0,1)
遞歸:
1 def func(arg1,arg2): 2 if arg1 == 0: 3 print arg1, arg2 4 arg3 = arg1 + arg2 5 #print arg3 6 if arg3 > 1000: 7 8 return arg3 9 return func(arg2, arg3) #將func(arg2,arg3)的值給func(arg1,arg2)再執(zhí)行10 11 #func(0,1)12 result = func(0,1)13 print result
新聞熱點
疑難解答