网络编程-协程-1、迭代器

知识点:什么叫迭代器?说起for遍历大家应该很熟悉,for i in xxx,in后面的对象是一个可迭代的对象,可迭代的对象不一定是迭代器,如列表,字典,字符串等这些都是可迭代对象,迭代器是调用了对象内部的__iter__方法和__next__方法,(不能说只要是迭代器就一定调用了__iter__和__next__,因为后面说到的生成器就不需要调用这俩个方法,而生成器是个特殊的迭代器)

1、代码示例,详情看注解:

"""需求:将一个类里面的列表通过迭代器方式打印出来"""
class Test1(object):
    def __init__(self):
        self.list = []
        self.flag = 0
    def add_num(self,num):
            self.list.append(num)

    def __iter__(self):  # 迭代器必须定义__iter__方法,这个方法是自动调用的,方法里面必须有个返回的对象,
                         # 这个对象调用__next__ 方法

        return self

    def __next__(self):  # 迭代器必须定义__next__方法,这个方法也是自动调用的,也必须有一个返回的对象,这个对象就是需求中列表中的值
        if self.flag < len(self.list):
            ret = self.list[self.flag]
            self.flag += 1
            return ret
        else:
            raise StopIteration  # 主动抛出异常,当列表的值取完之后,就会结束程序,不加这句代码会一直去取空值
# 创建迭代器对象,并向类表中添值
obj = Test1()  obj.add_num(‘张三‘)obj.add_num(‘李四‘)obj.add_num(‘王五‘)for i in obj:  # in后面此时不是可迭代对象了,是一个迭代器    print(i)

运行结果:张三李四王五
 

2、怎么判断for  ......in  ......的in后面的对象是不是一个可迭代对象或者是一个迭代器呢?用instance方法就可以去判断,看下面示例:

from collections import Iterator,Iterable

# Iterator迭代器,Iterable可迭代对象

a = [1, 2, 3, 4, 5]
print(isinstance(a, Iterable))  # instance方法里第一个参数是要判断的对象,第二个参数是判断是不是迭代器或者可迭代对象,根据自己需要去填
                                # 会返回一个bool值,True则是,False则不是,示例
                                # 示例判断是不是一个可迭代对象,返回了True

print(isinstance(a,Iterator))  # 判断是不是一个迭代器,返回了False

3、下面利用迭代器做一下菲波那切数列:

class Fibonaqie(object):
    def __init__(self,num):
        self.a, self.b = 0, 1
        self.num = num
        self.flag = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.flag < self.num:
            ret = self.a
            self.a, self.b = self.b, self.a+self.b
            self.flag += 1
            return ret
        else:
            raise StopIteration

obj = Fibonaqie(10)
for i in obj:
    print(i)

运行结果:0112358132134

原文地址:https://www.cnblogs.com/lz-tester/p/9390101.html

时间: 2024-11-02 14:51:00

网络编程-协程-1、迭代器的相关文章

17、第七周-网络编程 - 协程概念介绍、协程gevent模块并发爬网页

协程,又称微线程,纤程.什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置. 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销(注解:"原子操作(atomic operation)是不需要synchr

网络编程-----协程

概念: python的线程属于内核级别的,即由操作系统控制调度 (如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 单线程内开启协程,一旦遇到io,就会从应用程序级别 ( 而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关) 协程:  (简单来说就是单线程下的并发).    指的是只在同一条线程上能够相互切换多个任务, 遇到IO就切换实际上是我们利用协程提高工作效率的一种工作方式. 特点:  (纤程,轻型线程) 协程是操作系统级别的操作单位 协程

python网络编程--协程

1.协程 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.. 需要强调的是: 1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内

网络编程-协程-3、使用协程创建多任务图片下载

知识点: 1.爬取网站图片 import re from urllib import request import time,os headeers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'} url = 'http://699pic.com/food.html?sem=1&sem_k

python 并发编程 协程 目录

python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 原文地址:https://www.cnblogs.com/mingerlcm/p/11148935.html

并发编程协程(Coroutine)之Gevent

Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程. 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程. 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点:我们都可以把他们看做是一种执行流,执行流可以挂起,并且后面可以在你挂起的地方恢复执行,这实际上都可以看做是con

python并发编程&amp;协程

0x01 前导 如何基于单线程来实现并发? 即只用一个主线程(可利用的cpu只有一个)情况下实现并发: 并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 1)其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多

并发编程--协程

协程,又称为微线程,可以理解成可切换的函数,或生成器,协程中始终在单线程中执行,因此没有资源冲突问题,不需要锁机制.以下以菲波那切数列为例,加上自己的一些理解,稍微聊一下这个东西. 斐波那契数列的普通实现 一般的函数只能有一个返回值,return,且return后程序不再执行.如下: # 斐波那契数列的普通实现 def fib(n): res = [0] * n index = 0 a = 0 b = 1 while index < n: res[index] = b a, b = b, a+b

并发编程——协程

协程: 基于单线程来实现并发. 协程并不是实际存在的实体,本质上是一个线程的多个部分. 比线程的单位更小--协程,纤程,在一个线程中可以开启很多协程. 在执行程序的过程中,遇到 IO 操作就冻结当前位置的状态,去执行其他任务,在执行其他任务的过程中,会不断地检测上一个冻结的任务是否 IO 结束,如果 IO 结束了,就继续从冻结的位置开始执行. 一个线程不会遇到阻塞--一直在使用CPU. 多个线程--只能有一个线程使用CPU. 协程比线程之间的切换和线程的创建销毁所花费的时间,空间开销要小的多.