迭代对象、迭代器、生成器

1.容器

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个获取,可以用in ,not in关键字判断元素是否包含在容器中。(容器是一系列元素的集合)
常见的容器对象有:
1.list, deque
2.set
3.dict
4.tuple
5.str
6.file 、socket

尽管大多数的容器都提供了一种方式来获取其中的每一个元素,但是这并不是容器本身提供的能力。而是有可迭代对象赋予了容器这种能力。
并把不是所有容器都是可以迭代的,例:Bloom fiter(布隆过滤器压根就没有把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中)

2.可迭代对象

很多容器都是迭代对象。凡是可以返回一个迭代器的对象,都可称为迭代对象。

3.迭代器

迭代器是一个带有状态的对象,能在你调用next()方法时,返回容器的下一个值。iter返回迭代器自身,next返回容器的下一个值。如果没有更多元素,就会抛出Stoplteration异常。

迭代器持有一个内部状态的字段,用于记录下次迭代返回值。它实现了Next和iter方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。

迭代器只有被调用时才会生成值并返回。没有被调用时就处于休眠状态,等待下一次调用。

4.生成器

生成器是特殊的迭代器,只需要一个关键字。生成器一定是迭代器(反之不成立)。它的返回值不是用过return而是yield。

例生成斐波那契f数列
from itertools import islice
def fib():
	pre, curr = 0, 1
	while True:
		yeild curr
		pre, curr = curr . curr + pre
f = fib()
list(islice(f, 0 ,10))

作用:使用生成器表达式取代列表解析可以同时节省 cup和内存。
可以自动创建饭噶房和保存程序状态之外,当生成器终结时,还自动抛出Stopiteration异常。

5.生成器表达式

生成器表达式是列表推倒式的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表。

例
a = ( x * x for x in range())
print(sum(a))      #285

代替for循环的方法:

1.列表解析

 squares = [ ]
  for value in range(1, 11):

可以用一下代码代替:

squares = [ value ** 2 for value in range(1 , 11)]

2.利用map函数,操作列表中的每一个元素
基本语法:map(function, iterable, …)
其中function为函数;iterable为list;py3返回一个迭代器.
如果map函数第一个参数为None,效果相当于Zip函数。

 例 : squares = list(map (lamdba x: x**2, range(1, 11)))
 3.利用fiter函数,过滤列表中所有的元素
 filter函数基本语法:
 ```
 filter(function, iterable)
 ```

注意:这里只能有一个迭代对象(fiter的返回值也是迭代器,而非列表,故需要强制转化)
fiter函数本质为,依次判断迭代对象中的每个True 的元素
当function为None时,返回的是迭代对象中的每个True的元素。

例子:
def is_odd(n):
	retrn n % 2 == 1
newlist = list(fiter(is_odd, [1, 2, 3,4 , 6]))

4.利用reduce函数
基本语法:

reduce(function, iterable[, initalizer])

function为函数, iterable为迭代对象,initalizer为初始参数
reduce函数的本质:将function应用于迭代对象的前两个元素,得道德结果在与下一个元素进行function运算,以此类推。

例:
 reduce(lamdba x,y : x+y, [1, 2,3, 4, 5,6])

匿名函数:

使用lambda来创建匿名函数。

  • 是一个表达式,比函数体简单
  • 拥有自己的命名空间,且不能访问自己参数列表之外或者全局命名空间的参数。
  • 不同与c/c++的内联函数,其主要目的是调用小函数时不占用栈空间从而增加运行效率。
语法:
lambda [arg1,[arg2, ....]] : expression
#由于lambda返回的是函数对象,所以需要定义一个变量去接受。

例:

sum = lambda a ,b: a + b
sum (10, 20 ) # 30

优点:
1.使用匿名函数让代码更精简,更易理解。
2.不考虑不重复使用的函数的命名问题

高级函数:
map函数 、 reduce函数、fiter函数、sorted函数
sort函数
对所有的可迭代对象进行排序。
语法:

sorted(iterable[, cmp [, key[ , reverse] ] ] ) 
iterable:可迭代对象
cmp: 比较函数,具有两个参数可以从可迭代对象中取出,取出的规则大于返回1, 小于为-1, 等于为0.
key: 主要用来进行比较元素,只有一个参数,参数来自可迭代对象。并以这个元素来进行排序。
reverse: 排序规则,reverse = True 降序,否则升序。

猜你喜欢

转载自blog.csdn.net/Program_life_1/article/details/84971536