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

简介:

一、三元运算(式)

对于一般简单的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
[ 100 81 64 49 36 ]
>>> 
>>> num3  =  [ 1 , 2 , 3 , 4 , 5 ]
>>> num4  =  map ( lambda  a,b:a  - b,num1,num3)
>>>  print  num4
[ 9 7 5 3 1 ]
>>>

或者

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
[ 22 43 65 95 ]
>>>


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

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
[ 22 43 65 95 ]


四、内置函数filter

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

wKioL1Zv4LDiFtx1AABLGudR8bc619.png

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

或者

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

或者

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 
[ 11 22 33 ]
[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  
[ 11 22 33 ]
[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  
[ 11 22 33 ]

小结:从上可以发现,默认情况下,当用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 )
[ 0 1 2 3 4 5 6 7 ]
>>>  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,如需转载请自行联系原作者




相关文章
|
2月前
|
存储 JavaScript 前端开发
c++lambda函数与表达式
c++lambda函数与表达式
9 1
|
5月前
|
Python
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
|
9月前
|
索引
reduce的介绍及用法
reduce的介绍及用法
55 0
|
存储 算法 编译器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
|
JavaScript
辅助函数和高阶函数 map、filter、reduce
辅助函数和高阶函数 map、filter、reduce
115 0
|
JavaScript 前端开发
JavaScript高阶函数遍历迭代对象与数组,forEach,map,filter,reduce
JavaScript高阶函数遍历迭代对象与数组,forEach,map,filter,reduce
165 0
|
分布式计算 Python
Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
1529 0
|
分布式计算 Python
Python函数式编程map()、reduce()
一、map() 格式:map(func, *iterables) map函数接受两个参数,第一个是要执行的函数,第二个是可迭代对象,可迭代对象可以传入多个参数。
915 0
|
Python
lambda函数常见用法
# lambda 参数:返回值/表达式 # print((lambda :100)()) # f = lambda a,b : a + b # print(f(10, 20)) # f = lambda a,b,c=100: a + b + c # print(f(10, 20,200)) ...
994 0
|
Java Kotlin
Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......)
一、ForEach 类型于Java的传统的写法 package net.println.kotlin.chapter5.
10072 2