Python基础之【第三篇】

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

def函数名(参数):

...

函数体

...

函数的定义主要有如下要点:

def:表示函数的关键字函数名:函数的名称,日后根据函数名调用函数函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...参数:为函数体提供数据返回值:当函数执行完毕后,可以给调用者返回数据。以上要点中,比较重要有参数和返回值:

和其他高级语言区别:

1.声明函数名尾部要有冒号.

2.它不需要用花括号将语句块括起来,用TAB键缩进.

函数式编程最重要的是增强代码的重用性和可读性

实例:

def test_a():PRint'hello world'print'www.jeapedu.com'def test_b(varl,var2): #函数定义,形参,提供给使用者一个接口.

print val1,

print val2,

print'Entry programme'test_a()

test_b(12,13) #函数调用,实参.

print'leave programme'

1、返回值

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

def发送短信():

发送短信的代码...if发送成功:returnTrueelse:returnFalsewhileTrue:#每次执行发送短信函数,都会将返回值自动赋值给result#之后,可以根据result来写日志,或重发等操作result=发送短信()ifresult ==False:

记录日志,短信发送失败...

2、参数

为什么要有参数?看下下面的例子:

如果不定义参数,用函数的话:(每个有相同功能的都写个函数,说好的代码简化呢?)

def CPU报警邮件()#发送邮件提醒连接邮箱服务器

发送邮件

关闭连接def硬盘报警邮件()#发送邮件提醒连接邮箱服务器

发送邮件

关闭连接def内存报警邮件()#发送邮件提醒连接邮箱服务器

发送邮件

关闭连接whileTrue:ifcpu利用率 > 90%:

CPU报警邮件()if硬盘使用空间 > 90%:

硬盘报警邮件()if内存占用 > 80%:

内存报警邮件()

函数有三中不同的参数:

普通参数默认参数动态参数1,接收多个参数

2,内部自动构造元组

3,序列,*,避免内部构造元组

1>>> li = (1,2,3,4,5,66,'alex')2>>>3>>>deffunc(*args):4...printargs5...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>>>deffunc(*args):12...printargs13...printargs[0] 通过下标获取元素14>>>func(li)15([1, 2, 3, 4, 5, 66,'alex'],)16>>> func(*li)17(1, 2, 3, 4, 5, 66,'alex')18>>>

如果一个函数定义中的最后一个形参有 ** (双星号)前缀,所有正常形参之外的其他的关键字参数都将被放置在一个字典中传递给函数,比如:

1defcontacs(a,**b):2print"a is: %s"%a3foriinb:4printi +":"+str(b[i])56contacs(100, saneri=1234567890,rain=007)#调用78ais: 100#执行结果9saneri:123456789010rain:7

扩展:发送邮件实例

importsmtplibfromemail.mime.textimportMIMETextfromemail.utilsimportformataddrdefemail(message):

msg= MIMEText("邮件报警测试",'plain','utf-8')

msg['From'] = formataddr(["saneri",'saneri@126.com'])#发件人和发件邮箱msg['To'] = formataddr(["收件人",'838118461@QQ.com'])

msg['Subject'] = message#这里我调用了参数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= 100disk= 500ram= 50foriinrange(1):ifcpu > 90:

alert= u'CPU出问题了'#这里设置了一个变量email(alert)#这里调用函数的时候引用了上面的变量,当执行函数的时候形参讲会被替换掉,message='CPU出问题了' 发送邮件!ifdisk > 90:

alert= u'硬盘出问题了'email(alert)ifram> 80:

alert= u'内存出问题了'email(alert)

--------------------------------------------------------------------------------------------------

如果执行python test.py 等同于 __name__ == '__mail__'

被执行的脚步,__name_'值 ==__mail__

条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:

1# 普通条件语句23if1==1:45name ='wusiri'67else:89name ='asir'1013# 三元运算1415name ='wusiri'if1==1else'asir'

对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

1# ###################### 普通函数 ######################23# 定义函数(普通方式)45def fun(arg):67returnarg +189# 执行函数1011result = fun(123)1213# ###################### lambda ######################1417# 定义函数(lambda表达式)1819my_lambda = lambda arg : arg +12223# 执行函数2425result = my_lambda(123)

#lambda存在意义就是对简单函数的简洁表示:

一、map

遍历序列,对序列中每个元素进行操作,最终获取新的序列。

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

>>>deff(x):

...returnx *x

...>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 16, 25, 36, 49, 64, 81]#map()传入的第一个参数是f,即函数对象本身。

1#每个元素增加10023li = [11, 22, 33]45new_list = map(lambdaa: a + 100, li)678#两个列表对应元素相加910li = [11, 22, 33]11sl = [1, 2, 3]12new_list = map(lambdaa, 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

对序列中的元素依次进行筛选,将执行结果为True的元素组成一个序列(List/String/Tuple)(取决于序列的类型)返回:

1li = [11, 22, 33]23new_list = filter(lambdaarg: arg > 22, li)45#filter第一个参数为空,将获取原来序列

1deff(x):2returnx !='a'34filter(f,"abcdef")5'bcdef'

三、reduce

对于序列内所有元素进行累计操作:

1defadd(x,y):2returnx +y345reduce(add, range(1, 11))6值:755 (注:1+2+3+4+5+6+7+8+9+10)89reduce(add, range(1, 11), 20)10值为:111275 (注: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为基数,再100的基础上进行加减乘除.

# reduce的第一个参数,函数必须要有两个参数

# reduce的第二个参数,要循环的序列

# reduce的第三个参数,初始值

1、对比range 和 xrange 的区别:

1>>> print range(10)2[0,1,2,3,4,5,6,7,8,9]3>>> print xrange(10)4xrange(10)

如上代码所示,range会在内存中创建所有指定的数字,而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。

1def funt():2yield13yield24yield356foriinfunt():7print i8##################################910def mrange(arg):11seed =012whileTrue:13seed +=114ifseed >10:15return16else:17yieldseed1819foriinmrange(10):20print i

2、文件操作的 read 和 xreadlinex 的的区别:

read会读取所有内容到内存

xreadlines则只有在循环迭代时才获取

1基于seek和tell自定义生成器NReadlines:23def NReadlines():4with open('log','r')asf:5seek =06whileTrue:7f.seek(seek)8data =f.readline()9ifdata:10seek =f.tell()11yielddata12else:13return1415foriteminNReadlines():16print item

装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。

使用装饰函数在函数执行前和执行后分别附加额外功能: 1#使用装饰函数在函数执行前和执行后分别附加额外功能 2#装饰函数的参数是被装饰的函数的对象,返回原函数对象

3下例为替换函数(装饰):45def deco(func): #装饰函数6print"before myfunc() called"7func()8print"after myfunc() called."9returnfunc1011def myfunc(): #被装饰函数12print"myfunc() called."1314#myfunc =deco(myfunc)

#myfunc()

#myfunc()

15result =deco(myfunc)16result()17result()

使用语法糖@来装饰函数:

1使用语法糖@来装饰函数,相当于上例中 “myfunc=deco(myfunc)”23def deco(func):4print("before myfunc() called.")5func()6print("after myfunc() called.")7returnfunc89@deco10def myfunc():11print("myfunc() called.")1213myfunc()14myfunc()

return 语句用来从函数中return(返回),也就是说跳出函数。同样,我们也可以从函数中选择性地返回一个值。

1defmaximum(x, y):2ifx >y:3returnx4elifx ==y:5return'两个数相等'6else:7returny89print(maximum(2, 3))

输出:

3

冒泡算法:将需要排序的元素看作是一个个“气泡”,最小的“气泡”最先浮出水面,排在最前面。从小到大依次排列。

实例:

1需求:请按照从小到大对列表 [13,22,6,99,11] 进行排序23思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!45li = [13,22,6,99,11]67forminrange(len(li)-1):89forninrange(m+1, len(li)):1011ifli[m] >li[n]:12temp =li[n]1314li[n] =li[m]15li[m] =temp16print li

实例2:

1defpopo(numbers):2forxinxrange(len(numbers)-1, -1, -1):3foriinxrange(x):4ifnumbers[i] > numbers[i+1]:5numbers[i], numbers[i+1] = numbers[i+1], numbers[i]#交换数据6printnumbers78defmain():9numbers = [23, 12, 9, 15, 6]10popo(numbers)1112if__name__=='__main__':13main()

1#将a和b的值互换位置,使a =123,b =abc:2a ="abc"3b =12345temp =a #定义中间变量temp6a=b7b =temp8print"a = %s"%a ,"\n""b = %s"%b,910打印输出:1112a =12313b = abc

递归:

规律:除过第一个和第二个数外,前两个数相加都是第三个数的值!!!

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657

1deffunc(arg1,arg2):2ifarg1 ==0: #如果arg1等于0

3printarg1, arg2 #打印出arg1,arg24arg3 = arg1 +arg25printarg36func(arg2, arg3) #将func(arg2,arg3)的值给func(arg1,arg2)再执行

78func(0,1)

递归:

1deffunc(arg1,arg2):2ifarg1 ==0:3printarg1, arg24arg3 = arg1 +arg25#print arg36ifarg3 > 1000:78returnarg39returnfunc(arg2, arg3)#将func(arg2,arg3)的值给func(arg1,arg2)再执行1011#func(0,1)12result = func(0,1)13printresult

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航