# 如何实现可迭代对象和迭代器对象

什么是可迭代对象和迭代器对象

区分一下容器的概念

容器是用来储存元素的一种数据结构,它支持隶属测试,容器将所有数据保存在内存中,在Python中典型的容器有:

  • list, deque, …
  • set,frozesets,…
  • dict, defaultdict, OrderedDict, Counter, …
  • tuple, namedtuple, …
  • str

迭代器

for _ in x: pass
这里x是可迭代对象

迭代器本质上是一个产生值的工厂,每次向迭代器请求下一个值,迭代器都会进行计算出相应的值并返回。

那么什么是迭代器呢?任何具有__next__()方法的对象都是迭代器,对迭代器调用next()方法可以获取下一个值。而至于它使如何产生这个值的,跟它能否成为一个迭代器并没有关系。

使用方法:

# for _ in x 实际调用也是用iter, iter(x) next(iter)iter1 = iter(x)
print(next(iter1))
print(next(iter1))
print(next(iter1))from itertools import count
counter = count(start=13)
next(counter)
next(counter)

“用时访问”的策略

“用时访问”的策略也就是说用到的时候,才生成对象,而不是提前生成对象放在内存里

举个例子:

for i in range(100000):print(i**i)

这个程序先生成了长度为100000的列表,然后再慢慢进行计算,这样不仅生成列表有延迟,也会占有大量内存。解决方法就是可迭代对象

自己实现可迭代对象和迭代器对象

  1. 自己写的在https://www.tianqi.com/ 获取城市温度的一个爬虫

    import requestsdef getWeather(city):# 根据城市生成urlurl = 'https://www.tianqi.com/'url += citytry:print('try reading from %s' % url)# 增加header 模拟浏览器访问headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '}response = requests.get(url, headers = headers, timeout = 30)response.raise_for_status()response.encoding = response.apparent_encodingprint('finished reading from web')# 使用美丽汤找到天气数据from bs4 import BeautifulSoupsoup = BeautifulSoup(response.text, features='html.parser')weather = soup.find(attrs={'class' : 'weatherbox'}).find('span')return weather.textexcept:pass# 打印结果
    print(getWeather('shanghai'))
    print(getWeather('beijing'))

    ### output
    try reading from https://www.tianqi.com/shanghai finished reading from web 小雨转多云6 ~ 10℃ try reading from https://www.tianqi.com/beijing finished reading from web 多云-4 ~ 7℃

  2. 实现上面爬虫的可迭代

    from collections import Iterable, Iterator
    import requestsclass WeatherIterator(Iterator):"""一个迭代器对象, 返回城市的天气,只有在用的时候才会开始爬虫,不需要先爬虫才能迭代"""def __init__(self, cities):self.cities = citiesself.index = 0def __next__(self): # 继承Iterator后, 需要实现的方法if self.index >= len(self.cities):raise StopIterationelse:temp_city = self.cities[self.index]self.index += 1return self.get_weather(temp_city)def get_weather(self, city):url = 'https://www.tianqi.com/'url += citytry:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '}response = requests.get(url, headers = headers, timeout = 30)response.raise_for_status()response.encoding = response.apparent_encodingfrom bs4 import BeautifulSoupsoup = BeautifulSoup(response.text, features='html.parser')weather = soup.find(attrs={'class' : 'weatherbox'}).find('span')return ('%s: %s' % (city, weather.text))except:passclass WeatherIterable(Iterable):"""一个可迭代对象"""def __init__(self, cities):self.cities = citiesdef __iter__(self):return WeatherIterator(self.cities)

    使用效果

    >>> cities = ['shanghai', 'beijing', 'nanjing']
    >>> for i in WeatherIterable(cities):
    >>>     print(i)
    shanghai: 多云8 ~ 15℃beijing: 多云-4 ~ 3℃nanjing: 大雨4 ~ 8℃

转载于:https://www.cnblogs.com/wangjiale1024/p/10338864.html

如何实现 迭代器 可迭代对象 (2.1)相关推荐

  1. uniapp对象怎么获取值_第65p,关于:生成器、迭代器与迭代对象(上)

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第65篇文章,第三阶段的课程:Python进阶知识:生成器.迭代器与迭代对象. 一.什么是可迭代对象? 迭代是一个重复的过程,迭代每 ...

  2. python 生成器对象_Python 生成器, 迭代器, 可迭代对象的区别

    1.可迭代对象 在python中, 一切皆对象, 但凡是可以用for循环进行遍历取值的对象都可以称之为可迭代对象, 可迭代对象在程序的一个执行周期中,可以无限轮次的进行循环遍历 2.迭代器 a.一个可 ...

  3. 玩转Python中迭代器与迭代对象的使用与演示

    0.什么是迭代器(iterator)与迭代对象? 比如:python中的集合数据类型,如 list . tuple . dict . set . str 等,我们可以使用for遍历其中的每个元素,此外 ...

  4. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  5. python 函数可以作为容器对象的元素_11.Python初窥门径(函数名,可迭代对象,迭代器)...

    python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  6. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  7. Python基础9——可迭代对象

    17可迭代对象 list 是一个迭代对象 可以通过 for - in - 这类语句遍历读取数的对象称之为可迭代对象 li = [1,2,3]for i in li:print(i) 17.1 什么是可 ...

  8. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  9. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  10. 怎么确定迭代器后面还有至少两个值_JS Lazy evaluation:可迭代对象与迭代器

    本文已经过原作者 MelkorNemesis 授权翻译. Lazy evaluation Lazy evaluation常被译为"延迟计算"或"惰性计算",指的 ...

最新文章

  1. http2-stream-optima-prioritation
  2. LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]
  3. 用WebCollector爬取新浪微博数据
  4. 用计算机自我介绍,计算机个人简历:计算机专业简历自我介绍【四篇】供参考使用(5页)-原创力文档...
  5. java网络编程与分布式计算_Java网络编程与分布式计算
  6. Jquery 操作select总结
  7. 理解Servlet及其对象
  8. 操作系统中ESP和MSR分区
  9. 同步十进制加法计数器设计
  10. [应用推荐]FreeMind自动生成系统盘的树状图(思维导图)
  11. NPDP产品经理小知识-质量功能展开和质量屋
  12. 工业智能机器人数量缺口大 核心技术要突破!
  13. 系统集成资质培训 - 挣值分析题目分析
  14. [pandas] DataFrame 取指定列为某些值的行
  15. “协作3.0”不是玩概念,科天云让企业应用场景更多彩
  16. 墨尘目标检测4--yoyo3模型解析及训练自己的数据集
  17. nexues vpc 角色切换,引起staick 重置引起业务中断问题
  18. 饮食健康会促进心理健康
  19. (附源码)计算机毕业设计SSM音乐推荐系统
  20. c语言 链表 无头结点,C++ 单链表(无头结点)

热门文章

  1. 正则表达式 两个符号的字段_Tableau正则提取字段部分内容
  2. 4.2创建自定义Spring Boot自动配置Starter
  3. Prototype使用$w()函数
  4. [渝粤教育] 西南科技大学 高速铁路线路与车站 在线考试复习资料
  5. 19年春第十五周学习
  6. Let’s to be a bug-free programmer
  7. 简单的excel上传解析和错误反馈信息下载
  8. 商店管理系统——小组分工及索引卡
  9. OC @class关键字
  10. 性能测试中容易混淆的概念