三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器

  1. 云栖社区>
  2. 博客>
  3. 正文

三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器

技术小胖子 2017-11-09 18:22:00 浏览625
展开阅读全文

一、三元运算(式)

对于一般简单的if else条件判断句可以用三元运算来表示

具体模式为:

1
2
3
4
5
6
if condition:
  expr1
else:
  expr2
等价于:
expr1 if condition else expr2


解释:如果if condition条件成立就执行expr1表达式,否则就执行else expr2表达式

示例①

1
2
3
4
5
6
7
8
9
>>> if 2 == 2:
...    name = 'cool'
... else:
...    name ='hot'
... 
>>> name = 'cool' if 2==2 else 'hot'
>>> print name
cool
>>>



二、lambda表达式:

对于简单的函数可以用另外一种方式来代替,即lambda

比如有如下函数:

1
2
3
4
5
6
7
8
>>> def fun(arg):
...      return arg + arg
... 
>>> 
>>> result = fun(100
>>> print result
200
>>>

定义一个变量f_lambda,将lambda arg:arg+1赋予f_lambda

1
2
3
4
5
>>> f_lambda = lambda arg:arg +1
>>> result = f_lambda(111)
>>> print result
112
>>>

也可以用其他表达式:

1
2
3
4
5
>>> test = lambda a:a**2
>>> test_result = test(3)
>>> print test_result
9
>>>

从上面的例子可以看出,lambda后面表达式可以随意定义,只要符合Python的语法要求。

lambda表达式:

①用于处理简单逻辑

②会自动返回数据


三、内置函数map


map的作用是对序列中每个元素进行操作,然后输出新的序列


wKiom1Zv323R8pKhAABLX8BNk2A769.png


1
2
3
4
5
6
7
8
9
10
>>> num1 = [10,9,8,7,6]
>>> num2 = map(lambda a:a**2,num1)
>>> print num2
[10081644936]
>>> 
>>> num3 = [1,2,3,4,5]
>>> num4 = map(lambda a,b:a -b,num1,num3)
>>> print num4
[97531]
>>>

或者

1
2
3
4
5
6
7
8
>>> num = [12,33,55,85]
>>> def func(arg):
...     return arg + 10
... 
>>> new_num = map(func,num)
>>> print new_num
[22436595]
>>>


对于上述例子实质解释如下:

1
2
3
4
5
6
7
8
>>> new_num = []
>>> for item in num:
...     new_item = item + 10
...     new_num.append(new_item)
... 
>>> 
>>> print new_num
[22436595]


四、内置函数filter

filter的作用的是将序列中满足条件的过滤出来然后形成新的序列

wKioL1Zv4LDiFtx1AABLGudR8bc619.png

1
2
3
4
5
>>> num1 = [10,9,8,7,6]
>>> tmp = filter(lambda arg:arg >5,num1) 
>>> print tmp
[109876]
>>>

或者

1
2
3
4
>>> tmp2 = filter(lambda n:n >5,num1)     
>>> print tmp2
[109876]
>>>

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding:utf8 -*-
num = [11,22,0,33]
print filter(None,num)
[root@Python day004]# python lam.py 
[112233]
[root@Python day004]
[root@Python day004]# cat  lam.py    
#!/usr/bin/env python
# -*- coding:utf8 -*-
num = [11,22,0,33,""]
print filter(None,num)
[root@Python day004]# python lam.py  
[112233]
[root@Python day004]# cat  lam.py   
#!/usr/bin/env python
# -*- coding:utf8 -*-
num = [11,22,0,33,"",False]
print filter(None,num)
[root@Python day004]# python lam.py  
[112233]

小结:从上可以发现,默认情况下,当用filter进行处理数据时,filter会将布尔值为真的输出(一般将布尔值为True的返回到新列表中,反之不会返回到新列表中),为假的忽略掉;当然filter中也可以传入函数,如上例中的lambda语句;


五、内置函数reduce

reduce的作用是对序列内的所有元素进行操作

wKiom1Zv-FeDbhPIAABu1x9ZUok939.png



1
2
3
4
5
6
7
8
9
>>> num1 = [10,9,8,7,6]                  
>>> result =reduce(lambda arg1,arg2:arg1+arg2,num1)
>>> print result
40
>>> num5 = [1,2,3,4,5,6]  
>>> sum = reduce(lambda a,b:a+b,num5)
>>> print sum
21
>>>

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

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

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


六、yield生成器(它可以记住上一次的操作,下次再执行时,继续执行)

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func():
    pass
    return 1
    return 2
    return 3
result = func()
print result


执行以上代码,输出结果:

1
2
3
D:\Python27\python.exe C:/Users/ryan/PycharmProjects/day04/yield.py
1
Process finished with exit code 0

发现函数返回的只有1,后面的2、3都没有返回,这里说明return语句结束后,代表函数体生命周期结束,接下来讲return替换成yield

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func():
    pass
    yield 1
    yield 2
    yield 3
for in func():
    print i



输出结果:

1
2
3
1
2
3


1、对比range和xrange的区别

有如下例子:

1
2
3
4
5
>>> print range(8)
[01234567]
>>> print xrange(8)
xrange(8)
>>>

从上面可以发现,range和xrange的区别是:

range可以生成一个列表,即在内存中创建指定的数字,而xrange则不会,接着往下看:

1
2
3
4
5
6
7
8
9
10
11
12
>>> for in xrange(8):
...     print n
... 
0
1
2
3
4
5
6
7
>>>

 

xrange只有在进行循环的时候才会创建数字,即在迭代的时候才会去创建;

1
2
3
4
5
6
7
8
9
10
11
12
>>> def nrange(num):
...     temp = -1   
...     while True:
...          temp = temp +1
...          if temp >= num:
...              return
...          else:
...              yield temp
... 
>>> nrange(10)
<generator object nrange at 0x7fe42d0bd820>
>>>


2、文件操作的read和xreadlines的区别

①read会读取所有内容到内存中

②xreadlines则只会在循环迭代时才获取数据

1
2
3
4
5
6
7
8
9
10
def NReadlines():
    with open('log','r') as f:
        while True:
            line = f.next()
            if line:
                yield line
            else:
                return
for in NReadlines():
    print i

注:基于next自定义生成器NReadlines

1
2
3
4
5
6
7
8
9
10
11
12
13
def NReadlines():
    with open('log','r') as f:
        seek = 0
        while True:
            f.seek(seek)
            data = f.readline()
            if data:
                seek = f.tell()
                yield data
            else:
                return
for item in NReadlines():
    print item


基于seek和tell自定义生成器NReadlines


七、装饰器

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

1
2
3
4
5
6
7
8
9
10
def wrapper(func):
    def result():
        print 'before'
        func()
        print 'after'
    return result
  
@wrapper
def foo():
    print 'foo'


1
2
3
4
5
6
7
8
9
10
11
import functools
def wrapper(func):
    @functools.wraps(func)
    def wrapper():
        print 'before'
        func()
        print 'after'
    return wrapper
@wrapper
def foo():
    print 'foo'


示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
#coding:utf-8
  
def Before(request,kargs):
    print 'before'
      
def After(request,kargs):
    print 'after'
  
  
def Filter(before_func,after_func):
    def outer(main_func):
        def wrapper(request,kargs):
              
            before_result = before_func(request,kargs)
            if(before_result != None):
                return before_result;
              
            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result;
              
            after_result = after_func(request,kargs)
            if(after_result != None):
                return after_result;
              
        return wrapper
    return outer
      
@Filter(Before, After)
def Index(request,kargs):
    print 'index'
      
      
if __name__ == '__main__':
    Index(1,2)



      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1726976,如需转载请自行联系原作者




网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注