三元运算式、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,如需转载请自行联系原作者




相关文章
|
9月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
500 2
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
644 154
|
JavaScript 前端开发
js map和reduce
js map和reduce
|
数据处理 Python
Pandas中的map函数应用
Pandas中的map函数应用
225 2
WK
|
Python
map函数
在Python中,`map()` 是一个内置的高阶函数,接受一个函数和一个或多个可迭代对象作为参数,将指定函数应用于每个元素,并返回包含应用结果的迭代器。若有多个可迭代对象,其元素会并行地传递给函数。`map()` 返回一个迭代器,需用 `list()` 转换。在Python 3中,`map()` 返回迭代器而非列表,并支持 `lambda` 表达式,适用于多种应用场景。注意,当输入的可迭代对象长度不同时,结果仅包含最短对象的长度。
WK
850 2
WK
|
Python
map和filter的区别是什么
`map()`和`filter()`均为Python中的高阶函数,前者针对可迭代对象中的每个元素执行指定操作,如数值翻倍或字符串转大写;后者则筛选出符合条件的元素,例如仅保留偶数或非空字符串。两者均返回迭代器,并可通过`list()`等函数转换为所需的数据结构。具体使用时,应依据实际需求和场景选择合适的函数。
WK
463 1
WK
map和filter的区别是什么
在编程中,`map` 和 `filter` 是处理数组或集合时常用的两个函数。`map` 用于将每个元素通过指定函数转换后生成新的数组,而 `filter` 则根据条件筛选出符合条件的元素组成新数组。两者的主要区别在于:`map` 的返回数组长度与原数组相同,但元素被转换;`filter` 的返回数组长度可能不同,只包含符合条件的元素。
WK
695 2
|
JavaScript 前端开发
JavaScript 中 五种迭代数组的方法 every some map filter forEach
本文介绍了JavaScript中五种常用数组迭代方法:every、some、filter、map和forEach,并通过示例代码展示了它们的基本用法和区别。
|
安全 Java 数据库连接
让我们讲解一下 Map 集合遍历的方式
我是小假 期待与你的下一次相遇 ~
422 43

热门文章

最新文章