人生总是要折腾一下的

python成长之路第三篇(3)_内置函数及生成器迭代器

打个广告欢迎加入linux,python资源分享群群号:478616847

目录:

 

1、lambda表达式

2、map内置函数

3、filter内置函数

4、reduce内置函数

5、yield生成器  

6、迭代器

    

一丶lambda表达式

什么是lambda表达式?其实我们了解过三元运算就很容易了解lambda表达式,三元运算是来简写简单的if语句的那么lambda就是来简写简单的函数的

(1)例子下面是一个简单的函数

 1 def f1(a):
 2 return a+1
 3 #这个函数只是做了简单的加法运算传入一个值,然后计算后返回值
 4 
 5 那么用lambda表达式怎么写呢?
 6 
 7 f1 = lambda a:a+1
 8 #只需要写这么一行就好了
 9 正常调用方法跟正常函数调用方法一 
10 c = f1(1) 
11 print(c)
简单函数

(2)多参数,动态参数

在正常的函数中我们发现我们传入的值是可以传入多个值的也可以写动态形参,那么对于lambda表达式也是考虑到了这么一点我们来看看下面的几个例子

#多参数

f1 = lambda a,b:a+b
c = f1(1,2)
print(c)

#动态参数

f1 = lambda *a:a[0]+a[1]
c = f1(1,2)
print(c)

行了接下来就不掩饰了我们来总结一些lambda表达式的特点

  • 用于处理简单的逻辑
  • 自动返回值

二、map内置函数

接下来我们来学习一下map函数,map函数主要用于处理序列的每一个元素,我们知道要写这样的需求我们可以使用for循环来去实现,map的内部也是这么做的下面我们来看一下

(1)使用方法1

:在python2.7环境中返回的是一个列表而在3系版本中返回的是一个迭代器

1 lis = [1,2,3,4,5,6]
2 def f1(a):
3     return a+1
4 new_lis = map(f1,lis)
5 print(new_lis)
使用方法一

我们来解释一下上面的代码,首先我们定义了一个列表,和一个函数,那么map函数传入的参数第一个就是fi这个函数,第二个值就是lis这个列表,所以呢map处理的方法就是讲lis的值传入函数f1处理

(2)使用方法2

如果我们有另外的需求就是想要两个或更多的列表的值进行相加那么我们可以这么写

1 lis1 = [1,2,3,4,5,6]
2 
3 lis2 = [1,2,3,4,5,6] 
4 def f1(a,b): 
5      return a+b 
6 new_lis = map(f1,lis1,lis2) 
7 print(new_lis)
8 
9 #注意两个列表中的值的个数要是一样的
使用方法2

三、filter内置函数

filter,就是过滤他的处理方式把符合的值拿出来不符合的不要

filter(function_or_none, sequence)

我们看一下这里filter接收的值可以是函数也可以是none,接着跟列表,那么filter接收none是什么效果呢

(1)使用方法1

:在python2.7环境中返回的是一个列表而在3系版本中返回的是一个迭代器

lis = [1,2,3,4,5,6,'',False]

print (filter(None,lis))

#我们发现空值和false都过滤掉了由此可知None是过滤空值和假值的

(2)使用方法2

需求我们需要过滤出大于3的值就可以以下这么写

lis = [1,2,3,4,5,6]
def f1(a):
return a>3
print (filter(f1,lis))

四、reduce内置函数

reduce函数来做累积的操作,他最少接收两个值,因为进行累积需要一个数处理另一个数

使用方法:

lis = [1,2,3,4,5,6]
def f1(a,b):
return a+b
print (reduce(f1,lis))

当我们也可以做其他的操作也可以

五、yield生成器

我们知道使用range(10)可以直接生成一个0到9 的列表而用xrang(10)返回的是一个迭代器,在上面的篇幅

中也提到过迭代器,那么迭代器需要使用for来取值,那么他的内部结构就是用yield来做的,也就是一次返回一个值

1 def f1():
2     for i in range(1,5):
3         yield i
4 a  = f1()
5 print a
yield

我们从这个例子发现结果不是我们想要的,是一个迭代器<generator object f1 at 0x00000000025E46C0>

那么我们用for来显示一下

1 def f1():
2     for i in range(1,5):
3         yield i
4 
5 while True:
6     for i in f1():
7         raw_input()
8         print i
9     break
yield

我们将上面的代码使用pycharm使用调试模式来看看主要这里有raw_input()在调试模式下要打开控制台输入回车哦

看下图,每次for循环就会从yield取值然后返回给下面

image

六、迭代器

迭代器概述

迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。

迭代器的缺点:

(1)迭代器不能回退去取原来的元素,只能往前进行迭代。(当然这个缺点也不算是什么缺点因为我们基本上不会这么做)

(2)迭代器也不是线程安全的,在多线程环境中对可变集合使用迭代器是一个危险的操作。

迭代器的优点:

(1)对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值,但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。

(2)迭代器的另一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。这样在遍历一个庞大的集合时比如几个G的那么可以大大节省空间,这种特点被称为延迟计算或惰性求值(Lazy evaluation)。

使用迭代器:

(1)iter(iterable)使用内建的函数iter(iterable)可以获取迭代器对象:

lis = range(3)
it = iter(lis)
print (it)

(2)使用next()方法可以访问下一个元素:

1 lis = range(3)
2 it = iter(lis)
3 print (it)
4 print (it.next(),next(it))
5 #第一个方法是调用迭代器内置方法,第二种方法是使用内置函数在python 2.6以上版本
访问元素
  当我们取完值后想要继续取值就会抛出StopIteration异常,这正是python根据是否检测到这个异常来决定是否停止迭代的

  Traceback (most recent call last): 
    File "E:/pycharm/exercise/����/labda.py", line 17, in <module> 
      print (it.next(),next(it),it.next(),it.next()) 
  StopIteration

posted @ 2016-03-07 16:46  北京-小远  阅读(751)  评论(0编辑  收藏  举报