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. Linux:常用命令【转载】

    转载于:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架 ...

  2. winform 之MDI容器

    MDI是指将多控件窗体在同一窗体中打开 1.设置:属性中IsMDIContainer:true; 窗体变为灰色成为MDI窗体容器 2.MDI中一般采用菜单作为打开方式 3.子级窗体在MDI中打开,需先 ...

  3. MySQL PID错误,Mysql server PID file could not be found!

    https://blog.csdn.net/u010098331/article/details/50752667/

  4. Android ADB 基本命令

    ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootl ...

  5. PHP 扩展在 Linux(centos7)系统下的编译与安装 以 mysqli 为例

    (操作系统 Centos7,环境版本 php7) 01,进入到 PHP 解压后的源码包的的 ext 文件夹 02,查看是否存在 mysqli 扩展 => ls, 如果不存在需要去响应网站下载 ( ...

  6. python linux 下开发环境搭建

    1.1: 在虚拟环境目录下安装 ipython  => pip install ipython 1.2: 简单的使用 => ipthyon => print("heollo ...

  7. 01.VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  8. Spring Cloud (6)A config 服务端配置 与github通信

    1. 在git上创建一个库,并复制库地址 2.用git clone项目到本地,并创建application.yml application.yml 内容 --下一步 3.将application.ym ...

  9. ESXi 上创建CentOS虚拟机

    之前介绍了ESXi上添加存储.本篇介绍一下在ESXi上创建CentOS虚拟机. 方法/步骤   登陆ESXi,选择“创建/注册虚拟机” 选择“创建新的虚拟机” 给装的虚拟机命名,并选择操作系统及版本 ...

  10. 如何禁用Firefox,chrome浏览器“不安全密码警告”

    在任何HTTP页面中,一个全新的“不安全密码警告”将会在用户点击表单时直接出现在登陆框的下方,强行保证所有用户都能看到“此链接不安全,你的个人利益将受到损害”等字眼,同时整个页面也会收到损坏的挂锁图标 ...