码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 切记:Python迭代器只可以读取一次,忽略会有意想不到的麻烦。



    【点击此处跳转笔记正文】

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

      这段代码看不出啥毛病,但生成的字典,却少了高亮背景色(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

    输出

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

      第二次读取真的什么都没有!为啥会这样子?查看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)}")
    
    • 1

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

    输出

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

      在代码中把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)
    
    • 1

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

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

    得到想要的完整字典了😏

    {‘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消亡,就又一个知识点学到或者牢靠了。😊


    回页首

    __上一篇:__ 文本模式打印彩色直方统计图

    __下一篇:__ 

    我的HOT博:
      • New:给定字符串提取姓名(字符串、list、re“零宽断言”)(1051阅读)
      • New:我的 Python.color() (Python 色彩打印控制)(1125阅读)
      • New:python清屏(1290阅读)
      • 回车符、换行符和回车换行符(1322阅读)
      • Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义(1171阅读)
      • pandas 数据类型之 Series(1224阅读)
      • 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(1270阅读)
      • 练习:银行复利计算(用 for 循环解一道初中小题)(1188阅读)
      • pandas 数据类型之 DataFrame(2136阅读)
      • 班里有人和我同生日难吗?(蒙特卡洛随机模拟法)(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规范(说明文档的规范写法)

    • 相关阅读:
      设计模式 | 策略模式
      代码随想录算法训练营第五十六天 | 动态规划 part 14 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和(dp)
      Mysql中的目录和文件详解
      2022-11-11 C++并发编程( 四十一 )
      读书笔记_小米创业思考
      uniapp掉完接口后刷新当前页面方法
      数据结构--队列与循环队列的实现
      提振信心!1-7月新车智能化「持续增长」,同比增速超70%
      master公式
      Maven常见命令
    • 原文地址:https://blog.csdn.net/m0_57158496/article/details/127137871
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号