三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器
一、三元运算(式)
对于一般简单的if else条件判断句可以用三元运算来表示
具体模式为:
ifcondition:expr1else:expr2等价于:expr1ifconditionelseexpr2
解释:如果if condition条件成立就执行expr1表达式,否则就执行else expr2表达式
示例①
>>>if2==2:...name='cool'...else:...name='hot'...>>>name='cool'if2==2else'hot'>>>printnamecool>>>
二、lambda表达式:
对于简单的函数可以用另外一种方式来代替,即lambda
比如有如下函数:
>>>deffun(arg):...returnarg+arg...>>>>>>result=fun(100)>>>printresult200>>>
定义一个变量f_lambda,将lambda arg:arg+1赋予f_lambda
>>>f_lambda=lambdaarg:arg+1>>>result=f_lambda(111)>>>printresult112>>>
也可以用其他表达式:
>>>test=lambdaa:a**2>>>test_result=test(3)>>>printtest_result9>>>
从上面的例子可以看出,lambda后面表达式可以随意定义,只要符合Python的语法要求。
lambda表达式:
①用于处理简单逻辑
②会自动返回数据
三、内置函数map
map的作用是对序列中每个元素进行操作,然后输出新的序列
>>>num1=[10,9,8,7,6]>>>num2=map(lambdaa:a**2,num1)>>>printnum2[100,81,64,49,36]>>>>>>num3=[1,2,3,4,5]>>>num4=map(lambdaa,b:a-b,num1,num3)>>>printnum4[9,7,5,3,1]>>>
或者
>>>num=[12,33,55,85]>>>deffunc(arg):...returnarg+10...>>>new_num=map(func,num)>>>printnew_num[22,43,65,95]>>>
对于上述例子实质解释如下:
>>>new_num=[]>>>foriteminnum:...new_item=item+10...new_num.append(new_item)...>>>>>>printnew_num[22,43,65,95]
四、内置函数filter
filter的作用的是将序列中满足条件的过滤出来然后形成新的序列
>>>num1=[10,9,8,7,6]>>>tmp=filter(lambdaarg:arg>5,num1)>>>printtmp[10,9,8,7,6]>>>
或者
>>>tmp2=filter(lambdan:n>5,num1)>>>printtmp2[10,9,8,7,6]>>>
或者
#!/usr/bin/envpython#-*-coding:utf8-*-num=[11,22,0,33]printfilter(None,num)[root@Pythonday004]#pythonlam.py[11,22,33][root@Pythonday004]#[root@Pythonday004]#catlam.py#!/usr/bin/envpython#-*-coding:utf8-*-num=[11,22,0,33,""]printfilter(None,num)[root@Pythonday004]#pythonlam.py[11,22,33][root@Pythonday004]#catlam.py#!/usr/bin/envpython#-*-coding:utf8-*-num=[11,22,0,33,"",False]printfilter(None,num)[root@Pythonday004]#pythonlam.py[11,22,33]
小结:从上可以发现,默认情况下,当用filter进行处理数据时,filter会将布尔值为真的输出(一般将布尔值为True的返回到新列表中,反之不会返回到新列表中),为假的忽略掉;当然filter中也可以传入函数,如上例中的lambda语句;
五、内置函数reduce
reduce的作用是对序列内的所有元素进行操作
>>>num1=[10,9,8,7,6]>>>result=reduce(lambdaarg1,arg2:arg1+arg2,num1)>>>printresult40>>>num5=[1,2,3,4,5,6]>>>sum=reduce(lambdaa,b:a+b,num5)>>>printsum21>>>
# reduce的第一个参数,函数必须要有两个参数
# reduce的第二个参数,要循环的序列
# reduce的第三个参数,初始值
六、yield生成器(它可以记住上一次的操作,下次再执行时,继续执行)
#!/usr/bin/envpython#-*-coding:utf-8-*-deffunc():passreturn1return2return3result=func()printresult
执行以上代码,输出结果:
D:\Python27\python.exeC:/Users/ryan/PycharmProjects/day04/yield.py1Processfinishedwithexitcode0
发现函数返回的只有1,后面的2、3都没有返回,这里说明return语句结束后,代表函数体生命周期结束,接下来讲return替换成yield
#!/usr/bin/envpython#-*-coding:utf-8-*-deffunc():passyield1yield2yield3foriinfunc():printi
输出结果:
123
1、对比range和xrange的区别
有如下例子:
>>>printrange(8)[0,1,2,3,4,5,6,7]>>>printxrange(8)xrange(8)>>>
从上面可以发现,range和xrange的区别是:
range可以生成一个列表,即在内存中创建指定的数字,而xrange则不会,接着往下看:
>>>forninxrange(8):...printn...01234567>>>
xrange只有在进行循环的时候才会创建数字,即在迭代的时候才会去创建;
>>>defnrange(num):...temp=-1...whileTrue:...temp=temp+1...iftemp>=num:...return...else:...yieldtemp...>>>nrange(10)<generatorobjectnrangeat0x7fe42d0bd820>>>>
2、文件操作的read和xreadlines的区别
①read会读取所有内容到内存中
②xreadlines则只会在循环迭代时才获取数据
defNReadlines():withopen('log','r')asf:whileTrue:line=f.next()ifline:yieldlineelse:returnforiinNReadlines():printi
注:基于next自定义生成器NReadlines
defNReadlines():withopen('log','r')asf:seek=0whileTrue:f.seek(seek)data=f.readline()ifdata:seek=f.tell()yielddataelse:returnforiteminNReadlines():printitem
基于seek和tell自定义生成器NReadlines
七、装饰器
装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或者类,使用装饰器可以在函数执行前和执行后添加相应的操作
defwrapper(func):defresult():print'before'func()print'after'returnresult@wrapperdeffoo():print'foo'
importfunctoolsdefwrapper(func):@functools.wraps(func)defwrapper():print'before'func()print'after'returnwrapper@wrapperdeffoo():print'foo'
示例代码:
#!/usr/bin/envpython#coding:utf-8defBefore(request,kargs):print'before'defAfter(request,kargs):print'after'defFilter(before_func,after_func):defouter(main_func):defwrapper(request,kargs):before_result=before_func(request,kargs)if(before_result!=None):returnbefore_result;main_result=main_func(request,kargs)if(main_result!=None):returnmain_result;after_result=after_func(request,kargs)if(after_result!=None):returnafter_result;returnwrapperreturnouter@Filter(Before,After)defIndex(request,kargs):print'index'if__name__=='__main__':Index(1,2)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。