1.迭代器

  名词解释

  什么是迭代:迭代是一个重复过程,但是每次重复都是基于上一次的结果而继续的

  #下列循环只是单纯的重复,没有意义

  while True:

    print(1)

  #基于索引的迭代取值

  l = ['a'a,'b','c']

  i = 0

  while i <len(l):

    print(l[i])

    i+=1

  什么是迭代器:

    迭代取值的工具

2.为什么要用迭代器

迭代器

  1.优点:提供了一种不依赖索引的迭代取值方式

  2.更节省内存(每次只取一个值放到内存中使用,下次调用才会取下个值)

缺点:

  1.不如按照索引的取值方式灵活

  2.取值一次性的,只能往后取,无法预测值的个数

3.如何用迭代器

  可迭代对象:str、list、tuple\dict\set\文件对象

  但凡有__iter__方法的对象都称之为可迭代对象

  迭代器对象:文件对象

    既内置有__iter__方法又内置又__next__方法的对象都称之为迭代器对象

    (关键点:调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象)

用内置方法__next__ 可以取出迭代器的下一个值

上面iter_d拿到由d的内容产生的迭代器

但是当next取到最后一个值之后,继续next取值,就会报错,会抛出异常 StopIteration

d={'k1':111,'k2':222,'k3':333}

d={1,2,3,4,5}

iter_d = d.__iter__()  一般__下滑线开头的方法,满足一定条件时自动触发,最好不要这么用

可以用iter_d = iter(d) 来用,就相当于d.__iter__

next也一样

print(next(iter_d)) # 相当于iter_d.__next__()

print(len(d))

就相当于print(d.__len__())

print(iter.d.__iter__().__iter__().__iter__() is iter_d)

上面语句返回的是true,也就是说迭代器的iter返回值就是这个迭代器本身,只是python对于可迭代对象和迭代器对象不写两种实现方式了,所以都用相同的方法,返回都是迭代器

print(d.__iter__().__next__())

print(d.__iter__().__next__())

print(d.__iter__().__next__())

以上三条语句的返回值都一样,都是d产生的迭代器的第一个元素

while True:

  try:

    v = iter_d.next()

    print(v)

   except StopIteration:

    break

print('第二次取值‘)

#iter_d = d.__iter__()  # 没有这句的话,下面的第二次取值不会取到值,因为iter_d这个迭代器已经在上一次循环中取到末尾报异常结束了,如果不重置这个迭代器,就会继续报异常直接结束取值过程

while True:

  try:

    v = iter_d.__next__()

    print(v)

  except StopIteration:

    break

以上用try去捕捉异常的写法太麻烦了,其实for语句的底层机制就和上面的语句一样

for k in d:

  print(k)

for循环的底层原理

1.调用in后面那个值、对象的__iter__方法,拿到一个迭代器对象iter_obj

2.调用迭代器对象iter_obj.__next__()将得到的值返回值赋值给变量名k,循环往复直到取值完毕抛出异常StopIteration

3.捕捉异常结束循环

2.生成器

什么是生成器

生成器就是一个自定义的迭代器

如何得到生成器

  单反函数内出现yield关键字时,再去调用函数时不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即自定义的迭代器

#因为用return的话会直接返回值并且结束程序的运行

def func():

  print(‘first’)

  yield 1

  print(''second')

  yield 2

  print('third')

  yield 3

g = func()

print(g) #g是一个生成器对象

res1 = next(g)

print(res1)

res2 = next(g)

print(res2)

resa3 = next(g)

print(res3)

next(g) # 报错,没有值可以取了

总结 yield

1.提供了一种自定义迭代器的解决方案

2.yield&return

相同点:都可以返回值,返回值没有类型限制、个数限制

不同点: return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值

来用生成器模拟一个range函数

def calc(start,end,step = 1):

  while start < end:

    yield start

    start += step

a = calc(1,10,2) # 返回生成器对象

for i in a:

print(i) # for循环取出所有值

3. 函数的递归调用和二分法

  递归必须满足的两个条件:

    1.每进入下一次递归调用,问题的规模都应该有所减少

    2.递归必须有一个明确的结束条件

以下递归只是单纯的重复,没有意义

def func():

  print(1)

  print(2)

  print(3)

  func()

func()

def bar():

  print('from bar')

  foo()

def foo():

  print('from foo')

  bar()

foo()

  递归有两个明确的阶段

    1.回溯

    2.递推

如下面的例子

age(5) = age(4)+2

age(4) = age(3)+2

age(3) = age(2)+2

age(2) = age(1)+2

age(1) = 18

def age(n):

  if n == 1:

    return 18

  return age(n-1) + 2

print(age(5))

l=[1,[2,[3,[4,[5,[6,[7,[8,[9,[]]]]]]]]]]  

def func(list1):

  for item in list1:

    if type(item) is not list:

      print(item)

    else:

      func(item)

func(l)

二分法

顺序排列的数字中查找数字

nums=[1,2,3,4,5,6,7,8,9]

def search(nums,find_num):

  if len(nums) == 0:

    print('not exist')

    return

  mid = len(nums) // 2

  if nums[mid] > find_num:

    search(nums[:mid],find_num)

  elif nums[mid]<find_num:

    search(nums[mid+1:],find_num)

  else:

    print('get it')

search(nums,9)

day14 迭代器和生成器的更多相关文章

  1. python函数(5):迭代器和生成器

    迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...

  2. Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器

    Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...

  3. Python之模块,迭代器与生成器

    本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器:  ...

  4. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  5. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  6. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  7. 15.python的for循环与迭代器、生成器

    在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了.之所以拖到现在是因为for循环对前面讲过的序列.字典.集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手. 首先,for ...

  8. Python: 迭代器与生成器小结

    迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Itera ...

  9. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

随机推荐

  1. 《算法》第四章部分程序 part 18

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,在有权有向图中寻找环,Bellman - Ford 算法求最短路径,套汇算法 ● 在有权有向图中寻找环 package package01; impo ...

  2. Dagger2使用

    初衷 Dagger2的初衷就是通过依赖注入让你少些很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块.你可以在Debug包,测试运行包以及release包优雅注入三种不同的实现. 依赖注入 ...

  3. django之ReverseOneToOneDescriptor

    class ReverseOneToOneDescriptor(object): """ Accessor to the related object on the re ...

  4. element el-upload组件获取文件名

    组件的连接:http://element-cn.eleme.io/#/zh-CN/component/upload 需求:点x按钮,获取文件名传到后端服务,把文件从服务器删除 分析: 仔细看文档,会发 ...

  5. word中怎样设置页码包含总页数

    一个同事做毕业论文,论文是Word格式,1-2页是封面和目录,不需要页码,第3-10页是论文内容,需要从第1页开始显示,并显示论文内容的总页数8 页.具体为页脚处显示“第*页共*页”.他让我帮忙设置一 ...

  6. hadoop-1

    结合其他文章 http://weixiaolu.iteye.com/blog/1504898 https://www.cnblogs.com/dycg/p/3934394.html https://b ...

  7. CSS COLOR

    CSS COLOR Color Review We've completed our extensive tour of the colors in CSS! Let's review the key ...

  8. 几道关于springboot、springCloud的面试题。

    什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(propertites或yml文件) 创建独立的spring引用程序main方法运行 嵌入的tom ...

  9. 如何安全的在不同工程间安全地迁移asset数据?三种方法

    答:1.将Assets和Library一起迁移2.导出包package3.用unity自带的assets Server功能

  10. Pycharm 字体大小快捷方式设置

    1.File->Settings 2.在搜索框搜索increase 点击Increase Font Size(增大字体)右键选择 Add Mouse Shortcut 然后按Ctrl并且鼠标滚轮 ...