切记:Python迭代器只可以读取一次,忽略会有意想不到的麻烦。

news/2024/5/19 2:06:33/文章来源:https://blog.csdn.net/m0_57158496/article/details/127137871

Python 官网: https://www.python.org/
- ###### Free:大咖免费“ 圣经”教程 《 python 完全自学教程》,不仅仅是基础那么简单……
  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、老齐教室

  自学并不是什么神秘的东西 ,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。            —— 华罗庚
等风来,不如追风去……


切记:Python迭代器iterator
只可以读取一次
(不然会有意想不到的麻烦)


目 录

    1. 一个小bug
    1. 看似无恙的代码,却得不到想要的结果
    1. 排查bug
    1. 消亡bug
    1. 感悟

  我升级迭代我的Color工具,想让她兼容“颜色控制码”和“英文单词颜色描述”。我不想要一个个敲英文“单词->控制码”一一对应的字典键值对,打算用代码生成。这样子我的代码中就不存在字典,字典是在每次加载Color工具时时生成在机器内存中,这样子是不是感觉代码很“高大”。🤪🤪😜😜
  但这代码编写中,遇到了一个bug——当用“|”运算符联接字典时,却始终少一部分内容。(当花费一天一夜的“闲暇”时光理清后才晓得,这是被“一不注意”就会忽略掉的“小问题”。😁😁)
  为能警醒自己,特意记个笔记。也为有幸阅读此笔记的小伙伴,提个醒,别跟我一样白白浪费大好时光。


回页首

看似无恙的代码

def __create_dict(self):''' 创建颜色名称字典color dict。'''color_names = 'black red green yellow blue magenta cyan white'.split()back_color_names = (f"b_{i}" for i in color_names)fore_colors = dict(zip(color_names, (f"3{i}" for i in range(8))))light_fore_colors = dict(zip((f"l_{i}" for i in color_names), (f"9{i}" for i in range(8))))other_fore_colors = dict(zip((f"{i}" for i in 'dark inky atramentous flammulated grassy xanthic blove cerulean purple violescent violaceous albicans gray'.split()), (30, 30, 30, 31, 32, 33, 34, 34, 35, 35, 35, 37, 90)))back_colors = dict(zip(back_color_names, (f"4{i}" for i in range(8))))light_back_colors = dict(zip((f"l{i}" for i in back_color_names), (f"10{i}" for i in range(8))))other_back_colors = dict(zip((f"b_{i}" for i in 'dark  inky atramentous flammulated grassy xanthic blove cerulean purple violescent violaceous  albicans gray'.split()), (40, 40, 40, 41, 42, 43, 44, 44, 45, 45, 45, 47, 100)))style = dict(zip((f"s_{i}" for i in 'off_all bright dim incline inclined underline emphasize overstriking inverse blanking strickout normal blank nothing'.split()),(0, 1, 2, 3, 3, 4, 5, 5, 7, 8, 9, 22, 22, 22)))# 用Python新版本字典+运算符“|”依次联接前景、背景和特殊效果样式字典。return fore_colors | light_fore_colors | other_fore_colors | back_colors | light_back_colors | other_back_colors | style

  这段代码看不出啥毛病,但生成的字典,却少了高亮背景色(light_back_colors)那一段。

代码生成的字典

{‘black’: ‘30’, ‘red’: ‘31’, ‘green’: ‘32’, ‘yellow’: ‘33’, ‘blue’: ‘34’, ‘magenta’: ‘35’, ‘cyan’: ‘36’, ‘white’: ‘37’, ‘l_black’: ‘90’, ‘l_red’: ‘91’, ‘l_green’: ‘92’, ‘l_yellow’: ‘93’, ‘l_blue’: ‘94’, ‘l_magenta’: ‘95’, ‘l_cyan’: ‘96’, ‘l_white’: ‘97’, ‘dark’: 30, ‘inky’: 30, ‘atramentous’: 30, ‘flammulated’: 31, ‘grassy’: 32, ‘xanthic’: 33, ‘blove’: 34, ‘cerulean’: 34, ‘purple’: 35, ‘violescent’: 35, ‘violaceous’: 35, ‘albicans’: 37, ‘gray’: 90, ‘b_black’: ‘40’, ‘b_red’: ‘41’, ‘b_green’: ‘42’, ‘b_yellow’: ‘43’, ‘b_blue’: ‘44’, ‘b_magenta’: ‘45’, ‘b_cyan’: ‘46’, ‘b_white’: ‘47’, ‘b_dark’: 40, ‘b_inky’: 40, ‘b_atramentous’: 40, ‘b_flammulated’: 41, ‘b_grassy’: 42, ‘b_xanthic’: 43, ‘b_blove’: 44, ‘b_cerulean’: 44, ‘b_purple’: 45, ‘b_violescent’: 45, ‘b_violaceous’: 45, ‘b_albicans’: 47, ‘b_gray’: 100, ‘s_off_all’: 0, ‘s_bright’: 1, ‘s_dim’: 2, ‘s_incline’: 3, ‘s_inclined’: 3, ‘s_underline’: 4, ‘s_emphasize’: 5, ‘s_overstriking’: 5, ‘s_inverse’: 7, ‘s_blanking’: 8, ‘s_strickout’: 9, ‘s_normal’: 22, ‘s_blank’: 22, ‘s_nothing’: 22}


回页首

排查nug

  还以为是Python新增字典联接运算符“|”有数量限制,在Python命令行模式下试炼,七八个dict都可以“相加”,也就排除了是“|”运算符引起的bug。无法可想,再次一行行推敲代码,代码肯定是没毛病的。😣那问题出哪儿了?所幸代码不多,一个一个的print() zip()的值。当排查到light_back_colors字典时,zip()的值为’‘(什么都没有)!这不应该啊,它跟back_colors字典的zip()用的是同一变量back_color_names啊,back_colors字典都没毛病!print() back_color_names变量,有输出,看起来没毛病!这……😭😭😭
  在打字手累,用上CV的时候,手滑粘了两条print(),结果第二条输出为’'(什么都没有)。

再次用代码验证

        input(f"\n试炼:\n1. {', '.join(back_color_names)}\n2. {','.join(back_color_names)}")

输出

试炼:
1. b_black, b_red, b_green, b_yellow, b_blue, b_magenta, b_cyan, b_white
2.

  第二次读取真的什么都没有!为啥会这样子?查看back_color_names变量的类型先。上码:

        input(f"\n试炼:\nback_color_names Type: {self.set_color(type(back_color_names), 91)}\n1. {', '.join(back_color_names)}\n2. {','.join(back_color_names)}")

输出截屏图片
在这里插入图片描述

输出

试炼:
back_color_names Type: <class 'generator'>
1. b_black, b_red, b_green, b_yellow, b_blue, b_magenta, b_cyan, b_white
2.

  在代码中把back_color_names的类型设定为红色,可以清楚的看到,back_color_names变量是generator(发生器)类型。

generator(发生器)特性截屏图片
在这里插入图片描述

generator(发生器)有以下特别:

  • 遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口。
  • 能过多次进入、多次返回,能够暂停函数体中代码的执行。

  可以看出generator(发生器)就是迭代器iterator,当然第二次读取是“什么都没有”了。于此,我这小小的bug终于揪出!🤗但为啥会这样子呢?还得拷问变量back_color_names……


回页首

消亡bug

        back_color_names = (f"b_{i}" for i in color_names)

  原来,back_color_names变量的解析式我是用小括号包裹,就诞生了一个发生器generator。找到根源,问题也就好解决了——将解析式的小括号换成[],就得到一个list类型的back_color_names变量,可以无限次读取了。至此,遇到的小小bug才算彻底消亡!😋

        back_color_names = [f"b_{i}" for i in color_names]

得到想要的完整字典了😏

{‘black’: ‘30’, ‘red’: ‘31’, ‘green’: ‘32’, ‘yellow’: ‘33’, ‘blue’: ‘34’, ‘magenta’: ‘35’, ‘cyan’: ‘36’, ‘white’: ‘37’, ‘l_black’: ‘90’, ‘l_red’: ‘91’, ‘l_green’: ‘92’, ‘l_yellow’: ‘93’, ‘l_blue’: ‘94’, ‘l_magenta’: ‘95’, ‘l_cyan’: ‘96’, ‘l_white’: ‘97’, ‘dark’: 30, ‘inky’: 30, ‘atramentous’: 30, ‘flammulated’: 31, ‘grassy’: 32, ‘xanthic’: 33, ‘blove’: 34, ‘cerulean’: 34, ‘purple’: 35, ‘violescent’: 35, ‘violaceous’: 35, ‘albicans’: 37, ‘gray’: 90, ‘b_black’: ‘40’, ‘b_red’: ‘41’, ‘b_green’: ‘42’, ‘b_yellow’: ‘43’, ‘b_blue’: ‘44’, ‘b_magenta’: ‘45’, ‘b_cyan’: ‘46’, ‘b_white’: ‘47’, ‘lb_black’: ‘100’, ‘lb_red’: ‘101’, ‘lb_green’: ‘102’, ‘lb_yellow’: ‘103’, ‘lb_blue’: ‘104’, ‘lb_magenta’: ‘105’, ‘lb_cyan’: ‘106’, ‘lb_white’: ‘107’, ‘b_dark’: 40, ‘b_inky’: 40, ‘b_atramentous’: 40, ‘b_flammulated’: 41, ‘b_grassy’: 42, ‘b_xanthic’: 43, ‘b_blove’: 44, ‘b_cerulean’: 44, ‘b_purple’: 45, ‘b_violescent’: 45, ‘b_violaceous’: 45, ‘b_albicans’: 47, ‘b_gray’: 100, ‘s_off_all’: 0, ‘s_bright’: 1, ‘s_dim’: 2, ‘s_incline’: 3, ‘s_inclined’: 3, ‘s_underline’: 4, ‘s_emphasize’: 5, ‘s_overstriking’: 5, ‘s_inverse’: 7, ‘s_blanking’: 8, ‘s_strickout’: 9, ‘s_normal’: 22, ‘s_blank’: 22, ‘s_nothing’: 22}


回页首

  教训:再次印证了“基础不牢,地动山摇”。学习,不可以放过细节。
  得到:bug不可怕,当bug消亡,就又一个知识点学到或者牢靠了。😊


回页首

__上一篇:__ 十六进制字符串转Python代码(utf-8字符串转十六进制字符串)

__下一篇:__ 

我的HOT博:

  • Hot:给定字符串提取姓名(字符串、list、re“零宽断言”)(1051阅读)
  • Hot:我的 Python.color() (Python 色彩打印控制)(1125阅读)
  • Hot:python清屏(1290阅读)
  • 回车符、换行符和回车换行符(1322阅读)
  • Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义(1171阅读)
  • pandas 数据类型之 Series(1224阅读)
  • 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(1270阅读)
  • 练习:银行复利计算(用 for 循环解一道初中小题)(1188阅读)
  • pandas 数据类型之 DataFrame(2136阅读)
  • Hot:班里有人和我同生日难吗?(蒙特卡洛随机模拟法)(2180阅读)
  • Python字符串居中显示(2359阅读)
  • 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1665阅读)
  • 用 pandas 解一道小题(2007阅读)
  • 可迭代对象和四个函数(1083阅读)
  • “快乐数”判断(1252阅读)
  • 罗马数字转换器(构造元素取模)(2159阅读)
  • Hot:罗马数字(转换器|罗生成器)(4750阅读)
  • Hot:让QQ群昵称色变的代码(36654阅读)
  • Hot:斐波那契数列(递归| for )(4071阅读)
  • 柱状图中最大矩形(1663阅读)
  • 排序数组元素的重复起止(1258阅读)
  • 电话拨号键盘字母组合(1402阅读)
  • 密码强度检测器(1986阅读)
  • 求列表平衡点(1837阅读)
  • Hot: 字符串统计(4308阅读)
  • Hot:尼姆游戏(聪明版首发)(3493阅读)尼姆游戏(优化版)(1175阅读)
  • 推荐条件点阅破千

    回目录


    老齐漫画头像

    精品文章:

    • 好文力荐:《python 完全自学教程》齐伟书稿免费连载
    • OPP三大特性:封装中的property
    • 通过内置对象理解python'
    • 正则表达式
    • python中“*”的作用
    • Python 完全自学手册
    • 海象运算符
    • Python中的 `!=`与`is not`不同
    • 学习编程的正确方法

    来源:老齐教室


    回目录

    Python 入门指南【Python 3.6.3】


    好文力荐:

    • 全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。

    • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛

    • 靠谱程序员的好习惯


    CSDN实用技巧博文:

    • 8个好用到爆的Python实用技巧
    • python忽略警告
    • Python代码编写规范
    • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_17190.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习笔记:高级数据过滤

通配符过滤 1、名字以T开头的 SELECT * FROM T_Persons WHERE Name LIKE ‘T%’ 2、名字以ke结尾的 SELECT * FROM T_Persons WHERE Name LIKE ‘%ke’ 3、名字中包含“中”的 SELECT * FROM T_Persons WHERE Name LIKE ‘%中%’ 多值检测 SELECT Age,Name FROM T_…

Java的输入 Scanner in=new Scanner(System.in);

java和c还是有好多不同的地方&#xff0c;需要从头开始认认真真地学 文章目录输入数字输入double输入整型输入字符串判断2个字符串是否相等Java的字符串要用""双引号引起来&#xff0c;而不是单引号输入一维数组输入二维数组输入数字 输入double import java.util.…

算法分析与设计:10 大排序算法大汇总(Java)

冒泡排序 相邻比较并交换位置&#xff0c;将大的数冒泡交换到最后。 /******************************************************************************** 冒泡排序&#xff08;Bubble Sort&#xff09;它重复地走访过要排序的元素&#xff0c;依次比较相邻两个元素&#xf…

E2成都电路板设计_启动保持停止电路的原理

电气技术分享之2 本文介绍电气工程里常见的启动、保持、停止电路的原理。 1、起保停电路的功能 起保停电路实现的功能&#xff1a;按启动按键&#xff0c;电路的负载得电并保持&#xff0c;按停止按键&#xff0c;负载断电。 2、起保停电路所需的元件 起保停电路所需的元件…

matplotlib绘制直方图,饼图,散点图,气泡图,箱型图,雷达图

matplotlib绘制直方图&#xff0c;饼图&#xff0c;散点图&#xff0c;气泡图&#xff0c;箱型图&#xff0c;雷达图一.直方图用10000个正态分布随机数画直方图二.绘制饼图或者圆环图圆环图根据消费支出画圆环图三.绘制散点图或气泡图使用scatter()函数绘制一个散点图&#xff…

【进制计算】 2 ~ N 进制计算

目录 规则 图解十、二、八、十六进制之间的转换 举例 除法计算出3进制&#xff1a; 乘法次方逆向计算原数&#xff1a; 图解二进制加减乘除计算 规则 十进制 除以 进制数 取余法&#xff1a;&#xff08;1&#xff09;被除数 除以 除数 等于 商 并取得余数&#xff0c;&am…

SSM进阶-Duubo入门demo整合MyBatis

搭建入门demo 搭建SpringSpringMVCDubbo入门demo 准备数据 数据库创建demo表 create table demo (id bigint auto_increment primary key,name varchar(255) null,description text null ); 插入数据 INSERT INTO demo(id, name, description) VAL…

数据库基础,看完这篇就够了!

转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/747a74ea.html你好,我是测试蔡坨坨。 对于测试同学来说,除了知道测试基础知识外,还需要掌握一些测试基本技能,主要有Linux、数据库、计算机网络等,在此之前我们已经讨论过Linux基础知识以及在实际工作中的应…

神经网络模型训练简记(一)

神经网络模型训练简记&#xff08;一&#xff09;一、概念介绍1.1人工智能、机器学习、神经网络与深度学习1.2backbone与pretrain_model1.3batch_size、learning_rate、epoch与iteration1.4模型评价指标二、官方数据集简介2.1ImageNet数据集2.2 ILSVRC竞赛2.3 MS COCO数据集2.4…

【专栏】RPC系列(实战)-低配版NameServer

公众号【离心计划】,一起离开地球表面 【RPC系列合集】 【专栏】RPC系列&#xff08;理论&#xff09;-夜的第一章 【专栏】RPC系列&#xff08;理论&#xff09;-协议与序列化 【专栏】RPC系列&#xff08;理论&#xff09;-动态代理 【专栏】RPC系列&#xff08;实战&am…

读书笔记:软件工程(4) - 软件过程模型:瀑布模型

软件过程模型 为了改变软件开发的混乱状况&#xff0c;使软件开发更加有序。 瀑布模型 又称为经典生命周期&#xff0c;它提出了一个系统的&#xff0c;顺序的软件开发方法&#xff0c;从用户需求规格说明开始&#xff0c;通过策划&#xff0c;建模&#xff0c;构建和部署的…

Easyx基本使用(三)

Easyx基本使用&#xff08;三&#xff09; ——绘制简单图形 1. 绘制点&#xff08;putpixel&#xff09; void putpixel(int x,int y,COLORREF color );x&#xff1a;点的x坐标y&#xff1a;点的y坐标color&#xff1a;点的颜色返回值&#xff1a;无 #include <easyx.h…

程序员的数学课15 递归:如何计算汉诺塔问题的移动步数?

递归是重要的程序开发思想&#xff0c;比如程序源代码缩进、树形数据结构、XML 语法、快速排序法等都有递归的影子。 那么&#xff0c;递归思维的本质到底是什么呢&#xff1f;递归的理念看似隐讳&#xff0c;实则非常清晰明了。 为了让你由浅入深地理解它&#xff0c;这一讲…

paddle 训练模型的保持和载入

模型保持中的常见问题 &#xff0c;查看官网 模型保存常见问题-使用文档-PaddlePaddle深度学习平台 一、保存载入体系简介 模型保存与载入 一、保存载入体系简介 1.1 基础API保存载入体系 飞桨框架2.1对模型与参数的保存与载入相关接口进行了梳理&#xff1a;对于训练调优场景…

2023秋招nlp笔试题-太初

单选题 浮点数的表示范围和精度取决于 浮点数的取值范围由阶码的位数决定,而浮点数的精度由尾数的位数决定 响应中断请求的条件是 A.外设提出中断; B.外设工作完成和系统允许时; C.外设工作完成和中断标记触发器为“1”时; D.CPU提出中断。 计算器浮点运算速度为85.0167PF…

Day30_路由的props配置

提出问题&#xff1a; Detail是如何得到别传给他的参数&#xff0c;以及如何简化写法。 第一种写法的props 对象式 使用的很少&#xff0c;传递的是死数据 1.index.js组件里面 2.在detail组件里面 3效果图&#xff1a; 第二种写法props 布尔值 仅限于params参数传递…

心理学考研难度 分析

全国招收心理学院校排名 高等教育评价专业机构软科发布了“2020软科中国最好学科排名”&#xff0c;心理学院校有55所上榜&#xff0c;排名前10%依次为北京师范大学、北京大学、华南师范大学、西南大学、华东师范大学、华中师范大学、上海交通大学、浙江大学、陕西师范大学、上…

内存对齐对性能的影响

计算字节数 在 Go 语言中&#xff0c;可以使用 unsafe.Sizeof 计算出一个数据类型实例需要占用的字节数。 package mainimport ("fmt""unsafe" )type Args struct {num1 intnum2 int }type Flag struct {num1 int16num2 int32 }func main() {fmt.Println…

浅析axios原理与使用(包括axios的优雅写法与res的解构赋值)

目录前言一&#xff0c;什么是axios二&#xff0c;axios的基本使用2.1 不含参的axios调用2.2 含参数的axios调用三&#xff0c;axios的原理&#xff08;拦截器&#xff09;3.1 客户端与服务器之间的交互原理&#xff08;复习可略过&#xff09;3.2 浅析axios原理四&#xff0c;…

西瓜书研读——第三章 线性模型: 线性判别分析 LDA

西瓜书研读系列&#xff1a; 西瓜书研读——第三章 线性模型&#xff1a;一元线性回归 西瓜书研读——第三章 线性模型&#xff1a;多元线性回归 西瓜书研读——第三章 线性模型&#xff1a;线性几率回归&#xff08;逻辑回归&#xff09; 主要教材为西瓜书&#xff0c;结合…