一、三元运算(式)

对于一般简单的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)