├── .gitignore ├── 000 巧用编辑器pyCharm ├── pycharm技巧.md ├── 代码模板.png ├── 快捷代码模板 (2).png ├── 快捷代码模板.png └── 窗口浮动.png ├── 001 一行代码二维数组 └── main.ipynb ├── 002 玩转推导式 └── main.py ├── 003 虚数妙用 ├── main.py └── more.ipynb ├── 004 pass和点点点 └── show.ipynb ├── 005 函数注解 ├── main.py └── 类本身的注解.png ├── 006 help函数 └── main.py ├── 007 eval函数 └── main.py ├── 008 多变量交换与拆包 └── main.py ├── 009 装饰器的本质 ├── innerpar.py ├── 带参数装饰器.py ├── 带参数装饰器2.py └── 装饰器还能装饰其他的东西吗.py ├── 010 极速递归 └── show.py ├── 011 三个实用位运算 └── show.py ├── 012 元组小逗号 ├── test.py └── 元组小逗号.py ├── 013 Counter做元素统计 └── main.py ├── 014 deque代替list ├── d.py └── main.py ├── 015 三目运算 ├── main.py ├── test.py └── 学习摘要 ├── 016 类型转化大全 ├── main.py ├── test.py └── 无标题.png ├── 017 翻转序列 ├── main.py └── test.py ├── 018 内置排序和自定义排序 ├── main.py └── test.py ├── 019 数字大总结 ├── main.pptx ├── main.py ├── math库里的大数字.py ├── 一些有意义的大数.py ├── 保留小数.py └── 小整数池.py ├── 020 try catch完整写法 └── main.py ├── 021 跳出多层循环 ├── else.py ├── forforfro.py └── test.py ├── 022 赋值、复制、深拷贝 ├── dictCopy.py ├── listCpy.py ├── setCopy.py ├── strcopy.py ├── test.py └── tupleCpy.py ├── 023 无穷大的应用inf └── 关于无穷大的方法.py ├── 024 默认字典 └── 默认字典.py ├── 025 切片和自定义切片 ├── lipu.py ├── main.py ├── test.py └── 自定义对象的切片.py ├── 026 组合数combination ├── test.py └── 二进制的应用.py ├── 027 两种打印彩色文字的方式 ├── main.py └── printInCmd.py ├── 028 product展平多重循环 ├── deepTest.py ├── speedTest.py └── test.py ├── 029 小顶堆heapq ├── 050 优先队列 │ └── main.py ├── demo.py ├── main.py ├── test.py └── 和优先队列的区别.py ├── 030 用any、all对序列进行与或判断 ├── show.py └── test.py ├── 031 高精度小数运算-有理数和Decimal ├── f.py ├── tes.py └── test.py ├── 032 字符串f-string ├── fString3.8.py ├── r了之后怎么tab.py ├── show.py ├── 前导字母.py ├── 前导字母交换顺序.py └── 字符串基本写法.py ├── 033 字符串转义字符总结 ├── js.json ├── jsonStr.py ├── show.py └── 转义字符.py ├── 034 字符串编码问题与编码转换 ├── 爬虫中遇到的编码.py ├── 编码表.py └── 编码转换.py ├── 036 面向对象-基本理论 ├── Flash动画 │ ├── pythonAnimation.fla │ ├── 元类.gif │ ├── 函数的本质.gif │ ├── 类实例化.gif │ └── 装饰器函数.gif ├── main.py ├── ppt │ └── 概念.pptx ├── show.py ├── show2.py ├── 基本数据类型也是对象.py ├── 基本理论.py ├── 学习资料.txt ├── 胡闹行为.py ├── 视频里没有出的内容 │ ├── 042 看透self参数 │ │ ├── main.py │ │ └── test.py │ ├── 046 用函数写类 │ │ └── test.py │ ├── 050 重载奇怪运算符 │ │ └── main.py │ ├── 元类和obj的关系.py │ └── 对象生命周期理论.py └── 面向对象的好处.py ├── 037 面向对象-用dataclass简写类 ├── dataClass.py └── nameTuple.py ├── 038 面向对象-类方法类属性优化类 └── show.py ├── 040 面向对象-__name__,__class__ └── test.py ├── 042 组合数据类型只读化 └── show.py ├── 043 面向对象-slots └── main.py ├── 044 面向对象-静态方法封装类 └── show.py ├── 045 下划线保护类里面的资源 ├── file1.py ├── file2.py ├── show.py └── test.py ├── 045 面向对象-更安全地保护属性 └── test.py ├── 046 面向对象-python变C艹 └── test.py ├── 046 面向对象-类装饰器、装饰类的装饰器 ├── new.py ├── show.py ├── test.py ├── test2.py └── 用类实现装饰器.py ├── 047 面向对象-魔术方法大总结 ├── test.py ├── test3.py ├── 魔术方法.py ├── 魔术方法大总结.xmind └── 魔术方法展现.py ├── 049 面向对象-继承问题 ├── main.py ├── show.py └── super写法.py ├── 050 面向对象-抽象类 ├── show.py └── test.py ├── 051 面向对象-获取多继承顺序 ├── show2.py ├── test.py ├── test2.py ├── test3.py └── 两种多此一举的三角继承问题.py ├── 052 面向对象-enum枚举 ├── main.py ├── show.py └── 枚举.py ├── 053 面向对象-类里怎么写自己的注解? ├── main.py ├── test.py └── 注解.png ├── 054 面向对象-用type元类写类 └── show.py ├── 055 面向对象-用元类写出更离谱的类 ├── show2.py ├── test1.py ├── test2.py ├── test3.py ├── 元类.py ├── 类运算.py └── 继承和元类.py ├── 056 全排列 └── test.py ├── 057 制作音乐musicpy ├── temp.mid ├── test.py └── test2.py ├── 058 用import语句拆文件搞大项目 └── 内容.py ├── 059 总结itertools里的骚东西 ├── filterTest.py ├── main.py ├── show.pptx └── test.py ├── 060 玩转闭包 ├── changeAbleVarTest.py ├── changeAbleVarTest2.py ├── changeAbleVarThreeTest.py ├── changeAbleVarThreeTest2.py ├── globalTest.py ├── keywordsTest.py ├── keywordsTest1.py ├── newTest.py ├── questions.txt ├── show.py ├── test.py └── three.py ├── 061 拓扑排序 ├── egg.py ├── main.py ├── test.py └── tradition.py ├── 062 四种链式调用 ├── main.py └── test.py ├── LICENSE ├── README.md ├── python迷惑行为 ├── python可以吹口哨了 │ ├── fpMusic.py │ └── multiTest.py ├── 【已废弃】不够有趣 │ ├── 代码加密 │ │ └── main.py │ ├── 函数套列表,列表套函数 │ │ └── main.py │ └── 用魔术方法实现递归 │ │ └── test.py ├── 【待研究】 │ ├── 函数内部删除自己 │ │ └── test.py │ ├── 函数式编程 │ │ ├── test1.py │ │ ├── test2.py │ │ └── 用闭包玩面向对象 │ │ │ ├── 多继承测试1.py │ │ │ ├── 用闭包玩面向对象.py │ │ │ ├── 继承测试.py │ │ │ ├── 继承测试2.py │ │ │ ├── 继承测试3.py │ │ │ ├── 继承测试4.py │ │ │ └── 继承测试5.py │ ├── 我变成了别的语言 │ │ ├── cpp.py │ │ └── javaclass.py │ ├── 我自己引入我自己 │ │ ├── __pycache__ │ │ │ ├── a.cpython-311.pyc │ │ │ └── d.cpython-311.pyc │ │ ├── a.py │ │ └── d.py │ ├── 我运行我自己 │ │ ├── 2 │ │ │ └── test.py │ │ └── exec无限 │ │ │ └── test.py │ ├── 禁用xxx系列 │ │ └── 禁用def │ │ │ └── test.py │ ├── 线程舞蹈 │ │ └── test.py │ └── 编译C代码 │ │ └── main.py ├── 中文编程 │ ├── a.pycn │ ├── chinese.py │ ├── show.py │ ├── test.py │ └── translation.py ├── 我把我自己删了 │ ├── main.py │ ├── new.py │ ├── t │ │ └── test.py │ ├── test.py │ └── test2.py ├── 我有了花括号 │ ├── outline.py │ ├── setTest.py │ ├── show.py │ ├── test.py │ └── 美观打印.py ├── 我的代码一旦改了就报错 │ ├── background.py │ ├── main.py │ ├── show.py │ ├── test.py │ └── test2.py ├── 我给你我自己还是调用自己 │ ├── fg.py │ └── r.py ├── 我继承我自己 │ ├── change_print.py │ ├── demo.py │ └── strange_code.py ├── 我自己写我自己 │ ├── a.py │ ├── a.txt │ ├── p1.py │ ├── test.py │ └── test2.py ├── 我自己套我自己 │ ├── d.py │ ├── dl.py │ ├── main.py │ └── more.py └── 装饰装饰器 │ ├── decoDouble.py │ ├── test.py │ ├── 第一次套娃.py │ ├── 第三次套娃.py │ ├── 第二次套娃.py │ ├── 视频字幕.txt │ └── 通向公式.py ├── 视频中的翻车行为记录 ├── 001 一行二维数组.py ├── 002 推导式效率.py ├── 002 推导式效率内存问题.py ├── 005 函数注解.py ├── 008 拆包解包.py ├── 009 装饰器的本质.py ├── 045 isinstance(a,b)和type(a)==b │ ├── 1.py │ ├── show.py │ ├── 多继承情况.py │ └── 如果有了元类.py └── 经常口误的内容.py └── 视频还没录但计划的 ├── 040 魔术方法大总结的补充 └── 内容策划.txt ├── 050 next ├── test.py └── 字符串是否有两个相邻一样字符.py ├── 050 pathlib快速处理文件 ├── a │ ├── a.shit │ └── test1 │ │ └── b.shit └── main.py ├── 050 python和C联动 ├── main.py └── tool.c ├── 050 python版本详解 ├── show.py ├── speedTest.py ├── 新特性.py └── 获取版本号.py ├── 050 yield async await ├── asy.py ├── main.py ├── 异步.py └── 用在链表上.py ├── 050 优雅使用变量名 └── main.py ├── 050 伪函数重载 ├── 1.png └── 1.py ├── 050 关键字 └── main.py ├── 050 内置object大总结 ├── main.py └── 分类.py ├── 050 函数参数问题 └── main.py ├── 050 多线程与多进程 ├── pro │ └── test.py └── 多线程 │ ├── main.py │ └── test.py ├── 050 如何优雅的收集异常 ├── main.py └── 用tryexcept收集异常并美观打印.py ├── 050 字典变种 ├── 只读字典.py ├── 子类化UserDict.py ├── 字典额外操作.py ├── 有序字典.py └── 锁链字典.py ├── 050 巧用exec ├── 1.png ├── 1.py ├── testfile.py ├── 自己exec自己,code版.py └── 自己exec自己,str版.py ├── 050 循环函数类的各种嵌套问题 └── 099 defAndClass │ └── main.py ├── 050 总结各种编辑器的使用技巧 └── show.py ├── 050 操作符函数写法 └── a.py ├── 050 概率论random模拟一切 ├── 050 random概率论.py ├── newTest.py ├── test.py ├── 概率论.py ├── 草稿.py └── 重男轻女的影响模拟.py ├── 050 用pprint美化输出 ├── j.json └── main.py ├── 050 直接跳出深层递归 └── 050 直接跳出深层递归.py ├── 050 研究random ├── 1.py ├── 2.py └── 3.py ├── 050 组合数据类型合并 └── 合并字典.py ├── 050 运算符总结 └── test.py ├── 050 进制转化问题 ├── 十六进制的应用.py └── 进制转化.py ├── 050 集合问题 ├── 冻结集合.py ├── 字典套集合.py ├── 无重复列表.py └── 集合操作.py ├── 056 导入 ├── README.md ├── d │ └── test.py ├── f1 │ ├── __init__.py │ └── f2 │ │ └── test2.py ├── phe.py └── test.py ├── 061 逻辑链条技巧 └── main.py ├── 063 设计模式大全 ├── example.py ├── 创建型 │ ├── 单例模式 │ │ ├── example_1.py │ │ ├── example_2.py │ │ └── outline.txt │ ├── 原型模式 │ │ ├── example.py │ │ └── outline.txt │ ├── 工厂模式 │ │ ├── show │ │ │ ├── __pycache__ │ │ │ │ ├── a_class.cpython-311.pyc │ │ │ │ ├── b_class.cpython-311.pyc │ │ │ │ └── factory.cpython-311.pyc │ │ │ ├── a_class.py │ │ │ ├── b_class.py │ │ │ ├── client.py │ │ │ └── factory.py │ │ └── study │ │ │ ├── PersonUtils.py │ │ │ ├── example_1.py │ │ │ ├── example_2.py │ │ │ ├── ouline.txt │ │ │ └── show_2.py │ ├── 抽象工厂模式 │ │ └── example_1.py │ └── 构造器模式 │ │ ├── example.py │ │ └── outline.txt ├── 奇怪的模式 │ └── file_type_class │ │ ├── __init__.py │ │ ├── file_type_object.py │ │ └── test.py └── 结构型 │ └── 适配器模式 │ ├── 对象适配器.py │ └── 类适配器.py ├── 070 存根文件重载方法 ├── api.py ├── api.pyi └── test.py ├── 070 用于ACM的技巧 ├── 优化性能.py ├── 前缀和.py ├── 快速输入.py ├── 数学技巧.py └── 输入技巧.py ├── 099 内置库大总结 └── test.py ├── 100 用PIL绘图 ├── 1661106269.8573835.png ├── 1661106776.49253.png ├── 1661116435.9107966.png ├── 1661116526.845693.png ├── 1661116720.6373894.png ├── 1661117677.7113774.png ├── 1661160230.0184052.png ├── 1661161044.056865.png ├── 1661161414.3180752.png ├── 1661161600.858725.png ├── 1661161871.3957865.png ├── mdbl.py └── test1.py ├── 999 语法解析 ├── kw.xlsx ├── main.py ├── test.py ├── test2.py ├── 不要骂脏话.py ├── 统计关键字.py └── 语法树样例测试.py ├── 测试123 └── t2.py └── 迷惑行为 └── 只有我能运行的代码 ├── README.md ├── main.py ├── project ├── __pycache__ │ └── loader.cpython-312.pyc ├── loader.py ├── main.py ├── my_utils.bin └── privkey.pem ├── pubkey.pem └── real.py /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | test 3 | .xml 4 | .vscode 5 | venv 6 | 记录 7 | 测试文件 8 | *.ignore -------------------------------------------------------------------------------- /000 巧用编辑器pyCharm/代码模板.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/000 巧用编辑器pyCharm/代码模板.png -------------------------------------------------------------------------------- /000 巧用编辑器pyCharm/快捷代码模板 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/000 巧用编辑器pyCharm/快捷代码模板 (2).png -------------------------------------------------------------------------------- /000 巧用编辑器pyCharm/快捷代码模板.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/000 巧用编辑器pyCharm/快捷代码模板.png -------------------------------------------------------------------------------- /000 巧用编辑器pyCharm/窗口浮动.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/000 巧用编辑器pyCharm/窗口浮动.png -------------------------------------------------------------------------------- /002 玩转推导式/main.py: -------------------------------------------------------------------------------- 1 | # a = [dog for dog in range(100)] 2 | a = list(range(100)) 3 | 4 | # 如果列表是一个等差数列,直接用range更快了 5 | 6 | b = [i + 1 for i in range(100)] 7 | b_ = list(range(1, 101)) 8 | 9 | c = [i for i in range(100) if i % 2 == 0] 10 | c_ = list(range(0, 100, 2)) 11 | -------------------------------------------------------------------------------- /003 虚数妙用/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年05月23日 5 | by littlefean 6 | """ 7 | 8 | import itertools 9 | from typing import * 10 | 11 | 12 | def main(): 13 | a = 1j 14 | b = 1 + 1j 15 | c = complex(1, 1) 16 | print(b == c) 17 | 18 | # 可以当成坐标用,用于快速判断某一个点是否在某一个区域里 19 | s = {complex(x, y) for y, x in itertools.product(range(10), range(10))} 20 | print(s) 21 | 22 | return None 23 | 24 | 25 | if __name__ == "__main__": 26 | main() 27 | -------------------------------------------------------------------------------- /005 函数注解/类本身的注解.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/005 函数注解/类本身的注解.png -------------------------------------------------------------------------------- /006 help函数/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def func(): 11 | """ 12 | 这个函数是干啥啥的 13 | :return: 返回了个东西是啥啥啥 14 | """ 15 | 16 | 17 | def main(): 18 | # help() # 直接进入交互式 19 | 20 | # 传入一些奇奇怪怪的对象,会显示出这个对象的类的注释 21 | help(1) 22 | help(...) 23 | help(()) 24 | 25 | # 打印注释文档 26 | help(func) 27 | import math 28 | help(math) 29 | 30 | # 关键字 31 | help("def") 32 | help("none") # 这个不可以 33 | help("async") 34 | help("ASYNC") # 不小心大写了也可以 35 | 36 | # 符号 37 | help(">>=") # 打印出运算符优先级 38 | 39 | # help 40 | help(help) # 他自己就是一个对象,会打印出他自己的注释 41 | 42 | return None 43 | 44 | 45 | if __name__ == "__main__": 46 | main() 47 | -------------------------------------------------------------------------------- /007 eval函数/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # 自动解析数字 12 | # n = eval(input()) 13 | 14 | # 解析字典、元组、列表、集合等数据结构嵌套的字符串表示 15 | dic = eval("{1: [1, 2, 3]}") 16 | 17 | # 坑队友 18 | # eval("__import__('os').remove('...')") # ... 里面写一些删除的东西 19 | 20 | # 一行代码低效率实现阶乘 21 | def jie(num): 22 | return eval("*".join(str(i) for i in range(1, num + 1))) 23 | 24 | print("------------") 25 | print(jie(1)) 26 | print(jie(2)) 27 | print(jie(3)) 28 | return None 29 | 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /008 多变量交换与拆包/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | a = 15 12 | b = 155 13 | c = 1555 14 | a, b, c = c, b, a 15 | print(a, b, c) 16 | 17 | d, *e = a, b, c 18 | print(d, e) # 1555 [155, 15] 19 | 20 | f, *g, h = a, b, c, d, e # 1555 [155, 15, 1555] [155, 15] 21 | print(f, g, h) 22 | 23 | return None 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /009 装饰器的本质/带参数装饰器.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | 4 | def timer(time_type): 5 | print(time_type) 6 | 7 | def outer(func): 8 | print("func的名字是:", func.__name__) 9 | 10 | def inner(*args, **kwargs): 11 | start = time.time() 12 | func(*args, **kwargs) 13 | end = time.time() 14 | res = end - start 15 | print('时间结果是:', res) 16 | 17 | return inner 18 | 19 | return outer 20 | 21 | 22 | @timer('min') # foo = timer(foo) 23 | # @outer 24 | def foo(a, b, c): 25 | print('in foo', a, b, c) 26 | 27 | 28 | foo('woniu', 'gfifigf', '79846543635') 29 | -------------------------------------------------------------------------------- /009 装饰器的本质/带参数装饰器2.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | 4 | def timer(time_type): 5 | """ 6 | 带参数的选择器 7 | timer() 加小括号调用结束之后,本身会变成一个不带参数的装饰器(小机器人) 8 | 然后这个装饰器再对函数进行装饰 9 | """ 10 | print(time_type) 11 | if time_type == "min": 12 | def robot(func): 13 | print("func的名字是:", func.__name__) 14 | 15 | def inner(*args, **kwargs): 16 | start = time.time() 17 | func(*args, **kwargs) 18 | end = time.time() 19 | res = end - start 20 | print('时间结果是:', res) 21 | 22 | return inner 23 | else: 24 | def robot(func): 25 | print("func的名字是:", func.__name__) 26 | 27 | def inner(*args, **kwargs): 28 | start = time.time() 29 | func(*args, **kwargs) 30 | end = time.time() 31 | res = end - start 32 | print('时间结果是:', res) 33 | 34 | return inner 35 | return robot 36 | 37 | 38 | @timer('min') 39 | def foo(a, b, c): 40 | print('in foo', a, b, c) 41 | 42 | 43 | foo('a', 'bb', 'ccc') 44 | -------------------------------------------------------------------------------- /009 装饰器的本质/装饰器还能装饰其他的东西吗.py: -------------------------------------------------------------------------------- 1 | def robot(obj): 2 | obj.b = 155 3 | return obj 4 | 5 | 6 | @robot 7 | class A: 8 | def __init__(self): 9 | self.a = None 10 | 11 | 12 | a1 = A() 13 | print(a1.a) 14 | print(a1.b) 15 | -------------------------------------------------------------------------------- /010 极速递归/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年06月17日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | # 先引入 10 | from functools import lru_cache 11 | 12 | 13 | # 装饰你要递归的函数 14 | @lru_cache(None) 15 | def fab(n): 16 | if n == 1: 17 | return 1 18 | if n == 2: 19 | return 1 20 | return fab(n - 1) + fab(n - 2) 21 | 22 | 23 | def main(): 24 | for i in range(1, 101): 25 | print(i, fab(i)) 26 | """ 27 | 注意点: 28 | 装饰的函数的每一个参数都是要可哈希的, 29 | int、float、str都可以,但是传了一个list不可以。 30 | """ 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /011 三个实用位运算/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年06月17日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | left = 1 12 | right = 1000 13 | mid = (left + right) >> 1 14 | print(mid) 15 | # 比如说求中点位置,就可以用位运算,相当于除以二 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /012 元组小逗号/test.py: -------------------------------------------------------------------------------- 1 | # a = [1] 2 | # a.append(1) 3 | b = (1,) 4 | for _ in range(10000): 5 | b += (1,) 6 | print(b) 7 | -------------------------------------------------------------------------------- /012 元组小逗号/元组小逗号.py: -------------------------------------------------------------------------------- 1 | print([[[[[[[[[]]]]]]]]]) # [[[[[[[[[]]]]]]]]] 没问题 2 | # print({{{{{{}}}}}}) # 集合不可以嵌套 3 | 4 | print(bool((()))) # False 5 | print(bool(((),))) # True 不要小看这个小逗号,对解析非常有影响 6 | print(bool(((((((((((((())))))))))))))) # False 7 | print(bool((((((((((((((),)))))))))))))) # True 8 | 9 | # 加不加小逗号 10 | print(()) 11 | print((())) # 二层元组 12 | print(((((((((((()))))))))))) # 多层元组,如果里面没有东西还是会解析成一层 13 | print(() == (((((())))))) # True 14 | print(id(()), id((((()))))) # id 也是一样的 15 | 16 | # 如何加小逗号 17 | print(()) 18 | print((())) 19 | print(((),)) 20 | print("=====4维元组====") 21 | t1 = (((()))) 22 | t2 = ((((),))) # 相同的,都是二维元组 23 | t3 = (((()),)) # 相同的,都是二维元组 24 | t4 = (((())),) # 相同的,都是二维元组 25 | t5 = ((((),),)) 26 | t6 = ((((),),),) 27 | 28 | print(t1, t2, t3, t4, t5, t6) 29 | 30 | a = 1 31 | b = (1) 32 | print(a, b) # 一样的 33 | 34 | # 过程,从外往里看,如果小括号里面只有一个东西,就忽略这个多余的小括号。 35 | 36 | # 总结:加小逗号可以防止被解释器忽略 37 | 38 | tup1 = (1, 2) 39 | tup2 = tup1 40 | tup1 += (1,) 41 | print(tup1, tup2) -------------------------------------------------------------------------------- /013 Counter做元素统计/main.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | from random import randint 3 | from time import perf_counter 4 | 5 | s = "🐕💩🐕💩🐕💩🐕💩🐕💩🐕🐕🐕🐕💩💩💩💩💩💩" 6 | 7 | dic = {} 8 | 9 | string = "" 10 | 11 | for _ in range(100_0000): 12 | # 可以随便加下划线,不能连续加两个 13 | string += str(randint(0, 9)) 14 | ... 15 | 16 | print(string) 17 | t1 = perf_counter() 18 | 19 | dic = {} 20 | for char in string: 21 | if char in dic: 22 | dic[char] += 1 23 | else: 24 | dic[char] = 1 25 | 26 | t2 = perf_counter() 27 | dic2 = Counter(string) 28 | t3 = perf_counter() 29 | print(t2 - t1, t3 - t2) # 快四倍左右 30 | -------------------------------------------------------------------------------- /014 deque代替list/d.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | print(deque()) 3 | print(deque([])) 4 | print(deque(())) 5 | print(deque({})) 6 | print(deque({1, 2, 3})) 7 | print(deque([4, 5, 6])) 8 | print(deque((7, 8, 9))) 9 | print(deque({"a": 5, "b": 7})) 10 | 11 | que = deque([1, 2, 3]) 12 | print(que) 13 | print(que == [1, 2, 3]) # False 14 | que.pop() 15 | que.popleft() 16 | que.append(999) 17 | que.appendleft(666) 18 | print(que) 19 | -------------------------------------------------------------------------------- /015 三目运算/test.py: -------------------------------------------------------------------------------- 1 | a = 15 2 | 3 | a == 15 if print("yes1") else print("no1") 4 | print("yes2") if a == 15 else print("no2") 5 | 6 | if bool(None): 7 | print(111) 8 | else: 9 | print(222) 10 | 11 | if print("if if"): 12 | print(111) 13 | 14 | # 嵌套写法 15 | score = 83 16 | if score in range(101): 17 | if score < 60: 18 | print("不合格") 19 | else: 20 | print("合格") 21 | else: 22 | print("成绩错误") 23 | 24 | print("不合格") if score < 60 else print("合格") if score in range(101) else print("成绩错误") 25 | 26 | from random import random 27 | 28 | 29 | def do(): 30 | ... 31 | 32 | 33 | if random() < 0.5: 34 | do() 35 | 36 | do() if random() < 0.5 else ... 37 | 38 | value = 65 39 | 40 | res = "ok" if value > 60 else "no" 41 | # print("空") if name == "" elif print("找到人了") else print("没找到") 42 | -------------------------------------------------------------------------------- /015 三目运算/学习摘要: -------------------------------------------------------------------------------- 1 | 《内容摘要》Video Abstract 2 | 3 | 一元二元三元(目)是什么意思 4 | 三元运算符写法辨析 5 | if语句自动布尔转化 6 | 压缩if语句成一行 7 | 为什么三元运算符总写不对 8 | js、C语言,java、C++、php与python三目的区别 9 | 学习三目运算符的意义 10 | 三元运算符二层嵌套写法 11 | 用三元运算符写一个《50%概率执行一个函数》 12 | 带返回值的三元运算符写法 -------------------------------------------------------------------------------- /016 类型转化大全/test.py: -------------------------------------------------------------------------------- 1 | 2 | arr = [] 3 | if not arr: 4 | print("empty") 5 | 6 | # 原理: 7 | print(bool(arr)) # False 8 | if not bool(arr): 9 | print("empty") 10 | 11 | print(bool([])) # False 12 | print(bool(())) # False 13 | print(bool({})) # False 14 | print(bool(set())) # False 15 | 16 | print("=====") 17 | 18 | # 数组 19 | print(bool([1, 2, 3])) # True 20 | print(bool([None])) # True 21 | print(bool([...])) # True 22 | print(bool([[]])) # True 23 | # 元组 24 | print(bool((1, 1))) # True 25 | print(bool()) # False 26 | print(bool(((),))) # True 不要小看这个小逗号,对解析非常有影响 27 | print(bool(((((((((((((())))))))))))))) # False 28 | print(bool((((((((((((((),)))))))))))))) # True 29 | 30 | # 元组和字典 31 | # print(bool({{{{{}}}}})) 32 | print(bool({2: 1})) # True 33 | print(bool({None})) # True 34 | -------------------------------------------------------------------------------- /016 类型转化大全/无标题.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/016 类型转化大全/无标题.png -------------------------------------------------------------------------------- /017 翻转序列/main.py: -------------------------------------------------------------------------------- 1 | """reverse""" 2 | 3 | string = "abcde" 4 | print(string[::-1]) 5 | print(string) 6 | 7 | string = reversed(string) 8 | print(string) # 不是字符串了,是一个对象了 9 | for char in string: 10 | print(char, end=",") 11 | print() 12 | 13 | arr = [1, 2, 3, 4, 5] 14 | 15 | print(arr[::-1]) 16 | print("A:", arr) 17 | arr.reverse() 18 | print("B:", arr) 19 | res = arr.__reversed__() # reversed(...) 20 | print(res) 21 | print("C:", arr) 22 | res = reversed(arr) 23 | print(res) 24 | 25 | # apply 26 | 27 | array = [3, 1, 4, 1, 5, 9, 2, 6] 28 | for n in reversed(array): 29 | print(n, end=" ") 30 | print() 31 | print(array) 32 | 33 | for i, n in enumerate(reversed(array)): 34 | print(f"{i, n}", end=" ") 35 | print() 36 | 37 | for i, n in reversed(list(enumerate(array))): # 内外翻转 38 | print(f"{i, n}", end=" ") 39 | print() 40 | -------------------------------------------------------------------------------- /017 翻转序列/test.py: -------------------------------------------------------------------------------- 1 | arr = [1, 2, 4, 5] 2 | for i, n in enumerate(reversed(arr)): 3 | print(i, n) 4 | ... 5 | for i, n in reversed(list(enumerate(arr))): 6 | print(i, n) 7 | -------------------------------------------------------------------------------- /018 内置排序和自定义排序/main.py: -------------------------------------------------------------------------------- 1 | from functools import cmp_to_key 2 | 3 | arr = [3, 1, 4, 1, 5, 9, 2, 6] 4 | 5 | # 区别 6 | # sorted(arr) 7 | # arr.sort() 8 | 9 | arr2 = [(1, 2), (2, 2), (5, 0)] 10 | 11 | arr2.sort(key=lambda item: item[0], reverse=True) 12 | print(arr2) 13 | arr2.sort(key=lambda item: item[1], reverse=True) 14 | print(arr2) 15 | 16 | 17 | def cmp(a, b): 18 | # return 1 表示 a 应该比 b 大 19 | # return -1 表示 b 比 a 大 20 | # return 0 表示 一样大 21 | if a[0] > b[0]: 22 | return 1 23 | elif a[0] < b[0]: 24 | return -1 25 | else: 26 | if a[1] > b[1]: 27 | return 1 28 | elif a[1] < b[1]: 29 | return -1 30 | else: 31 | return 0 32 | 33 | 34 | from random import randint 35 | 36 | arr3 = [(randint(1, 100), randint(1, 100)) for _ in range(100)] 37 | 38 | print(arr3) 39 | print(sorted(arr3, key=cmp_to_key(cmp))) 40 | -------------------------------------------------------------------------------- /018 内置排序和自定义排序/test.py: -------------------------------------------------------------------------------- 1 | from functools import cmp_to_key 2 | from random import randint 3 | 4 | arr2 = [(1, 2), (2, 2), (5, 0)] 5 | 6 | 7 | def cmp(a, b): 8 | if a[0] > b[0]: 9 | return 1 10 | elif a[0] < b[0]: 11 | return -1 12 | else: 13 | if a[1] > b[1]: 14 | return 1 15 | elif a[1] < b[1]: 16 | return -1 17 | else: 18 | return 0 19 | 20 | 21 | arr3 = [(randint(1, 100), randint(1, 100)) for _ in range(100)] 22 | arr3.sort(key=cmp_to_key(cmp), reverse=True) 23 | print(arr3) 24 | -------------------------------------------------------------------------------- /019 数字大总结/main.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/019 数字大总结/main.pptx -------------------------------------------------------------------------------- /019 数字大总结/math库里的大数字.py: -------------------------------------------------------------------------------- 1 | # import mpmath # 这个是一个第三方库了,先不管了 2 | import math 3 | import cmath 4 | 5 | print(math.e) 6 | 7 | print(math.nan, type(math.nan)) 8 | print(math.nan + 5) 9 | print(math.nan + math.nan) 10 | # print(math.nan + "???") # 不能这样 11 | # print("???" + math.nan) 12 | # print(f"({math.nan})") 13 | 14 | 15 | # math和cmath区别 16 | 17 | print(dir(math)) 18 | print(dir(cmath)) 19 | s1 = {1, 2, 3} 20 | s2 = {2, 3, 4} 21 | print(s1 ^ s2) # 两者不同的 22 | print(s1 - s2) # s1有,s2没有的 23 | print(s2 - s1) # s2有,s1没有的 24 | 25 | cmathSet = set(dir(cmath)) 26 | mathSet = set(dir(math)) 27 | print("cmath 独有的", cmathSet - mathSet) 28 | print("math 独有的", mathSet - cmathSet) 29 | 30 | # cmath 里含有虚数 'nanj', 'infj' 31 | print(cmath.polar(1 + 1j)) 32 | 33 | # 向上取整,向下取整可以int。 34 | 35 | print(math.gcd(6, 3)) # 3.9 里变成了不定长参数类型了 36 | print(math.hypot(3, 4)) # 勾股定理函数 37 | print(math.log(5, 5)) 38 | print(math.log(5, 25)) 39 | print(math.log(25, 5)) 40 | print(math.log(125, 5)) # 3.0000000000000004 稍微有点误差 41 | print(math.log10(1000)) # 3.0 42 | # print(math.log10(-1)) 43 | 44 | print(math.log2(8)) # 3 45 | print(math.log1p(math.e - 1)) # 以e为底,传入的参数自动+1了 46 | 47 | # 可以比较sqrt和**0.5谁更快 48 | print(math.sqrt(16) == 16 ** 0.5) 49 | # e ** x 和 exp 谁快 50 | print(math.e ** 5 == math.exp(5)) 51 | 52 | print(math.degrees(math.pi)) # 转角度 写前端的时候经常写 30deg,90deg 所以deg是转角度 53 | print(math.radians(30)) # 转弧度 54 | 55 | math.cosh(3) # 悬链线 56 | 57 | -------------------------------------------------------------------------------- /019 数字大总结/一些有意义的大数.py: -------------------------------------------------------------------------------- 1 | """ 2 | 收集一些有意义的大数以便对比理解 3 | 加深印象 4 | """ 5 | 6 | """ 7 | 207_3600 1080p像素点个数 8 | 9 | 1677_7216 RGB所有可能的颜色种类 10 | 11 | 21亿 C语言中的int类型上限 2147483647 12 | 13 | 77亿 全世界总人口 14 | 15 | 4000亿 银河系恒星数量 16 | 17 | 40万亿 人体细胞数量 18 | 19 | 9e18 C语言longlong上限 9223372万亿 9223372036854775807 20 | 21 | 3e21 斐波那契数列第100项 22 | 23 | 1e31 2的100次方 1267650600228229401496703205376 24 | 25 | 3e38 float类型最大值 26 | 27 | 10e50 地球上的原子总数 28 | 29 | 1e77 2的256次方,哈希 30 | 31 | 1e80 宇宙中原子总数 32 | 33 | 1e158 100! 100的阶乘 34 | 35 | 1e173 围棋的所有可能数 36 | 37 | 1e208 斐波那契数列第1000项 38 | 39 | 1.7e308 double类型最大值 40 | 41 | 1e2568 1000! 1000的阶乘 42 | 43 | 44 | 葛立恒数 45 | """ 46 | 47 | fab = [1, 1] 48 | fab.extend(fab[-1] + fab[-2] for _ in range(1000)) 49 | print(fab[999]) 50 | -------------------------------------------------------------------------------- /019 数字大总结/保留小数.py: -------------------------------------------------------------------------------- 1 | newNum = 0.556878 2 | print("%.2f" % newNum) 3 | 4 | 5 | -------------------------------------------------------------------------------- /019 数字大总结/小整数池.py: -------------------------------------------------------------------------------- 1 | # 小整数内存池 -5 ~ 256 2 | print(id(1)) 3 | print(id(2)) 4 | print(id(3)) 5 | 6 | print(id(25555), id(25555)) 7 | print(id(69999999999999999999999999999), id(69999999999999999999999999999)) 8 | # ???? 这不是在打我脸吗 9 | 10 | nums = [69999999999999999999999999999, 69999999999999999999999999999, 9999, 10000] 11 | print(id(nums[0]), id(nums[1])) # 恒等 12 | print(id(nums[2]), id(nums[3])) 13 | nums[2] += 1 14 | print(id(nums[2]), id(nums[3])) # 9999 变成 10000 之后,地址变了,但是地址不是最后一个10000相等的地址 15 | -------------------------------------------------------------------------------- /020 try catch完整写法/main.py: -------------------------------------------------------------------------------- 1 | import traceback 2 | 3 | 4 | def f(): 5 | print(1 / 0) 6 | ... 7 | 8 | 9 | # 范围逐渐扩大原理 10 | 11 | 12 | try: 13 | f() 14 | except (ValueError, NameError): 15 | ... 16 | except Exception as e: # 如果写成其他的样子,会有警告 17 | print(e) 18 | traceback.print_exc() # 更全面的方式 19 | else: 20 | ... 21 | finally: 22 | ... 23 | 24 | for i in range(10): 25 | print(i) 26 | 27 | # heapq内置库代码 28 | # Short-cut for n==1 is to use max() 29 | # if n == 1: 30 | # it = iter(iterable) 31 | # sentinel = object() 32 | # if key is None: 33 | # result = max(it, default=sentinel) 34 | # else: 35 | # result = max(it, default=sentinel, key=key) 36 | # return [] if result is sentinel else [result] 37 | # 38 | # # When n>=size, it's faster to use sorted() 39 | # try: 40 | # size = len(iterable) 41 | # except (TypeError, AttributeError): 42 | # pass 43 | -------------------------------------------------------------------------------- /021 跳出多层循环/else.py: -------------------------------------------------------------------------------- 1 | """ 2 | 大家都熟悉的 3 | if else 4 | if elif else 5 | if elif elif elif.....elif else 6 | 接下来是python独特的 7 | """ 8 | 9 | arr = [1, 2, 3, 4, 5, 6, 7, 8] 10 | 11 | haveThree = False 12 | for n in arr: 13 | if n == 3: 14 | haveThree = True 15 | break 16 | if haveThree: 17 | print("有三") 18 | else: 19 | print("没有三") 20 | 21 | for n in arr: 22 | if n == 3: 23 | break 24 | print(n) 25 | else: 26 | print("没有3") 27 | print("有三") 28 | 29 | from collections import deque 30 | 31 | q = deque() 32 | q.append(1) 33 | while q: 34 | print(q) 35 | n = q.popleft() 36 | if n == 10: 37 | break 38 | q.append(n + 1) 39 | q.append(n + 5) 40 | ... 41 | else: 42 | print("没有发生break") 43 | 44 | # for else 语句是一种python特有的结构 45 | 46 | try: 47 | a = 15 / 5 48 | except: 49 | # 发生错误之后执行代码 50 | ... 51 | else: 52 | # 没有发生错误执行代码 53 | ... 54 | 55 | # try: 56 | # ... 57 | # 58 | # else: 59 | # # try 后面必须跟except,不能缺少 60 | # ... 61 | -------------------------------------------------------------------------------- /022 赋值、复制、深拷贝/dictCopy.py: -------------------------------------------------------------------------------- 1 | # a = {'a': 2, 'b': 3} 2 | # 3 | # b = a 4 | # b['a'] += 1 5 | # print(a, b) 6 | 7 | # a = {'a': 2, 'b': 3} 8 | # 9 | # b = a.copy() 10 | # b['a'] += 1 11 | # print(a, b) 12 | 13 | # a = {'a': [1, 1, 2, 3], 'b': [2, 2, 4, 5]} 14 | # 15 | # b = a.copy() 16 | # b['a'].append(999) 17 | # print(a, b) # 遭了 18 | 19 | from copy import deepcopy 20 | 21 | a = {'a': [1, 1, 2, 3], 'b': [2, 2, 4, 5]} 22 | b = deepcopy(a) 23 | b['a'].append(999) 24 | print(a, b) 25 | -------------------------------------------------------------------------------- /022 赋值、复制、深拷贝/listCpy.py: -------------------------------------------------------------------------------- 1 | # arr = [1, 2, 3, 4] 2 | # arr2 = arr 3 | # print(arr, arr2) 4 | # 5 | # arr[0] = 1000 6 | # 7 | # print(arr, arr2) 8 | 9 | # 两个都变了 10 | 11 | 12 | # arr = [1, 2, 3, 4] 13 | # arr2 = arr.copy() 14 | # print(arr, arr2) 15 | # 16 | # arr[0] = 1000 17 | # 18 | # print(arr, arr2) 19 | # 20 | # # 可以了,但是还有隐患 21 | 22 | # arr = [1, 2, 3, 4] 23 | # # arr2 = arr[::] # 不至于,看着像腹肌 24 | # arr2 = arr[:] 25 | # print(arr, arr2) 26 | # 27 | # arr[0] = 1000 28 | # 29 | # print(arr, arr2) 30 | 31 | # arr = [[1, 2, 3], 4, 5] 32 | # arr2 = arr.copy() 33 | # print(arr, arr2) 34 | # arr[1] *= 2 35 | # print(arr, arr2) 36 | # # ok 37 | # arr[0].clear() 38 | # print(arr, arr2) 39 | # # no no no 40 | 41 | # arr = [[1, 2, 3], 4, 5] 42 | # arr2 = arr[:] 43 | # print(arr, arr2) 44 | # arr[1] *= 2 45 | # print(arr, arr2) 46 | # # ok 47 | # arr[0].clear() 48 | # print(arr, arr2) 49 | # # no no no 也不行的 50 | 51 | 52 | import copy 53 | 54 | # arr = [[1, 2, 3], 4, 5] 55 | # arr2 = copy.copy(arr) 56 | # arr[0].clear() 57 | # print(arr, arr2) 58 | 59 | 60 | arr = [[1, 2, 3], 4, 5] 61 | arr2 = copy.deepcopy(arr) 62 | arr[0].clear() 63 | print(arr, arr2) 64 | -------------------------------------------------------------------------------- /022 赋值、复制、深拷贝/setCopy.py: -------------------------------------------------------------------------------- 1 | # s1 = {1, 2, 3} 2 | # s2 = s1 3 | # 4 | # s1.add(1000) 5 | # print(s1, s2) # no 6 | 7 | 8 | # s1 = {1, 2, 3} 9 | # s2 = s1[:] # No! 10 | # s1.add(1000) 11 | # print(s1, s2) 12 | 13 | 14 | # s1 = {1, 2, 3} 15 | # s2 = s1.copy() 16 | # s1.add(1000) 17 | # print(s1, s2) 18 | 19 | # s1 = {1, [1, 2, 3], 3} # 集合里面的类型都是不可变的,所以不用担心拷贝的问题,只用浅拷贝就行 20 | s1 = {1, (1, 2, 3), 3} 21 | s2 = s1.copy() 22 | s1.remove((1, 2, 3)) 23 | print(s1, s2) 24 | 25 | from copy import deepcopy 26 | -------------------------------------------------------------------------------- /022 赋值、复制、深拷贝/strcopy.py: -------------------------------------------------------------------------------- 1 | s = "banana" 2 | s2 = s 3 | s2 += "bbb" 4 | # s2 = s2 + "bbb" 5 | print(s, s2) 6 | 7 | # 字符串不可变 8 | 9 | 10 | -------------------------------------------------------------------------------- /022 赋值、复制、深拷贝/test.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | from random import randint 3 | from time import perf_counter 4 | 5 | string = "" 6 | for _ in range(100_0000): 7 | # 可以随便加下划线,不能连续加两个 8 | string += str(randint(0, 9)) 9 | ... 10 | 11 | print(string) 12 | t1 = perf_counter() 13 | 14 | dic = {} 15 | for char in string: 16 | if char in dic: 17 | dic[char] += 1 18 | else: 19 | dic[char] = 1 20 | 21 | t2 = perf_counter() 22 | dic2 = Counter(string) 23 | t3 = perf_counter() 24 | print(t2 - t1, t3 - t2) # 快四倍左右 25 | -------------------------------------------------------------------------------- /022 赋值、复制、深拷贝/tupleCpy.py: -------------------------------------------------------------------------------- 1 | import copy 2 | 3 | tup = (1, [2], 2) 4 | tup2 = tup 5 | 6 | tup[1].append(1) 7 | print(tup, tup2) 8 | 9 | tup1 = (1, 2) 10 | tup2 = tup1 11 | tup1 += (1,) 12 | print(tup1, tup2) 13 | 14 | tup = (1, [2], 2) 15 | tup2 = copy.deepcopy(tup) 16 | 17 | tup[1].append(1) 18 | print(tup, tup2) 19 | 20 | # 当然一般很少这么套的 21 | -------------------------------------------------------------------------------- /023 无穷大的应用inf/关于无穷大的方法.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | arr = [ 4 | float("inf"), 5 | float("-inf"), 6 | -float("inf"), 7 | -----------------------------float("inf"), 8 | 9 | # 大小写随便玩 10 | float("INF"), 11 | float("Inf"), 12 | float("iNf"), 13 | float("inF"), 14 | # float("Infity"), 15 | type(float("inf")), # float 类型 16 | ] 17 | 18 | print(math.inf) 19 | print(type(math.inf)) 20 | print(float("INF") == math.inf) 21 | # print(float("INF") is math.inf) 22 | print(id(float("INF")), id(math.inf)) 23 | 24 | arr2 = [math.inf, math.inf, float("INF"), float("inF"), -float("-INF")] 25 | 26 | print("----") 27 | for obj in arr2: 28 | print("\t", id(obj)) 29 | print("----") 30 | # math库里的对象都是一个地址,但是float直接生成出来的都是不一样的 31 | # 想节省内存的话,可能用math库里的更好 32 | # 如果只是简单用到一两个,可以不用import math库,直接写float 33 | 34 | # 关于无穷的一些运算 35 | print(float("INF") == float("INF") + 1) 36 | 37 | arr3 = [1, 2, 4, 7, 2, 6, 2, 5] 38 | res = float("-INF") 39 | for n in arr3: 40 | if n > res: 41 | res = n 42 | print(res) 43 | 44 | -------------------------------------------------------------------------------- /024 默认字典/默认字典.py: -------------------------------------------------------------------------------- 1 | import itertools 2 | import random 3 | from collections import defaultdict 4 | 5 | ddic = defaultdict() 6 | 7 | string = "qwertyuiop" 8 | for char in string: 9 | ddic[char] = 1 10 | 11 | print(ddic) 12 | print(ddic.keys()) 13 | 14 | # 用于实现字典套列表,字典套集合,就可以表示图的结构 15 | b = defaultdict(list) 16 | # b["第一个"] = '一个字符串' 17 | b["第二个"].append(1) 18 | 19 | print(b) 20 | 21 | graph = defaultdict(set) 22 | """ 23 | for i in range(10): 24 | for _ in range(3): 25 | graph[i].add(random.randint(1, 10)) 26 | """ 27 | 28 | # 上面的代码可以简化成下面 29 | for i, _ in itertools.product(range(10), range(3)): 30 | graph[i].add(random.randint(1, 10)) 31 | print(graph) 32 | 33 | numIndex = defaultdict(int) # 默认返回0 34 | 35 | 36 | -------------------------------------------------------------------------------- /025 切片和自定义切片/lipu.py: -------------------------------------------------------------------------------- 1 | class A: 2 | def __init__(self): 3 | self.val = [i for i in range(100)] 4 | 5 | def __getitem__(self, arg): 6 | print(arg) 7 | argType = type(arg) 8 | if argType == tuple: 9 | print(len(arg)) 10 | res = self.val 11 | for item in arg: 12 | res = res[item] 13 | return res 14 | elif argType == slice: 15 | return self.val[arg] 16 | elif argType == int: 17 | return self.val[arg] 18 | else: 19 | print("不可以哦") 20 | 21 | def __str__(self): 22 | return f"{self.val}" 23 | 24 | 25 | a = A() 26 | # 我疯了 27 | print(a[5, 5, "abc", (1, 2)]) 28 | # 我更离谱了 29 | print(a[a]) 30 | 31 | 32 | -------------------------------------------------------------------------------- /025 切片和自定义切片/main.py: -------------------------------------------------------------------------------- 1 | a = [i for i in range(10)] 2 | 3 | print(a[:]) 4 | 5 | print(a[::]) 6 | 7 | # print(a[::, :]) 8 | 9 | s = slice(1, 5) 10 | 11 | # s_ = [1:5] # 不能单独提出去 12 | 13 | print(a[s]) 14 | 15 | print(s.start) 16 | print(s.stop) 17 | print(s.step) 18 | 19 | s2 = slice(1) 20 | print(s2.start, s2.stop, s2.step) 21 | 22 | # print(a[:5, 5:]) 23 | 24 | print([i for i in range(100)][::3][::-1]) 25 | print([i for i in range(100)][::-3]) 26 | print([i for i in range(100)][::-0x2]) 27 | print([i for i in range(100)][True + True:True * 10:]) 28 | print("<<", [i for i in range(100)][True + True:True << 5:]) 29 | 30 | # [a: b: c] 31 | """ 32 | a 开始下标 -1表示最后一个元素 33 | b 结束下标 34 | c 步长,如果是负数,就再翻转一下,如果是0,就不选择了 35 | """ 36 | 37 | print([i for i in range(100)][-20: 20]) # start 和end空了,没有交集了 38 | print([i for i in range(10)][-10: -1]) 39 | print([i for i in range(10)][5: -2]) 40 | print([i for i in range(10)][5: -10]) # 越界自动为空 41 | print([i for i in range(10)][500: -10]) # 越界为空 42 | 43 | 44 | # 步长为负数的时候的顺序问题 待研究 45 | print([i for i in range(10)][2:5:]) 46 | print([i for i in range(10)][2:5:2]) 47 | print([i for i in range(10)][2:5:-1]) # [] 48 | print([i for i in range(10)][2:5][::-1]) # [] 49 | -------------------------------------------------------------------------------- /025 切片和自定义切片/test.py: -------------------------------------------------------------------------------- 1 | class A: 2 | def __init__(self): 3 | self.arr = [i for i in range(10)] 4 | 5 | def __getitem__(self, item): 6 | if type(item) == tuple: 7 | for obj in item: 8 | print(obj) 9 | if type(item) is int: 10 | return self.arr[item] 11 | else: 12 | print(item) 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /025 切片和自定义切片/自定义对象的切片.py: -------------------------------------------------------------------------------- 1 | class A: 2 | def __init__(self): 3 | self.val = [i for i in range(100)] 4 | 5 | def __getitem__(self, arg): 6 | print(arg) 7 | argType = type(arg) 8 | if argType == tuple: 9 | print(len(arg)) 10 | res = self.val 11 | for item in arg: 12 | res = res[item] 13 | return res 14 | elif argType == slice: 15 | return self.val[arg] 16 | elif argType == int: 17 | return self.val[arg] 18 | 19 | def __str__(self): 20 | return f"{self.val}" 21 | 22 | 23 | a = A() 24 | # print(a) 25 | print(a[:5]) 26 | # print(a[5:10, :]) 27 | # 多重切片 28 | print(a[5:, 5:, 5:]) 29 | -------------------------------------------------------------------------------- /026 组合数combination/test.py: -------------------------------------------------------------------------------- 1 | # 暴力枚举算法 2 | from itertools import combinations 3 | 4 | 5 | def test(): 6 | doSomeThings = ["剪指甲", "哼歌", "拉粑粑", "喝水", "做扩胸运动", "嚼口香糖", "动耳朵", "嘴里含着人参"] 7 | for i in range(1, 8 + 1): 8 | for item in combinations(doSomeThings, i): 9 | print(item) 10 | 11 | 12 | test() 13 | -------------------------------------------------------------------------------- /026 组合数combination/二进制的应用.py: -------------------------------------------------------------------------------- 1 | # 二进制的应用,一个序列里的所有组合 2 | # 暴力枚举算法 3 | def test(): 4 | doSomeThings = ["剪指甲", "哼歌", "拉粑粑", "喝水", "做扩胸运动", "嚼口香糖", "动耳朵", "嘴里含着人参"] 5 | print("start:", 0b0000000) # 一个都不做 6 | print("end:", 0b1111111) # 同时做 7 | for n in range((len(doSomeThings) + 1) ** 2): 8 | print(bin(n)) 9 | string = bin(n)[2:] 10 | things = [doSomeThings[i] for i, char in enumerate(string) if char == "1"] 11 | print("一边".join(things)) 12 | 13 | 14 | # 其实可以用组合来做。 15 | # from itertools import combinations 16 | 17 | def test2(): 18 | doSomeThings = ["剪指甲", "哼歌", "拉粑粑", "喝水", "做扩胸运动", "嚼口香糖", "动耳朵", "嘴里含着人参"] 19 | for n in range((len(doSomeThings) + 1) ** 2): 20 | # 00000000 21 | # 01011010 22 | things = [] 23 | for i in range(len(doSomeThings)): 24 | res = n >> i & 1 25 | if res == 1: 26 | things.append(doSomeThings[i]) 27 | print(" 同时 ".join(things)) 28 | 29 | 30 | # # 获取一个二进制所有位 31 | # a = int("01011010", 2) 32 | # print(a) 33 | # for dig in range(8): 34 | # print(bin(a >> dig), a >> dig & 1) 35 | 36 | test2() 37 | -------------------------------------------------------------------------------- /027 两种打印彩色文字的方式/main.py: -------------------------------------------------------------------------------- 1 | print(f"\033[1;31;40m要打印的文字\033[0m") 2 | 3 | # \033[ 1 ; 31 ; 40 m {要打印的文字} \033[0m 4 | 5 | # 显示方式;前景色;背景色 6 | 7 | # 显示方式:0 1高亮 4下划线 7反色 8 | 9 | """ 10 | 前景 11 | 黑 红 绿 黄 蓝 紫 青 白 12 | 30 31 32 .。。。。。。。。。 37 13 | 背景 14 | 黑 红 绿 黄 蓝 紫 青 白 15 | 40 41 .。。。。 。。。。47 16 | """ 17 | print(f"\033[1;32;40m哥们,这瓜多少钱一斤呐?\033[0m") 18 | print(f"\033[1;37;42m两块钱一斤\033[0m") 19 | print(f"\033[1;32;40mWhat's up\033[0m") 20 | 21 | input("end....") 22 | 23 | 24 | -------------------------------------------------------------------------------- /027 两种打印彩色文字的方式/printInCmd.py: -------------------------------------------------------------------------------- 1 | import ctypes 2 | import sys 3 | 4 | __STD_OUTPUT_HANDLE = -11 5 | __std_out_handle = ctypes.windll.kernel32.GetStdHandle(__STD_OUTPUT_HANDLE) 6 | BLUE = 0x09 # blue. 9 7 | GREEN = 0x0a # green. 10 8 | RED = 0x0c # red. 11 9 | YELLOW = 0x0e # yellow. 10 | 11 | 12 | def setColor(color): 13 | return ctypes.windll.kernel32.SetConsoleTextAttribute(__std_out_handle, color) 14 | 15 | 16 | # setColor(__FOREGROUND_RED | __FOREGROUND_GREEN | __FOREGROUND_BLUE) # 白色 | 是位运算中的或运算 17 | setColor(RED) 18 | sys.stdout.write("sdjflksadjlf" + '\n') 19 | setColor(GREEN) 20 | sys.stdout.write("mess" + '\n') 21 | setColor(BLUE) 22 | sys.stdout.write("mess" + '\n') 23 | setColor(BLUE | YELLOW) 24 | sys.stdout.write("mess" + '\n') 25 | 26 | 27 | input() -------------------------------------------------------------------------------- /028 product展平多重循环/deepTest.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm deepTest 4 | 2022年06月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from itertools import product 9 | 10 | 11 | def a(): 12 | c = 0 13 | for i in range(100): 14 | for j in range(100): 15 | for k in range(100): 16 | for l in range(100): 17 | c += 1 18 | 19 | 20 | def b(): 21 | d = 0 22 | for i, j, k, l in product(range(100), range(100), range(100), range(100)): 23 | d += 1 24 | 25 | 26 | def main(): 27 | import dis 28 | dis.dis(a) 29 | print("-" * 100) 30 | dis.dis(b) 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /028 product展平多重循环/speedTest.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm speedTest 4 | 2022年06月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | from itertools import product 10 | from time import perf_counter 11 | 12 | 13 | def main(): 14 | t1 = perf_counter() 15 | c = 0 16 | d = 0 17 | 18 | for i, j, k, l in product(range(100), range(100), range(100), range(100)): 19 | d += 1 20 | 21 | t2 = perf_counter() 22 | 23 | for i in range(100): 24 | for j in range(100): 25 | for k in range(100): 26 | for l in range(100): 27 | c += 1 28 | 29 | t3 = perf_counter() 30 | 31 | print(t2 - t1, t3 - t2) 32 | # 0.9892027 2.1248509 33 | # 3.8394042 4.7534811999999995 34 | # 经过测试发现反而慢了 35 | 36 | return None 37 | 38 | 39 | if __name__ == "__main__": 40 | main() 41 | -------------------------------------------------------------------------------- /028 product展平多重循环/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年06月10日 5 | by littlefean 6 | """ 7 | 8 | import itertools 9 | 10 | 11 | def main(): 12 | for x, y, z, i in itertools.product(range(10), range(10), range(10), range(3)): 13 | if x == y == 50: 14 | break 15 | print(x, y, z) 16 | 17 | return None 18 | 19 | 20 | if __name__ == "__main__": 21 | main() 22 | -------------------------------------------------------------------------------- /029 小顶堆heapq/050 优先队列/main.py: -------------------------------------------------------------------------------- 1 | import queue 2 | 3 | priQue = queue.PriorityQueue() 4 | priQue.put([3, "赵"]) 5 | print(priQue.queue) 6 | priQue.put([2, "钱"]) 7 | print(priQue.queue) 8 | priQue.put([1, "孙"]) 9 | print(priQue.queue) 10 | priQue.put([7, "李"]) 11 | print(priQue.queue) 12 | priQue.put([5, "周"]) 13 | print(priQue.queue) 14 | while priQue: 15 | print(priQue.get()) 16 | -------------------------------------------------------------------------------- /029 小顶堆heapq/demo.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm demo 4 | 2022年06月04日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from heapq import * 9 | 10 | 11 | # https://leetcode.cn/problems/sliding-window-maximum/ 239. 滑动窗口最大值 12 | def main(): 13 | arr = [3, 2, 1, 4, 2, 3, 1, 6] 14 | # print(nsmallest(3, arr)) 15 | # heapify(arr) 16 | # print(arr) 17 | # 我想要做到一种效果 18 | # 一种数据结构,插入很快,删除元素很快,返回最大值最小值也很快 19 | 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /029 小顶堆heapq/main.py: -------------------------------------------------------------------------------- 1 | import heapq 2 | from random import randint 3 | 4 | h = [-randint(1, 100) for _ in range(8)] 5 | print(h) 6 | heapq.heapify(h) # 这个函数没有返回值,直接传递列表改变列表 7 | print(h) 8 | while h: 9 | a = -heapq.heappop(h) 10 | print(a) 11 | # print(h) 12 | 13 | # 14 | # https://leetcode.cn/problems/qn8gGX/ 15 | 16 | 17 | # 序列比较默认比较的是第一个元素 18 | 19 | print(heapq.nlargest(2, [1, 2, 3, 4, 5, 3, 2, 1])) 20 | -------------------------------------------------------------------------------- /029 小顶堆heapq/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年06月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import heapq 9 | 10 | 11 | class Person: 12 | def __init__(self, name, n): 13 | self.name = name 14 | self.n = n 15 | 16 | def __repr__(self): 17 | return f"<{self.name}>" 18 | 19 | 20 | def main(): 21 | arr = [Person("a", 5), Person("b", 10), Person("c", 4), Person("d", 3), Person("e", 1)] 22 | newList = [(-item.n, item) for item in arr] 23 | heapq.heapify(newList) 24 | print(newList) 25 | print(newList[0]) 26 | 27 | # print(heapq.heappop(newList)) 28 | number, p = heapq.heappop(newList) 29 | number *= -1 30 | print(number, p) 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /029 小顶堆heapq/和优先队列的区别.py: -------------------------------------------------------------------------------- 1 | from queue import PriorityQueue 2 | import heapq 3 | 4 | arr = [1, 3, 4, 6, 2, 5, 6, 8, 3, 2] 5 | print(arr) 6 | heapq.heapify(arr) 7 | print(arr) 8 | a = heapq.heappop(arr) 9 | print(arr) 10 | heapq.heappush(arr, 5) 11 | print(arr) 12 | 13 | q = PriorityQueue() 14 | q.put(1) 15 | q.put(3) 16 | q.put(4) 17 | q.put(6) 18 | q.put(5) 19 | print(q.queue) 20 | q.get() 21 | print(q.queue) 22 | 23 | # ======= 速度测试 24 | print("=" * 100) 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /030 用any、all对序列进行与或判断/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年06月20日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | res = any(item % 5 == 0 for item in range(1, 100)) 12 | 13 | print(res) 14 | 15 | return None 16 | 17 | 18 | if __name__ == "__main__": 19 | main() 20 | -------------------------------------------------------------------------------- /031 高精度小数运算-有理数和Decimal/f.py: -------------------------------------------------------------------------------- 1 | import decimal 2 | 3 | from decimal import * 4 | 5 | 6 | def main(): 7 | decimal.getcontext().prec = 20 8 | N = 100 9 | for i in range(1, N - 1): 10 | for j in range(i + 1, N): 11 | f = Decimal(i) / Decimal(j) 12 | print(f"{i}/{j}", f) 13 | 14 | return None 15 | 16 | 17 | if __name__ == "__main__": 18 | main() 19 | -------------------------------------------------------------------------------- /031 高精度小数运算-有理数和Decimal/tes.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm tes 4 | 2022年06月20日 5 | by littlefean 6 | """ 7 | import decimal 8 | from typing import * 9 | from decimal import * 10 | from fractions import Fraction 11 | 12 | 13 | def main(): 14 | decimal.getcontext().prec = 150 15 | 16 | n = Fraction(1, 3) 17 | n2 = Fraction(3, 123) 18 | print(n + 6) 19 | print(Decimal(n.numerator) / Decimal(n.denominator)) 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /031 高精度小数运算-有理数和Decimal/test.py: -------------------------------------------------------------------------------- 1 | import fractions 2 | import decimal 3 | 4 | 5 | a = fractions.Fraction(1, 5) 6 | print(a) 7 | a += 5 8 | print(a) 9 | 10 | print(a.numerator) 11 | print(a.denominator) 12 | 13 | # a3 = fractions.Fraction(1, 3) 14 | a3 = fractions.Fraction(1, 7) 15 | print(a3) 16 | print(float(a3)) 17 | print(decimal.Decimal(1) / decimal.Decimal(3)) 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /032 字符串f-string/fString3.8.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm fString3.11 4 | 2022年07月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # python 3.8 12 | a = 115 13 | print(f"{a=}") 14 | print(f"{a =}") 15 | print(f"{a = }") 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /032 字符串f-string/r了之后怎么tab.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm r了之后怎么tab 4 | 2022年07月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | a = r"\\\\\\\123123" 12 | b = r"aaab\tsss" 13 | b = r"aaab\\tsss" 14 | b = "aaab\tsss" 15 | c = r"D:\WpSy stem" 16 | # pycharm 里面加tab 不能按 17 | for char in c: 18 | if char == "\t": 19 | print("是tab") 20 | print(c) 21 | print(b) 22 | return None 23 | 24 | 25 | if __name__ == "__main__": 26 | main() 27 | -------------------------------------------------------------------------------- /032 字符串f-string/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | c = """ 10 |
11 |
周常事件
12 |
倒数日
13 |
""" 14 | 15 | 16 | def main(): 17 | # n = 155 18 | # b = 135 19 | # print("{{{{{]}}}}") 20 | # print(f"{(n + 15) / 2}=={{=={b}") 21 | # print(u"SD劳烦赛道囧蛋劳烦;塞道具房东劳烦桑代克") 22 | # print(b"1011010101010101") 23 | # # 3.8 24 | # print(f"{n = } {b = }") 25 | 26 | b = "?" * 2 27 | a = f"我是人{f'!{b}' * 3}" 28 | print(a) 29 | return None 30 | 31 | 32 | if __name__ == "__main__": 33 | main() 34 | -------------------------------------------------------------------------------- /032 字符串f-string/前导字母.py: -------------------------------------------------------------------------------- 1 | # 可能容易枯燥,需要加点生动的栗子 2 | 3 | # 字符串前面加个字母有什么意思 4 | 5 | b = "bbb" 6 | # f 7 | a = f"abc{b}def" 8 | a2 = f"abc{b}def{{a}}" 9 | 10 | # r 11 | c = r"D:\a.txt" 12 | c1 = "D:\\a.txt" 13 | 14 | # rf一起写,顺序无所谓 15 | ab = rf"{c1}\t" 16 | ba = fr"{c}\t" 17 | 18 | # r 了之后其他的\t\n怎么办 19 | st = r"我我我\t她她她" 20 | 21 | # u 22 | """ 23 | 字符串前加 u 24 | 25 | 例:u"我是含有中文字符组成的字符串。" 26 | 加了u前缀和没有加前缀的效果相同 27 | 作用: 28 | 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。 29 | 应用: 30 | 在与工程默认编码格式不同的时候,使用此方法来避免编码的问题 31 | """ 32 | 33 | abb = u"这是中文" 34 | 35 | # b是转化成二进制 36 | # d = b"喔喔我" # bytes can only contain ASCII literal characters. 37 | d = b"this is english" 38 | print(d) 39 | print(type(d)) 40 | bytes() 41 | 42 | code = "我是一个东西" 43 | print("encode:", code.encode("utf-8")) 44 | dd = b"01101000" 45 | print(dd) 46 | 47 | cc = bytearray(dd) 48 | print(cc, type(cc)) 49 | -------------------------------------------------------------------------------- /032 字符串f-string/前导字母交换顺序.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 前导字母交换顺序 4 | 2022年07月04日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | a = 15 12 | print(f"{a=}") 13 | return None 14 | 15 | 16 | if __name__ == "__main__": 17 | main() 18 | -------------------------------------------------------------------------------- /032 字符串f-string/字符串基本写法.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 字符串基本写法 4 | 2022年07月01日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | a = "hello word" 12 | b = 'hello word' 13 | # 多行写法,有点难看 14 | c = """abababa 15 | abab""" 16 | d = '''dsjsad 17 | sds 18 | dssd''' 19 | # 在写html代码字符串动态插入的时候可能有点用 20 | 21 | 22 | print(c) 23 | print(d) 24 | return None 25 | 26 | 27 | if __name__ == "__main__": 28 | main() 29 | -------------------------------------------------------------------------------- /033 字符串转义字符总结/js.json: -------------------------------------------------------------------------------- 1 | "{'objName': 'name', 'objStr': \"{'arr': ['a', 'b', 'c'], 'age': 50}\"}" -------------------------------------------------------------------------------- /033 字符串转义字符总结/jsonStr.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm jsonSt5r 4 | 2022年07月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import json 9 | 10 | 11 | def main(): 12 | with open("js.json", "w", encoding="utf-8") as f: 13 | f.write(json.dumps( 14 | str({ 15 | "objName": "name", 16 | "objStr": str({ 17 | "arr": ["a", "b", "c"], 18 | "age": 50 19 | }) 20 | }) 21 | )) 22 | 23 | b"\xff\xaa" 24 | print() 25 | "中文" 26 | a = 111 27 | return None 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /033 字符串转义字符总结/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import requests 9 | 10 | headers = { 11 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)' 12 | ' Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE' 13 | } 14 | 15 | 16 | def main(): 17 | print(chr(97)) 18 | print(ord("a")) 19 | 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /034 字符串编码问题与编码转换/编码表.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 编码表 4 | 2022年07月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff. 12 | N = 0x10ffff 13 | print(N) # 111_4111 14 | # 100 多万,这个chr是unicode编码 15 | 16 | # todo unicode编码和utf-8有什么区别和联系 17 | 18 | # todo ascii的前一部分是不是utf-8的子集 19 | 20 | # todo ascii和utf-8字符占用空间差异多大 21 | 22 | # todo utf-8 和utf-16 有什么区别 23 | 24 | # chr 和 ord 都是unicode的转化 25 | # ord("a") 26 | for i in range(256): 27 | print(i, chr(i)) 28 | 29 | return None 30 | 31 | 32 | if __name__ == "__main__": 33 | main() 34 | -------------------------------------------------------------------------------- /034 字符串编码问题与编码转换/编码转换.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 字符转化 4 | 2022年07月01日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | """...""" 12 | 13 | a = "这里是中文" 14 | # 如何区分encode和decode? 15 | print(a.encode()) # 一个字符串encode就是变成编码形势了 16 | # b'\xe5\x88\xab\xe7\x9c\x8b\xe6\x88\x91\xe5\x8f\xaa\xe6\x98\xaf\xe4\xb8\x80\xe5\x8f\xaa\xe7\xbe\x8a' 17 | # en- 表示让它能够,使之成为,enlarge 使之扩大,enable 使他扩大 18 | # encode 就是 使它成为密码 code翻译里有“代码,密码” 的意思 19 | # 就是让字符串 使之成为我们看不懂的密码形式 code形式 20 | print("this is english".encode("ascii")) 21 | print("this is english".encode("utf-8")) 22 | # print("这里是中文".encode("ascii")) # 这个不能转化,因为ascii的范围比较小 23 | print("这里是中文".encode("utf-8")) 24 | print("这里是jabc".encode("utf-8")) 25 | print("这里是中文".encode("gbk")) 26 | 27 | return None 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/Flash动画/pythonAnimation.fla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/036 面向对象-基本理论/Flash动画/pythonAnimation.fla -------------------------------------------------------------------------------- /036 面向对象-基本理论/Flash动画/元类.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/036 面向对象-基本理论/Flash动画/元类.gif -------------------------------------------------------------------------------- /036 面向对象-基本理论/Flash动画/函数的本质.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/036 面向对象-基本理论/Flash动画/函数的本质.gif -------------------------------------------------------------------------------- /036 面向对象-基本理论/Flash动画/类实例化.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/036 面向对象-基本理论/Flash动画/类实例化.gif -------------------------------------------------------------------------------- /036 面向对象-基本理论/Flash动画/装饰器函数.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/036 面向对象-基本理论/Flash动画/装饰器函数.gif -------------------------------------------------------------------------------- /036 面向对象-基本理论/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm python 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # python的世界中只有一种东西叫对象 12 | # 万物皆对象 13 | # 别的语言中有基础数据类型和对象类型之分 14 | # 基础数据类型是 int、bool、等等 15 | # python中基础数据类型都是对象 16 | # 万物皆对象 17 | # 对象怎么产生?由类产生 18 | # 又因为万物皆对象 19 | # 那么这个类是不是也是一个对象呢? 20 | # 没错,类也是一个对象 21 | # 类() 调用之后就产生了一个对象 22 | # 为了区分,我们可以把类产生的对象叫实例 23 | 24 | # 那么这个类是怎么产生的呢? 25 | # 类是我们通过class写出来的 26 | # 所以对象可以分为两种 27 | # 一个是类,一个是实例,类产生实例 28 | 29 | # 但是实际上类也可以被产生 30 | # 那就是产生类的类 31 | # 这个东西叫元类, 32 | # 就比如说工厂可以生产螺丝钉,工厂的工厂可以生产工厂。 此处可以配gameOfLife 33 | # type 就是python里面的元类 34 | 35 | # 那这个元类可不可以被一个更高级的东西产生呢? 36 | # 也就是产生产生工厂的工厂? 37 | # 不会有了,这个东西就是它自己了。 38 | 39 | # 至此,我们的python世界里有了三种对象 40 | # 实例 类 元类 41 | 42 | # 实例() 调用,这就很像function 43 | 44 | def f(): 45 | ... 46 | 47 | print(f.__class__) 48 | 49 | # 函数就是一个实例,它的类是function 50 | 51 | # 类() 可以实例化出来一个对象 52 | # 实例.__class__ 可以获得到它的类 53 | # 实例.__class__.__class__ 就可以获得到元类了 54 | # 或者 类.__class__ 就获得到元类了 55 | 56 | 57 | return None 58 | 59 | 60 | if __name__ == "__main__": 61 | main() 62 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/ppt/概念.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/036 面向对象-基本理论/ppt/概念.pptx -------------------------------------------------------------------------------- /036 面向对象-基本理论/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Student: 11 | def __init__(self, name, age, gender, score): 12 | self.name = name 13 | self.age = age 14 | self.gender = gender 15 | self.score = score 16 | 17 | def addScore(self, value): 18 | self.score += value 19 | self.score = min(self.score, 100) 20 | 21 | 22 | def main(): 23 | stuList = [ 24 | Student("小明", 15, "男", 60), 25 | Student("小王", 15, "男", 60), 26 | Student("小兲", 15, "男", 60), 27 | Student("小粒", 15, "男", 60), 28 | ] 29 | for item in stuList: 30 | if item.name == "小兲": 31 | item.addScore(5) 32 | 33 | return None 34 | 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/show2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show2 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from dataclasses import dataclass 9 | from collections import namedtuple 10 | 11 | 12 | @dataclass() 13 | class Vec: 14 | x: int 15 | y: int 16 | 17 | 18 | Loc = namedtuple("Loc", ["x", "y"]) 19 | 20 | 21 | def main(): 22 | v1 = Vec(2, 2) 23 | print(v1) 24 | l1 = Loc(58, 10) 25 | print(l1) 26 | return None 27 | 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/基本数据类型也是对象.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 基本数据类型也是对象 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # class int(object): 12 | a = int() 13 | print(a) 14 | 15 | b = str() 16 | print(b) 17 | 18 | c = float() 19 | print(c) 20 | 21 | # 这个n可以点出来很多 22 | n = 1 23 | print(n) 24 | print(n.imag) 25 | print(n.numerator) 26 | print(n.denominator) 27 | print(n.conjugate()) 28 | return None 29 | 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/学习资料.txt: -------------------------------------------------------------------------------- 1 | https://blog.csdn.net/Jesszen/article/details/82384217 -------------------------------------------------------------------------------- /036 面向对象-基本理论/胡闹行为.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月01日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | def __init__(self, n=1): 12 | self.n = n 13 | print("init") 14 | 15 | def __call__(self, *args, **kwargs): 16 | print("call") 17 | return A 18 | 19 | def __getitem__(self, item): 20 | return self 21 | 22 | 23 | def main(): 24 | # a = A()[:]()()[:]()()()()[:][::]()()[:]()()()[:]()() 25 | # print(a) 26 | 27 | a = A() 28 | a.__class__ = a 29 | 30 | print(type(a)) 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/视频里没有出的内容/042 看透self参数/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年07月05日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | def __init__(self, n=1): 12 | self.n = n 13 | 14 | def __str__(self): 15 | return f"<{self.n}>" 16 | 17 | @classmethod 18 | def default(cls): 19 | return cls(1000) 20 | 21 | @staticmethod 22 | def default2(): 23 | return A(1000) 24 | 25 | 26 | def main(): 27 | a = A(15) 28 | print(a) # 自动调用str方法 29 | print(a.__str__()) # 相当于这样 30 | 31 | print(A.__str__(a)) 32 | # 魔术方法用str方法,第一个self参数的作用就出来了 33 | # 也就是说self参数表示的是一个实例 34 | 35 | print(a.__str__()) 36 | # 再来回顾这个,a没有 __str__ 方法,他就会向上找它的类有没有这个方法 37 | # 如果有,就调用它的类的方法,然后第一个参数就自动传进来了 38 | 39 | # 疑点 40 | b = A() 41 | # 这个过程应该相当于 42 | # b = A.__init__(?,?) 43 | # 这个没法解释了 44 | 45 | return None 46 | 47 | 48 | if __name__ == "__main__": 49 | main() 50 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/视频里没有出的内容/042 看透self参数/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | 8 | 9 | def say(): 10 | print("我是xxx") 11 | 12 | 13 | class Human: 14 | def say(self, word): 15 | print(f"我说:{word}") 16 | 17 | 18 | say() 19 | 20 | h = Human() 21 | h.say("你好") 22 | 23 | Human.say(h, "你好") 24 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/视频里没有出的内容/050 重载奇怪运算符/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | def __init__(self): 12 | ... 13 | 14 | def __call__(self, *args, **kwargs): 15 | ... 16 | 17 | def __matmul__(self, other): 18 | ... 19 | 20 | def __my__(self): 21 | ... 22 | 23 | 24 | def main(): 25 | a = A() 26 | b = A() 27 | c = a @ b 28 | # @ py3.5新增的矩阵乘法运算符 29 | # print([1, 2, 3] @ [4, 5, 6])r 30 | 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/视频里没有出的内容/元类和obj的关系.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 元类和obj的关系 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | print(object) 12 | print(type(object)) 13 | print(object.__class__) # type 14 | print(object.__bases__) # () 15 | 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/视频里没有出的内容/对象生命周期理论.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 对象生命周期理论 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Person: 11 | def __init__(self): 12 | print("init!") 13 | ... 14 | 15 | def __new__(cls, *args, **kwargs): 16 | print("new 拦截对象的创建过程") 17 | ... 18 | 19 | def __del__(self): 20 | print("这个对象被回收了") 21 | 22 | 23 | def main(): 24 | p1 = Person() 25 | return None 26 | 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /036 面向对象-基本理论/面向对象的好处.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 面向对象的好处 4 | 2022年07月07日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # 没有面向对象怎么做? 12 | # 列表嵌套,字典模拟 13 | 14 | # 对象.什么东西,直观简洁,比 person[0], person[1], person[2] 好多了 15 | 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /037 面向对象-用dataclass简写类/dataClass.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年05月26日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from dataclasses import dataclass 9 | 10 | 11 | @dataclass 12 | class Card: 13 | rank: str 14 | suit: str 15 | 16 | 17 | card = Card("Q", "hearts") 18 | print(card == card) 19 | # True 20 | 21 | print(card.rank) 22 | # 'Q' 23 | print(card) 24 | Card(rank='Q', suit="hearts") 25 | 26 | 27 | def main(): 28 | return None 29 | 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /037 面向对象-用dataclass简写类/nameTuple.py: -------------------------------------------------------------------------------- 1 | from collections import namedtuple 2 | 3 | # 两种方法来给 namedtuple 定义方法名 4 | User = namedtuple('User', ['name', 'age', 'id']) 5 | user = User('tester', '22', '464643123') 6 | 7 | print(user) 8 | # User(name='tester', age='22', id='464643123') 9 | 10 | -------------------------------------------------------------------------------- /038 面向对象-类方法类属性优化类/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from random import choice 9 | 10 | 11 | class Person: 12 | _FirstName = ["岳", "王", "李", "张", "赵"] 13 | _LastName = ["三", "建国", "宇航", "超", "子航", "鹏"] 14 | 15 | def __init__(self, name): 16 | self.name = name 17 | 18 | def say(self): 19 | print(f"大家好我叫{self.name}") 20 | 21 | @classmethod 22 | def createMan(cls): 23 | return cls(choice(cls._FirstName) + choice(cls._LastName)) 24 | 25 | def __hash__(self): 26 | return 15863485 27 | 28 | def __str__(self): 29 | return f"str:【{self.name}】" 30 | 31 | def __repr__(self): 32 | return f"{self.__class__.__name__}(\"{self.name}\")" 33 | 34 | 35 | def main(): 36 | a = Person.createMan() 37 | a.a = 15 38 | a.B = 15 39 | 40 | # for item in dir(Person): 41 | # print(item, "\t\t\t\t\t\t\t", getattr(a, item)) 42 | 43 | return None 44 | 45 | 46 | if __name__ == "__main__": 47 | main() 48 | -------------------------------------------------------------------------------- /040 面向对象-__name__,__class__/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月01日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | def __init__(self): 12 | self.val = 100 13 | ... 14 | 15 | 16 | def main(): 17 | 18 | a = type(type(type(A())())())() 19 | 20 | print(a.val) 21 | 22 | b = A() 23 | c = b.__class__().__class__().__class__() 24 | d = type.__class__ 25 | print(d) 26 | print(A().__class__.__name__) 27 | return None 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /042 组合数据类型只读化/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from types import MappingProxyType 9 | 10 | 11 | def main(): 12 | arr = [1, 2, 3, 4, 5] 13 | t = tuple(arr) 14 | 15 | s = {1, 2, 3, 4} 16 | fs = frozenset(s) 17 | print(1 in fs) 18 | 19 | s = {1, 2, 3, frozenset({2})} 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /043 面向对象-slots/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Position: 11 | __slots__ = ["x", "y"] 12 | 13 | def __init__(self, x, y): 14 | self.x = x 15 | self.y = y 16 | 17 | 18 | def main(): 19 | p = Position(1, 3) 20 | p.__class__.__slots__.append("z") 21 | p.__slots__.append("z") 22 | p.z = 15 23 | return None 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /045 下划线保护类里面的资源/file1.py: -------------------------------------------------------------------------------- 1 | a = 1 2 | _a = 2 3 | __a = 3 4 | 5 | 6 | def f(): 7 | ... 8 | 9 | 10 | def _f(): 11 | ... 12 | 13 | 14 | def __f(): 15 | ... 16 | 17 | 18 | class A: 19 | ... 20 | 21 | 22 | class _A: 23 | ... 24 | 25 | 26 | class __A: 27 | ... 28 | 29 | 30 | del __a 31 | -------------------------------------------------------------------------------- /045 下划线保护类里面的资源/file2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm file2 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | import file1 8 | 9 | 10 | def main(): 11 | return None 12 | 13 | 14 | if __name__ == "__main__": 15 | main() 16 | -------------------------------------------------------------------------------- /045 下划线保护类里面的资源/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | # from show import * 9 | import show 10 | 11 | 12 | def main(): 13 | A = show.A 14 | a = A() 15 | print(a.b) 16 | print(a._b) 17 | # print(a.__b) 18 | print(a.f()) 19 | print(a._f()) 20 | # print(a.__f()) 21 | print(A.c) 22 | print(A._c) 23 | # print(A.__c) 24 | print(A.g()) 25 | print(A._g()) 26 | # print(A.__g()) 27 | return None 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /045 面向对象-更安全地保护属性/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Student: 11 | def __init__(self, name, score, ): 12 | self.name = name 13 | self._score = score 14 | 15 | def __str__(self): 16 | return f"({self.name}, {self._score})" 17 | 18 | @property 19 | def score(self): 20 | print("get") 21 | return self._score 22 | 23 | @score.setter 24 | def score(self, value): 25 | print("检测方法运行了啦") 26 | assert isinstance(value, (int, float)) 27 | if 0 <= value <= 100: 28 | self._score = value 29 | 30 | @score.deleter 31 | def score(self): 32 | print("删除了啦") 33 | 34 | def changeScore(self, n): 35 | self._score += n 36 | self._score = min(self._score, 100) 37 | self._score = max(self._score, 0) 38 | 39 | 40 | def main(): 41 | s1 = Student("张兲", 60) 42 | for _ in range(365): 43 | s1.changeScore(1) 44 | 45 | s1.score = 60 46 | print(s1.score) 47 | del s1.score 48 | 49 | return None 50 | 51 | 52 | if __name__ == "__main__": 53 | main() 54 | -------------------------------------------------------------------------------- /046 面向对象-python变C艹/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | def __init__(self): 12 | ... 13 | 14 | def __lshift__(self, other): 15 | print(other, end="") 16 | return self 17 | 18 | 19 | endl = "\n" 20 | cout = A() 21 | 22 | 23 | def main(): 24 | cout << "abc" << "cda" << endl 25 | return None 26 | 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /046 面向对象-类装饰器、装饰类的装饰器/new.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm new 4 | 2022年07月23日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Deco: 11 | def __init__(self, flag): 12 | self.flag = flag 13 | ... 14 | 15 | def __call__(self, obj): 16 | obj.left = "newName" if self.flag else "oldName" 17 | return obj 18 | 19 | 20 | @Deco(True) 21 | class A: 22 | ... 23 | 24 | 25 | def rD(flag: bool) -> Callable: 26 | def D(obj): 27 | obj.val = 15 if flag else 14 28 | return obj 29 | 30 | return D 31 | 32 | 33 | @rD(True) 34 | class A: 35 | ... 36 | 37 | 38 | @rD(False) 39 | class B: 40 | ... 41 | 42 | 43 | def main(): 44 | a = A() 45 | b = B() 46 | print(a.val) 47 | print(b.val) 48 | return None 49 | 50 | 51 | if __name__ == "__main__": 52 | main() 53 | -------------------------------------------------------------------------------- /046 面向对象-类装饰器、装饰类的装饰器/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def deco(obj): 11 | obj.b = 15 12 | return obj 13 | 14 | 15 | @deco 16 | class A: 17 | ... 18 | 19 | 20 | def main(): 21 | # func() 22 | a = A() 23 | print(a.__dict__) 24 | print(A.__dict__) 25 | return None 26 | 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /046 面向对象-类装饰器、装饰类的装饰器/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Deco: 11 | def __init__(self, char): 12 | self.char = char 13 | ... 14 | 15 | def __call__(self, f): 16 | def newFunc(): 17 | print(self.char * 10) 18 | res = f() 19 | print(self.char * 10) 20 | return res 21 | 22 | return newFunc 23 | 24 | 25 | @Deco("=") 26 | @Deco("*") 27 | def func(): 28 | print("helloWord") 29 | 30 | 31 | def main(): 32 | func() 33 | return None 34 | 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /046 面向对象-类装饰器、装饰类的装饰器/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test2 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Deco: 11 | def __init__(self, f): 12 | self.f = f 13 | ... 14 | 15 | def __call__(self, *args, **kwargs): 16 | print("======") 17 | self.f() 18 | print("======") 19 | 20 | def __str__(self): 21 | return "decoType" 22 | 23 | 24 | @Deco 25 | def func(): 26 | print("helloWord") 27 | 28 | 29 | def main(): 30 | # func() 31 | res = Deco(func) 32 | print(res, type(res)) 33 | return None 34 | 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /046 面向对象-类装饰器、装饰类的装饰器/用类实现装饰器.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 用类实现装饰器 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Check(object): 11 | """类装饰器""" 12 | 13 | def __init__(self, fn): 14 | """ 15 | 传入的是被装饰的原的函数 16 | """ 17 | self.__fn = fn 18 | 19 | def __call__(self, *args, **kwargs): # 实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用 20 | print("登录") # 在这之前可以写登录代码 21 | self.__fn() 22 | 23 | 24 | def main(): 25 | 26 | def deco(func): 27 | def newFunc(): 28 | func() 29 | 30 | return newFunc 31 | 32 | def f(): 33 | ... 34 | 35 | g = deco(f) # 这才是@语法糖的本质过程 36 | 37 | return None 38 | 39 | 40 | if __name__ == "__main__": 41 | main() 42 | -------------------------------------------------------------------------------- /047 面向对象-魔术方法大总结/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from math import * 9 | import sys 10 | 11 | 12 | class A: 13 | def __sizeof__(self): 14 | print("......") # 在此基础上加 15 | return 1000000 16 | 17 | def __trunc__(self): 18 | print("???") 19 | return 5 20 | 21 | def __invert__(self): 22 | ... 23 | 24 | 25 | def main(): 26 | a = A() 27 | print(~a) 28 | print(trunc(a)) 29 | print(sys.getsizeof(a)) 30 | return None 31 | 32 | 33 | if __name__ == "__main__": 34 | main() 35 | -------------------------------------------------------------------------------- /047 面向对象-魔术方法大总结/test3.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Vector: 11 | def __init__(self, x, y, z): 12 | self.x = x 13 | self.y = y 14 | self.z = z 15 | 16 | def __add__(self, other): 17 | if type(other) == self.__class__: 18 | return Vector(self.x + other.x, self.y + other.y, self.z + other.z) 19 | 20 | def __str__(self): 21 | return f"{self.__dict__}" 22 | 23 | def __mul__(self, other): 24 | return Vector(self.x * other, self.y * other, self.z * other) 25 | 26 | def __rmul__(self, other): 27 | return Vector(self.x * other, self.y * other, self.z * other) 28 | 29 | def __imul__(self, other): 30 | return Vector(self.x * other, self.y * other, self.z * other) 31 | 32 | def __abs__(self): 33 | return (self.x ** 2 + self.y ** 2 + self.z ** 2) ** 0.5 34 | 35 | __repr__ = __str__ 36 | 37 | 38 | def main(): 39 | a = Vector(1, 1, 1) 40 | print(abs(a)) 41 | 42 | return None 43 | 44 | 45 | if __name__ == "__main__": 46 | main() 47 | -------------------------------------------------------------------------------- /047 面向对象-魔术方法大总结/魔术方法大总结.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/047 面向对象-魔术方法大总结/魔术方法大总结.xmind -------------------------------------------------------------------------------- /049 面向对象-继承问题/super写法.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm super写法 4 | 2022年07月07日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | def __init__(self): 12 | self.a = 12 13 | 14 | 15 | class B(A): 16 | def __init__(self): 17 | super().__init__() # 写这一行就行 18 | self.b = 155 19 | 20 | 21 | def main(): 22 | return None 23 | 24 | 25 | if __name__ == "__main__": 26 | main() 27 | -------------------------------------------------------------------------------- /050 面向对象-抽象类/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import abc 9 | 10 | 11 | class A(metaclass=abc.ABCMeta): 12 | @abc.abstractmethod 13 | def f(self): 14 | ... 15 | 16 | @abc.abstractmethod 17 | def g(self): 18 | ... 19 | 20 | 21 | class B(A): 22 | def f(self): 23 | pass 24 | 25 | def g(self): 26 | pass 27 | 28 | ... 29 | 30 | 31 | def main(): 32 | return None 33 | 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /051 面向对象-获取多继承顺序/show2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show2 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class D: 11 | ... 12 | 13 | 14 | class Y(D): 15 | ... 16 | 17 | 18 | class J(D): 19 | ... 20 | 21 | 22 | class S(J, Y): 23 | ... 24 | 25 | 26 | def main(): 27 | print(S.mro()) 28 | print(J.mro()) 29 | print(S.__bases__) 30 | print(J.__bases__) 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /051 面向对象-获取多继承顺序/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class FF: 11 | ... 12 | 13 | 14 | class G: 15 | ... 16 | 17 | 18 | class D(FF): 19 | ... 20 | 21 | 22 | class E(FF, G): 23 | ... 24 | 25 | 26 | class F(G): 27 | ... 28 | 29 | 30 | class B(D): 31 | ... 32 | 33 | 34 | class C(E, F): 35 | ... 36 | 37 | 38 | class A(B, C): 39 | ... 40 | 41 | 42 | def main(): 43 | for item in A.mro(): 44 | print(item) 45 | return None 46 | 47 | 48 | if __name__ == "__main__": 49 | main() 50 | -------------------------------------------------------------------------------- /051 面向对象-获取多继承顺序/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test2 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class E: 11 | ... 12 | 13 | 14 | class F: 15 | ... 16 | 17 | 18 | class G: 19 | ... 20 | 21 | 22 | class B(E): 23 | ... 24 | 25 | 26 | class C(F): 27 | ... 28 | 29 | 30 | class D(G): 31 | ... 32 | 33 | 34 | class A(B, C, D): 35 | ... 36 | 37 | 38 | def main(): 39 | for item in A.mro(): 40 | print(item) 41 | return None 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /051 面向对象-获取多继承顺序/test3.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test3 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class E: 11 | ... 12 | 13 | 14 | class D(E): 15 | ... 16 | 17 | 18 | class C(D, E): 19 | ... 20 | 21 | 22 | class B: 23 | ... 24 | 25 | 26 | class A(B, C): 27 | ... 28 | 29 | 30 | def main(): 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /051 面向对象-获取多继承顺序/两种多此一举的三角继承问题.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 两种多此一举的三角继承问题 4 | 2022年07月11日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class B: 11 | ... 12 | 13 | 14 | class C(B): 15 | ... 16 | 17 | 18 | # class A(B, C): 19 | # ... 20 | 21 | class A(C, B): 22 | ... 23 | 24 | 25 | def main(): 26 | return None 27 | 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /052 面向对象-enum枚举/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from enum import Enum, unique 9 | 10 | Fruit = { 11 | 'APPLE': 1, 12 | 'BANANA': 2, 13 | 'ORANGE': 3, 14 | } 15 | 16 | 17 | class F: 18 | APPLE = 1 19 | BANANA = 2 20 | ORANGE = 3 21 | 22 | 23 | class A: 24 | a = 1 25 | a = 15 # 传统写法不会报错 26 | 27 | 28 | @unique # 不存在表示值相同的方块,设置了相同的值会报错 29 | class Block(Enum): 30 | AIR = 0 31 | STONE = 1 32 | GRASS = 2 33 | DIRT = 3 34 | # AIR = 1 35 | 36 | 37 | def main(): 38 | print(Block.STONE) 39 | print(Block(3)) # 双向访问 40 | dic = Block.__members__ 41 | print(dic) 42 | return None 43 | 44 | 45 | if __name__ == "__main__": 46 | main() 47 | -------------------------------------------------------------------------------- /052 面向对象-enum枚举/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from enum import Enum, unique 9 | 10 | 11 | @unique 12 | class Block(Enum): 13 | AIR = 0 14 | STONE = 1 15 | GRASS = 2 16 | DIRT = 3 17 | 18 | 19 | def main(): 20 | print(Block.AIR.value) 21 | print(Block(1)) 22 | print() 23 | for k, v in Block.__members__.items(): 24 | print(k, v) 25 | return None 26 | 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /052 面向对象-enum枚举/枚举.py: -------------------------------------------------------------------------------- 1 | # *-------------------------------- 2 | # https://www.manongdao.com/article-2068272.html 3 | 4 | # 3.4 新加的 5 | from enum import IntEnum 6 | 7 | NAME, AGE, SEX, EMAIL = range(4) 8 | s = ('jim', 16, 'male', 'jim8721 @ gmail.com') 9 | 10 | 11 | class StudentEnum(IntEnum): 12 | NAME = 0 13 | AGE = 1 14 | SEX = 2 15 | EMAIL = 3 16 | 17 | 18 | print(StudentEnum.NAME) 19 | print(s[StudentEnum.NAME]) 20 | isinstance(StudentEnum.NAME, int) 21 | 22 | 23 | class TestEnum(IntEnum): 24 | AIR = 0 25 | DIRT = 1 26 | ROCK = 2 27 | GRASS = "3" # 没有起到检查的作用 28 | 29 | # 枚举的用途在于相当于很简洁的声明了常量 30 | # TestEnum.AIR = 15 # 修改会报错 31 | 32 | # 中键点击去之后还会有更多的东西 33 | -------------------------------------------------------------------------------- /053 面向对象-类里怎么写自己的注解?/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | import typing 8 | from typing import * 9 | 10 | 11 | class A: 12 | def __init__(self): 13 | self.val = 15 14 | 15 | def f(self) -> "A": 16 | return self 17 | 18 | @classmethod 19 | def g(cls) -> Type["A"]: 20 | return cls 21 | 22 | 23 | class B: 24 | def __init__(self): 25 | self.value = 10 26 | 27 | @staticmethod 28 | def f() -> A: 29 | return A() 30 | 31 | @staticmethod 32 | def g() -> Type[A]: 33 | return A 34 | 35 | 36 | def main(): 37 | a = A() 38 | print(a.f().f().f().f().f().val) 39 | print(a.g()().g().g()().g().g()()) 40 | 41 | return None 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /053 面向对象-类里怎么写自己的注解?/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class A: 11 | DATA = 0 12 | 13 | def __init__(self): 14 | self.val = 0 15 | 16 | @classmethod 17 | def create(cls) -> Type["A"]: 18 | return cls 19 | 20 | ... 21 | 22 | 23 | def main(): 24 | a = A.create() 25 | number: int 26 | number = 3 27 | return None 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /053 面向对象-类里怎么写自己的注解?/注解.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/053 面向对象-类里怎么写自己的注解?/注解.png -------------------------------------------------------------------------------- /054 面向对象-用type元类写类/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class Person: 11 | count = 0 12 | 13 | def say(self): 14 | print(f"{self.name}") 15 | 16 | def __init__(self, name): 17 | print("new") 18 | self.name = name 19 | 20 | def __new__(cls, *args, **kwargs): 21 | print("new") 22 | print(cls, *args, **kwargs) 23 | return None 24 | 25 | 26 | # def say(self): 27 | # print(f"{self.name}") 28 | 29 | 30 | def main(): 31 | # L = type("Person", (), {"__init__": __init__, "count": 0, "say": say}) 32 | a = Person("张兲") 33 | # a.say() 34 | return None 35 | 36 | 37 | if __name__ == "__main__": 38 | main() 39 | -------------------------------------------------------------------------------- /055 面向对象-用元类写出更离谱的类/show2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show2 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class MyMeta(type): 11 | def __lshift__(self, other): 12 | for k, v in other.__dict__.items(): 13 | setattr(self, k, v) 14 | return self 15 | ... 16 | 17 | 18 | class A(metaclass=MyMeta): 19 | ... 20 | 21 | 22 | def main(): 23 | # A << int 24 | print(A.__dict__, len(A.__dict__)) 25 | 26 | # A << int 27 | 28 | A << int << dict << set 29 | 30 | print(A.__dict__, len(A.__dict__)) 31 | 32 | return None 33 | 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /055 面向对象-用元类写出更离谱的类/test1.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test1 4 | 2022年07月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class MyType(type): 11 | 12 | def __str__(self): 13 | return "ABABA" 14 | 15 | def __add__(self, other): 16 | print("add", other) 17 | 18 | ... 19 | 20 | 21 | class A(metaclass=MyType): 22 | def __str__(self): 23 | return "obj" 24 | 25 | ... 26 | 27 | 28 | def main(): 29 | a = A() 30 | print(a) 31 | print(A) 32 | print(A + A) 33 | 34 | return None 35 | 36 | 37 | if __name__ == "__main__": 38 | main() 39 | -------------------------------------------------------------------------------- /055 面向对象-用元类写出更离谱的类/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test2 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from random import * 9 | 10 | 11 | class MyMeta(type): 12 | 13 | def __add__(self, other: "MyMeta"): 14 | dic = {} 15 | for k, v in self.__dict__.items(): 16 | dic[k] = v 17 | for k, v in other.__dict__.items(): 18 | dic[k] = v 19 | 20 | return MyMeta( 21 | self.__name__ + other.__name__, 22 | self.__bases__ + other.__bases__, 23 | dic 24 | ) 25 | 26 | ... 27 | 28 | 29 | class Human(metaclass=MyMeta): 30 | LastName = list("赵钱孙李周吴郑王") 31 | FirstName = ["建国", "鹏"] 32 | 33 | @classmethod 34 | def create(cls): 35 | return cls( 36 | choice(cls.LastName) + choice(cls.FirstName), 37 | "男" if random() < 0.5 else "女" 38 | ) 39 | 40 | def __init__(self, name, gender): 41 | self.name = name 42 | self.gender = gender 43 | 44 | 45 | class Wolf(metaclass=MyMeta): 46 | Kinds = ["灰色", "白色", "灰黑色"] 47 | 48 | @classmethod 49 | def create(cls): 50 | return cls(choice(cls.Kinds)) 51 | 52 | def __init__(self, kind): 53 | self.kind = kind 54 | 55 | 56 | def main(): 57 | Werewolf = Wolf + Human 58 | 59 | return None 60 | 61 | 62 | if __name__ == "__main__": 63 | main() 64 | -------------------------------------------------------------------------------- /055 面向对象-用元类写出更离谱的类/元类.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 元类 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def say(self): 11 | print(self, "eat") 12 | 13 | 14 | # type(类名,继承关系,属性) 15 | 16 | Person = type("Person", (), {"count": 0, "say": say}) 17 | 18 | p = Person() 19 | p.say() 20 | 21 | 22 | def main(): 23 | return None 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /055 面向对象-用元类写出更离谱的类/类运算.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 类运算 4 | 2022年07月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | class M(type): 11 | 12 | # 定义一些类的操作 13 | 14 | def __lshift__(self, other): 15 | # 类1 << 类2 16 | return self 17 | 18 | def __invert__(self): 19 | print("-") 20 | return self 21 | 22 | def __add__(self, other): 23 | # 返回一个新的类,整合两个类的资源 24 | return M(self.__name__ + other.__name__, (), self.__dict__ | other.__dict__) 25 | 26 | def __le__(self, other): 27 | # 类1 <<= 类2 28 | for k, v in other.__dict__.items(): 29 | if k.startswith("__"): 30 | continue 31 | setattr(self, k, v) 32 | 33 | print("in meta") 34 | ... 35 | 36 | 37 | class A(metaclass=M): 38 | DATA = 15 39 | INFO = 15 40 | ... 41 | 42 | 43 | class C: 44 | C_DATA = 15 45 | 46 | 47 | def main(): 48 | print("in main\n") 49 | 50 | # B = A + int + dict 51 | # 52 | # print(B, type(B)) 53 | # for item in B.__dict__: 54 | # print(item) 55 | # 56 | # print(B.real) 57 | 58 | A <= C 59 | print(A.__dict__) 60 | return None 61 | 62 | 63 | if __name__ == "__main__": 64 | main() 65 | -------------------------------------------------------------------------------- /056 全排列/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年09月19日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | """ 10 | [0, 1, 2] 11 | [0, 2, 1] 12 | [1, 0, 2] 13 | [1, 2, 0] 14 | [2, 0, 1] 15 | [2, 1, 0] 16 | """ 17 | 18 | 19 | def main(): 20 | N = 3 21 | path = [] 22 | s = set() 23 | res = [] 24 | 25 | def dfs(): 26 | if len(path) == N: 27 | print(path) 28 | res.append(path[:]) 29 | return 30 | for i in range(N): 31 | if i in s: 32 | continue 33 | s.add(i) 34 | path.append(i) 35 | dfs() 36 | s.remove(path.pop()) 37 | ... 38 | 39 | dfs() 40 | print(res) 41 | from itertools import permutations 42 | for item in permutations(range(4)): 43 | print(item) 44 | return None 45 | 46 | 47 | if __name__ == "__main__": 48 | main() 49 | -------------------------------------------------------------------------------- /057 制作音乐musicpy/temp.mid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/057 制作音乐musicpy/temp.mid -------------------------------------------------------------------------------- /057 制作音乐musicpy/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年09月28日 5 | by littlefean 6 | 7 | 基本类:是note(音符), chord(和弦)和scale(音阶) 8 | """ 9 | from typing import * 10 | 11 | from musicpy import * 12 | 13 | a1 = note('C', 5) 14 | a1_ = note('C', 6) 15 | a2 = note('D', 5) 16 | a2_ = note('D', 6) 17 | a3 = note('E', 5) 18 | a4 = note('F', 5) 19 | a5 = note('G', 5) 20 | a6 = note('A', 5) 21 | a7 = note('B', 5) 22 | 23 | melody = chord([a1, a2, a3, a4, a5, a6], [1 / 4] * 6, [1 / 4] * 6) 24 | melody2 = chord(reversed([a1, a2, a3, a4, a5, a6]), [1 / 4] * 6, [1 / 4] * 6) 25 | # + | 是拼接 26 | # & 是并列 27 | play(melody & melody2, bpm=80) 28 | 29 | -------------------------------------------------------------------------------- /057 制作音乐musicpy/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from musicpy import * 3 | from typing import * 4 | 5 | a1 = note("C", 5) 6 | a2 = note("D", 5) 7 | a3 = note("E", 5) 8 | a4 = note("F", 5) 9 | a5 = note("G", 5) 10 | a6 = note("A", 5) 11 | a7 = note("B", 5) 12 | a1_ = note("C", 6) 13 | a2_ = note("D", 6) 14 | 15 | 16 | def stringToList(string: str) -> List[note]: 17 | res = [] 18 | for s in string.split(): 19 | if len(s) == 1: 20 | res.append(eval(f"a{s}")) 21 | else: 22 | res.append(eval(f"a{s[0]}_")) 23 | return res 24 | 25 | 26 | n = 1 / 4 27 | nd = 1 / 4 + 1 / 8 28 | _ = 1 / 8 29 | notList = stringToList("5 1. 7 2. 1. 5 3 6 6 4 6 2. 1. 7 6 5 4 3") 30 | durList = [n] + [nd, _, _, _, _, _, ] + [nd, _, n + _, _] + [nd, _, _, _, _, _, ] + [n * 3] 31 | print(len(notList), len(durList)) 32 | play(chord(notList, durList, durList), bpm=120) 33 | -------------------------------------------------------------------------------- /058 用import语句拆文件搞大项目/内容.py: -------------------------------------------------------------------------------- 1 | """ 2 | 用import 语句搞大项目 3 | """ 4 | 5 | # import 的写法 6 | 7 | """ 8 | 基础内容: 9 | 10 | import xxx 11 | from xxx import xxx 12 | import numpy as np 13 | as的作用是起别名 14 | 15 | """ 16 | 17 | # 跨文件夹引入办法 18 | 19 | """ 20 | 项目文件夹 21 | main.py 22 | 文件夹1 23 | a.py 24 | 文件夹2 25 | 文件夹3 26 | b.py 27 | 28 | ------- 29 | 其中,a.py中有一个A类,b.py中有一个B类 30 | 如果a.py中想要引入b.py里的B类,那么就需要在a.py的最上面写上 31 | from 文件夹2.文件夹3.b import B 32 | 原则就是从项目文件夹开始走,逐层找到要找的py文件 33 | 34 | 35 | """ 36 | 37 | # 循环引用 38 | 39 | """ 40 | a.py 41 | b.py 42 | ------- 43 | 其中 a.py 中有一个f函数,b.py 中有g函数 44 | 如果 f函数调用g函数,g函数内部调用f函数, 45 | b.py: 46 | from a import g 47 | 48 | a.py: 49 | from b import f 50 | 51 | 无法实现。会出现循环引用的问题 52 | 但改成 53 | b.py: 54 | import a 55 | a.py: 56 | import b 57 | 58 | 然后调用的时候 59 | a.f() 60 | b.g() 61 | 这样就不会出现循环引用的问题了 62 | 63 | 但如果不是函数,是类,这样写就又不行了 64 | 通常这样的设计会是: 65 | 假设一个银行系统,为客户建立了People类,为各种银行卡建立了Card类。 66 | People类里记录着开卡信息(用Card类描述),Card类里也需要说明拥有者信息(用People类描述)。 67 | 68 | 可以使用注解来实现,目的是写起来有代码提示。 69 | 详见视频 70 | """ 71 | 72 | 73 | -------------------------------------------------------------------------------- /059 总结itertools里的骚东西/filterTest.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | def f(x): # 是否是3的倍数 5 | if x % 3 == 0: 6 | return True 7 | else: 8 | return False # 写的稍微臭了点 9 | 10 | 11 | print(list(filter(f, [1, 6, 89, 345, 12]))) 12 | from itertools import filterfalse 13 | print(list(filterfalse(lambda x: not x % 3, [1, 6, 89, 345, 12]))) 14 | 15 | from itertools import compress 16 | 17 | -------------------------------------------------------------------------------- /059 总结itertools里的骚东西/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年10月23日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from itertools import * 9 | 10 | 11 | class Solution: 12 | def mergeAlternately(self, word1: str, word2: str) -> str: 13 | ans = [] 14 | for x, y in zip_longest(word1, word2): 15 | if x: ans.append(x) 16 | if y: ans.append(y) 17 | return ''.join(ans) 18 | 19 | 20 | class Solution2: 21 | def mergeAlternately(self, word1: str, word2: str) -> str: 22 | string = "" 23 | i = 0 24 | j = 0 25 | while i < len(word1) and j < len(word2): 26 | string += word1[i] 27 | i += 1 28 | string += word2[j] 29 | j += 1 30 | while i < len(word1): 31 | string += word1[i] 32 | i += 1 33 | while j < len(word2): 34 | string += word2[j] 35 | j += 1 36 | return string 37 | 38 | 39 | def main(): 40 | return None 41 | 42 | 43 | if __name__ == "__main__": 44 | main() 45 | -------------------------------------------------------------------------------- /059 总结itertools里的骚东西/show.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/059 总结itertools里的骚东西/show.pptx -------------------------------------------------------------------------------- /060 玩转闭包/changeAbleVarTest.py: -------------------------------------------------------------------------------- 1 | """ 2 | 闭包函数访问可变数据类型测试 3 | 4 | """ 5 | 6 | 7 | def f(): 8 | arr = [] 9 | f.n += 1 10 | 11 | def visit(): 12 | print(arr, id(arr)) 13 | 14 | def push(v): 15 | for i in range(f.n): 16 | arr.append(v) 17 | 18 | return visit, push 19 | 20 | 21 | f.n = 0 22 | 23 | v1, p1 = f() 24 | v2, p2 = f() 25 | 26 | p1(12) 27 | p2(10) 28 | v1() 29 | v2() 30 | p1(12) 31 | p2(10) 32 | v1() 33 | v2() 34 | -------------------------------------------------------------------------------- /060 玩转闭包/changeAbleVarTest2.py: -------------------------------------------------------------------------------- 1 | """ 2 | 闭包函数访问可变数据类型测试 3 | 可变数据类型变得复杂 4 | """ 5 | 6 | 7 | def f(): 8 | a = [[1], [2]] 9 | g = [] 10 | g.append(g) 11 | 12 | def v(): 13 | print(a, id(a[0]), id(a[1]), id(g)) 14 | 15 | return v 16 | 17 | 18 | v1 = f() 19 | v2 = f() 20 | 21 | v1() 22 | v2() 23 | -------------------------------------------------------------------------------- /060 玩转闭包/changeAbleVarThreeTest.py: -------------------------------------------------------------------------------- 1 | """ 2 | 闭包函数访问可变数据类型测试 3 | 可变数据类型变得复杂 4 | 嵌套三层 5 | """ 6 | 7 | 8 | def f(): 9 | a1 = [] 10 | 11 | def g(): 12 | a2 = [a1] 13 | 14 | def h(): 15 | print(a2, id(a2), id(a2[0])) 16 | return a2 17 | 18 | return h 19 | 20 | return g 21 | 22 | 23 | g1 = f() 24 | h1 = g1() 25 | h1().append(111) 26 | h1()[0].append(222) 27 | h1() 28 | print(h1.__closure__) 29 | 30 | g2 = f() 31 | h2 = g2() 32 | h2() 33 | print(h2.__closure__) 34 | -------------------------------------------------------------------------------- /060 玩转闭包/changeAbleVarThreeTest2.py: -------------------------------------------------------------------------------- 1 | """ 2 | 闭包函数访问可变数据类型测试 3 | 可变数据类型变得复杂 4 | 嵌套三层 5 | """ 6 | 7 | 8 | def f(): 9 | a1 = [] 10 | 11 | def g(): 12 | a2 = [a1] 13 | 14 | def h(): 15 | print(a2, id(a2), id(a2[0])) 16 | return a2 17 | 18 | return h 19 | 20 | return g 21 | 22 | 23 | # ============ 24 | 25 | g1 = f() 26 | h1 = g1() 27 | h1().append(111) 28 | h1()[0].append(222) 29 | h1() 30 | print(h1.__closure__) 31 | 32 | g2 = f() 33 | h2 = g2() 34 | h2() 35 | print(h2.__closure__) 36 | -------------------------------------------------------------------------------- /060 玩转闭包/globalTest.py: -------------------------------------------------------------------------------- 1 | a = 155 2 | 3 | 4 | def f(): 5 | global a 6 | print(a) 7 | a += 1 8 | 9 | 10 | print(f.__closure__) 11 | -------------------------------------------------------------------------------- /060 玩转闭包/keywordsTest.py: -------------------------------------------------------------------------------- 1 | """ 2 | 关于关键字的探索 3 | """ 4 | a = 1 5 | 6 | 7 | def f(): 8 | a = 2 9 | 10 | def g(): 11 | a = 3 12 | 13 | def h(): 14 | a = 4 15 | 16 | def I(): 17 | a = 5 18 | 19 | def J(): 20 | a = 6 21 | print("....") 22 | return f 23 | 24 | return J 25 | 26 | return I 27 | 28 | return h 29 | 30 | return g 31 | 32 | 33 | # f()()()()() 34 | # f.__call__().__call__().__call__().__call__().__call__() 35 | 36 | for i in range(5): 37 | # f = f.__call__() 38 | f = f() 39 | -------------------------------------------------------------------------------- /060 玩转闭包/keywordsTest1.py: -------------------------------------------------------------------------------- 1 | """ 2 | 关于关键字的探索 3 | """ 4 | a = 1 5 | 6 | 7 | def f(): 8 | a = 2 9 | 10 | def g(): 11 | a = 3 12 | 13 | def h(): 14 | a = 4 15 | 16 | def I(): 17 | nonlocal a 18 | a = 5 19 | print(a) 20 | 21 | def J(): 22 | a = 6 23 | print("....") 24 | 25 | return J 26 | 27 | return I 28 | 29 | return h 30 | 31 | return g 32 | 33 | 34 | # f()()()()() 35 | # f.__call__().__call__().__call__().__call__().__call__() 36 | 37 | for i in range(5): 38 | # f = f.__call__() 39 | f = f() 40 | 41 | print(a) -------------------------------------------------------------------------------- /060 玩转闭包/newTest.py: -------------------------------------------------------------------------------- 1 | def Student(name, age): 2 | def addAge(n): 3 | nonlocal age 4 | age += n 5 | 6 | def say(): print(f"我叫{name},我{age}岁") 7 | 8 | # def obj(): ... 9 | 10 | obj = lambda: ... 11 | 12 | obj.name = name 13 | obj.age = age 14 | obj.addAge = addAge 15 | obj.say = say 16 | return obj 17 | 18 | 19 | s1 = Student("小明", 18) 20 | s2 = Student("小红", 8) 21 | s1.say() 22 | s2.say() 23 | s1.addAge(5) 24 | s1.say() 25 | s2.say() 26 | print(s1.say.__closure__) 27 | -------------------------------------------------------------------------------- /060 玩转闭包/questions.txt: -------------------------------------------------------------------------------- 1 | 2 | 为什么object()生成出来的对象不能随意添加属性,但是 3 | def f():... 这个f可以随意添加属性 4 | https://devpress.csdn.net/python/63006e1c7e66823466196389.html? 5 | 6 | 为什么函数身上可以随意添加属性? 7 | 8 | 如何实现类的继承? 9 | 10 | -------------------------------------------------------------------------------- /060 玩转闭包/show.py: -------------------------------------------------------------------------------- 1 | def f(): 2 | a = [[], []] 3 | 4 | def g(): 5 | a[0].append(111) 6 | print(a) 7 | print(id(a[0]), id(a[1])) 8 | 9 | return g 10 | 11 | 12 | g1 = f() 13 | g2 = f() 14 | 15 | g1() 16 | g1() 17 | g1() 18 | g2() 19 | g2() 20 | -------------------------------------------------------------------------------- /060 玩转闭包/test.py: -------------------------------------------------------------------------------- 1 | """ 2 | 3 | 4 | 英文里有个单词叫 closure,根本就没有对应的中文词 5 | https://www.bilibili.com/video/BV1b3411w7rX/ 6 | 闭包 = 环境 + 控制 7 | 函数能够访问它定义是时候的环境 8 | 9 | 广义的闭包:函数就是闭包 10 | 侠义的闭包:函数访问外层作用域的变量 11 | 闭包之所以不会被销毁是因为,内部函数被return出去赋值给了全局变量, 12 | gc不会回收windows下可以访问的变量,而子函数有保存父函数的作用域, 13 | 指向父函数,因为子函数不会被销毁,所以父函数也不会被销毁 14 | 15 | 局部作用域,全局作用域 16 | js如果不加前缀let、var,就是全局变量, 17 | 函数的形参也可以看成是局部变量 18 | js在ES6之后才有块级作用域 19 | python没有大括号的写法 20 | 21 | js作用域链 22 | 23 | js高级程序设计里说:闭包是函数,一个可以访问别的函数作用域里面东西的函数 24 | 可以叫闭包函数 25 | 函数1{ 26 | 函数2{ 27 | } 28 | } 29 | 函数1是闭包函数。相对于里面来说,外面的函数是闭包函数 30 | 理解为一种现象:一个函数访问了另外一个函数里面的变量,产生了闭包现象 31 | 32 | 闭包可以避免和全局作用域冲突? 33 | """ 34 | 35 | 36 | def foo(): 37 | v = 1 38 | 39 | def add(): 40 | nonlocal v 41 | v += 1 42 | 43 | def get(): 44 | return v 45 | 46 | return add, get 47 | 48 | 49 | add1, get1 = foo() 50 | add2, get2 = foo() 51 | add1() 52 | print(get1()) 53 | print(get2()) 54 | add1() 55 | add1() 56 | add1() 57 | print(get1()) 58 | print(get2()) 59 | # 闭包,起到了变量封装的效果 60 | 61 | -------------------------------------------------------------------------------- /060 玩转闭包/three.py: -------------------------------------------------------------------------------- 1 | """ 2 | 三层嵌套 3 | """ 4 | 5 | 6 | def f(): 7 | a = 1 8 | 9 | def g(): 10 | b = 1 11 | print(a) 12 | 13 | def h(): 14 | print(a, b) 15 | 16 | return h 17 | 18 | return g 19 | 20 | 21 | g1 = f() 22 | h1 = g1() 23 | 24 | print(g1.__closure__) 25 | print(h1.__closure__) 26 | -------------------------------------------------------------------------------- /061 拓扑排序/egg.py: -------------------------------------------------------------------------------- 1 | """ 2 | 背景,假如你在用python开发游戏的任务系统 3 | 这个任务系统必须是无环的,否则就出bug了。 4 | """ 5 | 6 | # 拓扑图 7 | # 任务id:任务信息 8 | num2Task = { 9 | 1: { 10 | "name": "开始冒险", 11 | "details": "前往风起之地", 12 | }, 13 | 2: { 14 | "name": "解救云隐村", 15 | "details": "帮助云隐村解决危机", 16 | }, 17 | 3: { 18 | "name": "破晓之星", 19 | "details": "追踪星银之路", 20 | }, 21 | 4: { 22 | "name": "征服风神", 23 | "details": "挑战风神巅峰", 24 | }, 25 | 5: { 26 | "name": "龙之末裔", 27 | "details": "揭开龙的秘密", 28 | }, 29 | } 30 | 31 | graph = { 32 | 1: {2, 3}, 33 | 2: {4}, 34 | 3: {4}, 35 | 4: {5}, 36 | 5: {}, 37 | } 38 | -------------------------------------------------------------------------------- /061 拓扑排序/main.py: -------------------------------------------------------------------------------- 1 | from graphlib import TopologicalSorter, CycleError 2 | 3 | 4 | def main(): 5 | # test0() 6 | # test1() 7 | test3() 8 | ... 9 | 10 | 11 | def test0(): 12 | # 返回前驱为0的节点 13 | ts = TopologicalSorter({ 14 | "D": {"B", "C"}, 15 | "C": {"A"}, 16 | "B": {"A"} 17 | }) 18 | ts.prepare() # 先让它准备一下,看看有没有环 19 | print(ts.get_ready()) # 找到没有前驱的节点 20 | 21 | 22 | def test1(): 23 | graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}} 24 | ts = TopologicalSorter(graph) 25 | c = ts.static_order() 26 | print(list(c)[::-1]) 27 | 28 | 29 | def test2(): 30 | try: 31 | ts2 = TopologicalSorter({ 32 | 'a': {'b'}, 33 | 'b': {'c'}, 34 | 'c': {'d'}, 35 | 'd': {'a'}, 36 | }) 37 | print(list(ts2.static_order())) 38 | except CycleError: 39 | ... 40 | 41 | 42 | def test3(): 43 | # 同样的图,换一个图的生成方式,用边生成 44 | ts = TopologicalSorter() 45 | ts.add('d', 'b') 46 | ts.add('d', 'c') 47 | ts.add('b', 'a') 48 | ts.add('c', 'a') 49 | print(list(ts.static_order())) 50 | ... 51 | 52 | 53 | if __name__ == "__main__": 54 | """ 55 | 自创编译系统检测引入是否合理 56 | 工作流程管理 57 | 58 | 在游戏项目中: 59 | 任务系统 关卡设计 任务进度解锁 效果触发 60 | 61 | """ 62 | main() 63 | -------------------------------------------------------------------------------- /062 四种链式调用/main.py: -------------------------------------------------------------------------------- 1 | # .f().f().f() 的方式 2 | class MyClass1: 3 | def __init__(self): 4 | self._v = 0 5 | 6 | def add(self, v): 7 | self._v += v 8 | return self 9 | 10 | 11 | c1 = MyClass1() 12 | c1.add(1).add(1).add(5).add(10) 13 | 14 | 15 | def f(*args, **kwargs): 16 | # 在这里对参数进行判断,进行不同的操作逻辑... 17 | return f 18 | 19 | 20 | f('eat')('sleep')('sing') 21 | 22 | 23 | class MyClass2: 24 | def __init__(self): 25 | self._v = 0 26 | 27 | def __getitem__(self, item): 28 | self._v += item 29 | return self 30 | 31 | def __call__(self, *args, **kwargs): 32 | # 结尾加一个小括号只是消除pycharm的警告 33 | return self 34 | 35 | 36 | c2 = MyClass2() 37 | c2[1][1][2][10][5][6]() 38 | 39 | 40 | # .a.a.a的方式 41 | class A: 42 | @property 43 | def b(self): 44 | return self 45 | 46 | def __call__(self, *args, **kwargs): 47 | return self 48 | 49 | 50 | a = A() 51 | a.b.b.b.b.b.b.b() 52 | -------------------------------------------------------------------------------- /062 四种链式调用/test.py: -------------------------------------------------------------------------------- 1 | class Calculator: 2 | def __init__(self): 3 | self._value = 0 4 | 5 | def __getattr__(self, item): 6 | return self 7 | 8 | def __truediv__(self, other): 9 | return self 10 | 11 | def __floordiv__(self, other): 12 | return self 13 | 14 | 15 | https = www = index = Calculator() 16 | 17 | https//www.littlefean.com/index.html 18 | -------------------------------------------------------------------------------- /python迷惑行为/python可以吹口哨了/multiTest.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm multiTest 4 | 2022年11月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from winsound import Beep 9 | from time import sleep 10 | from threading import Thread 11 | 12 | 13 | def beepAndPrint(hz, time): 14 | CHAR = "▉" 15 | Beep(hz, time) 16 | print(f"{CHAR}" * int(hz / 100)) 17 | 18 | 19 | def main(): 20 | # 无法实现多线程的 21 | # Thread(target=beepAndPrint, args=(3000, 1000)).start() 22 | Thread(target=beepAndPrint, args=(5000, 1000)).start() 23 | return None 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /python迷惑行为/【已废弃】不够有趣/代码加密/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月01日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def add(a, b): 11 | return a + b 12 | 13 | 14 | def encode(string: str) -> str: 15 | # 加密代码 16 | res = "" 17 | for char in string: 18 | res += chr(ord(char) + 1) 19 | return res 20 | 21 | 22 | def decode(string: str) -> str: 23 | # 解密代码 24 | res = "" 25 | for char in string: 26 | res += chr(ord(char) - 1) 27 | return res 28 | 29 | 30 | def test(): 31 | # 字符串可以加密 32 | string = "print(add(1, 2))" 33 | exec(string) 34 | 35 | 36 | def main(): 37 | code = decode("qsjou)bee)2-!3**") 38 | exec(code) 39 | print(code) 40 | print(decode(code)) 41 | return None 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /python迷惑行为/【已废弃】不够有趣/函数套列表,列表套函数/main.py: -------------------------------------------------------------------------------- 1 | arr = [] 2 | 3 | 4 | def f(): 5 | arr.append(f) 6 | return arr 7 | 8 | 9 | f()[0]()[1]()[-1]()[2]()[3]() 10 | 11 | print(arr) 12 | print(len(arr)) 13 | 14 | lst = [] 15 | 16 | 17 | def g(array): 18 | array.append(array) 19 | return g 20 | 21 | 22 | g(lst)(lst)(lst) 23 | 24 | 25 | -------------------------------------------------------------------------------- /python迷惑行为/【已废弃】不够有趣/用魔术方法实现递归/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年10月18日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def deco(f): 11 | def newF(this, i): 12 | f(this, i) 13 | print("循环中", i) 14 | 15 | return newF 16 | 17 | 18 | # 用魔法装饰魔法 19 | class N: 20 | @deco 21 | def __matmul__(self, i): 22 | if i == -1: 23 | return 24 | else: 25 | self @ (i - 1) 26 | 27 | def __and__(self, n): 28 | return 1 if n == 1 else n * (self & n - 1) 29 | 30 | 31 | def main(): 32 | jie = N() 33 | print(jie & 3) 34 | 35 | return None 36 | 37 | 38 | if __name__ == "__main__": 39 | main() 40 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数内部删除自己/test.py: -------------------------------------------------------------------------------- 1 | # def f(item): 2 | # del item 3 | # return f 4 | # 5 | # 6 | # f(f)(f) 7 | 8 | # error 9 | def g(a): 10 | del g 11 | # g(a) 12 | return a 13 | 14 | # 所有起到缩进作用的语句 15 | # g(g)(g) 16 | 17 | # a = [1, 2, 3] 18 | # f(a) 19 | # print(a) # 无影响 20 | # 21 | # obj = object() 22 | # help(obj) 23 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/test1.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test1 4 | 2022年08月27日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | b = 10 10 | 11 | 12 | def f(a=b + 1): 13 | return a 14 | 15 | 16 | print(f()) # 11 17 | print(f()) # 11 18 | b = 100 19 | print(f()) # 11 没变 20 | 21 | # if __name__ == "__main__": 22 | # main() 23 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/test2.py: -------------------------------------------------------------------------------- 1 | 2 | class A: 3 | def f(self, a): 4 | ... 5 | 6 | @f 7 | def g(self): 8 | ... 9 | 10 | 11 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/用闭包玩面向对象/用闭包玩面向对象.py: -------------------------------------------------------------------------------- 1 | def student(name, age): 2 | 3 | def addAge(n): 4 | nonlocal age 5 | age += n 6 | 7 | def say(): 8 | print(f"我叫{name},我{age}岁") 9 | 10 | def obj(): 11 | ... # 用一个空函数对象表示实例化出来的对象 12 | obj.name = name 13 | obj.age = age 14 | obj.addAge = addAge 15 | obj.say = say 16 | return obj 17 | 18 | 19 | s1 = student("小明", 18) 20 | s2 = student("小红", 8) 21 | s1.say() 22 | s2.say() 23 | s1.addAge(5) 24 | s1.say() 25 | s2.say() 26 | print(s1.say.__closure__) 27 | print(s1.addAge.__closure__) 28 | print(s2.say.__closure__) 29 | print(s2.addAge.__closure__) 30 | 31 | 32 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/用闭包玩面向对象/继承测试.py: -------------------------------------------------------------------------------- 1 | def Person(name: str, age: int): 2 | def this(): 3 | ... 4 | 5 | def __init__(self, name: str, age: int): 6 | self.name = name 7 | self.age = age 8 | return self 9 | 10 | this = __init__(this, name, age) 11 | 12 | def say(): 13 | print(f"大家好我叫{this.name},我{this.age}岁了") 14 | 15 | def show(): 16 | print(f"xxx") 17 | 18 | this.say = say 19 | this.show = show 20 | return this 21 | 22 | 23 | def Student(name: str, age: int, class_: int): 24 | def this(): 25 | ... 26 | 27 | def __init__(self, name: str, age: int, class_: int): 28 | self = Person(name, age) 29 | self.class_ = class_ 30 | return self 31 | 32 | this = __init__(this, name, age, class_) 33 | 34 | def say(): 35 | print(f"大家好我叫{this.name},我{this.age}岁了,我在{this.class_}班") 36 | 37 | this.say = say 38 | return this 39 | 40 | 41 | p = Person("sb", 18) 42 | # print(p) 43 | p.say() 44 | 45 | s = Student("mnb", 12, 1) 46 | s.say() 47 | s.show() 48 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/用闭包玩面向对象/继承测试2.py: -------------------------------------------------------------------------------- 1 | def extend(sup_class): 2 | """模拟类继承 的装饰器语法""" 3 | 4 | def robot(sub_class): 5 | print("=====extends") 6 | for k, v in sup_class.__dict__.items(): 7 | print(k, v) 8 | print("=====") 9 | return sub_class 10 | 11 | return robot 12 | 13 | 14 | def new(obj): 15 | return obj 16 | 17 | 18 | def Person(name: str, age: int): 19 | 20 | def this(): 21 | this.name = name 22 | this.age = age 23 | 24 | this() 25 | return this 26 | 27 | 28 | # p = new(Person("aaa", 12)) 29 | p = Person("aaa", 12) 30 | print("closure::", p.__closure__) 31 | for item in p.__closure__: 32 | print(item, item.cell_contents) 33 | 34 | 35 | @extend(Person) 36 | def Student(name: str, age: int, number: int, this=lambda: ...): 37 | this.name = name 38 | this.age = age 39 | this.age = age 40 | this.number = number 41 | 42 | return this 43 | 44 | 45 | def f(a: int, b: int, c: int, d: int = 1): 46 | ... 47 | 48 | 49 | # for item in dir(f): 50 | # print(item) 51 | print("---") 52 | print(f.__annotations__) 53 | print(f.__qualname__) # 如果有类继承的话,会多上点 54 | print(f.__name__) 55 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/用闭包玩面向对象/继承测试4.py: -------------------------------------------------------------------------------- 1 | import inspect 2 | 3 | 4 | def extends(super_class): 5 | def decorator(child_class): 6 | 7 | def new_class(*args, **kwargs): 8 | 9 | if super_class is not None: 10 | print(args) 11 | super_object = super_class(*args, **kwargs) 12 | return child_class(super_object, *args, **kwargs) 13 | else: 14 | # bug 15 | return child_class(lambda: ..., *args, **kwargs) 16 | 17 | new_class.__name__ = child_class.__name__ 18 | new_class.__doc__ = child_class.__doc__ 19 | 20 | return new_class 21 | 22 | return decorator 23 | 24 | 25 | @extends(None) 26 | def Animal(self, name: str): 27 | self.name = name 28 | 29 | def to_string(): 30 | return f"I am {self.name}" 31 | 32 | self.to_string = to_string 33 | return self 34 | 35 | 36 | print(Animal("dog").to_string()) 37 | 38 | 39 | @extends(Animal) # 太麻烦了 40 | def Fish(self, name: str, color: str): 41 | self.name = name 42 | self.color = color 43 | 44 | def to_string(): 45 | return f"I am {self.name}, and my color is {self.color}" 46 | 47 | self.to_string = to_string 48 | return self 49 | 50 | 51 | print(Fish("goldfish", "gold").to_string()) 52 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/函数式编程/用闭包玩面向对象/继承测试5.py: -------------------------------------------------------------------------------- 1 | def extend(extend_cls): 2 | def decorator(cls_function): 3 | def new_function(*args, **kwargs): 4 | if extend_cls is not None: 5 | super_obj = extend_cls(*args, **kwargs) 6 | return cls_function(super_obj, *args, **kwargs) 7 | else: 8 | return cls_function(lambda: ..., *args, **kwargs) 9 | 10 | return new_function 11 | 12 | return decorator 13 | 14 | 15 | @extend(None) 16 | def Animal(self, *args, **kwargs): 17 | self.name = kwargs.get('name', 'Unknown') 18 | 19 | def to_string(): 20 | return f"I am {self.name}" 21 | 22 | self.to_string = to_string 23 | return self 24 | 25 | 26 | @extend(Animal) 27 | def Dog(self, *args, **kwargs): 28 | self.age = kwargs.get('age', 0) 29 | 30 | self.super_to_string = self.to_string # 保存父类的to_string方法 31 | 32 | def to_string(): 33 | print(self.super_to_string()) 34 | return f"I am {self.name}, I am {self.age} years old" 35 | 36 | self.to_string = to_string 37 | 38 | return self 39 | 40 | 41 | dog = Dog(name='Rufus', age=3) 42 | print(dog.to_string()) 43 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我变成了别的语言/cpp.py: -------------------------------------------------------------------------------- 1 | class A: 2 | def __init__(self, arg): 3 | self.lst = [arg] 4 | self.val = A 5 | 6 | def __str__(self): 7 | return str(self.lst) 8 | 9 | def __lshift__(self, other): 10 | print(other, end=" ") 11 | return self 12 | 13 | __repr__ = __str__ 14 | 15 | 16 | endl = "\n" 17 | 18 | cout = A(1).val(2).val(3).val(4).val(5).val(6).val(7) 19 | cout << 5 << 5 << endl 20 | 21 | 22 | class Int(int): 23 | def __init__(self, n=0): 24 | self.n = n 25 | 26 | def __pos__(self): 27 | self.n += 1 28 | return Int(self.n) 29 | 30 | def __str__(self): 31 | return self.n 32 | 33 | 34 | a = Int() 35 | for _ in range(1000): 36 | ++a 37 | print(a) 38 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我变成了别的语言/javaclass.py: -------------------------------------------------------------------------------- 1 | # 进行一些初始化操作 2 | class System: 3 | p = print 4 | 5 | class Out: 6 | @staticmethod 7 | def println(*args): 8 | print(*args) 9 | 10 | @staticmethod 11 | def print(*args): 12 | System.p(*args, end="") 13 | 14 | out = Out 15 | 16 | 17 | # 操作完毕 18 | 19 | 20 | class JavaClass: 21 | 22 | @staticmethod 23 | def main(*args, **kwargs): 24 | System.out.println(1233); 25 | # 有点逊…… 26 | 27 | ... 28 | 29 | 30 | if __name__ == "__main__": 31 | JavaClass().main() 32 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我自己引入我自己/__pycache__/a.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/python迷惑行为/【待研究】/我自己引入我自己/__pycache__/a.cpython-311.pyc -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我自己引入我自己/__pycache__/d.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/python迷惑行为/【待研究】/我自己引入我自己/__pycache__/d.cpython-311.pyc -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我自己引入我自己/a.py: -------------------------------------------------------------------------------- 1 | import a 2 | 3 | print("-") 4 | 5 | 6 | def test(): 7 | for i in range(100): 8 | print(i) 9 | 10 | 11 | def main(): 12 | a.a.a.a.a.a.a.test() 13 | return None 14 | 15 | 16 | if __name__ == "__main__": 17 | a.a.a.a.a.a.a.a.a.a.a.main() 18 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我自己引入我自己/d.py: -------------------------------------------------------------------------------- 1 | import d as dd 2 | 3 | 4 | # import d as dd 5 | # import d as ddd 6 | # 最多只能引入一次,然后执行会执行两次 7 | 8 | def j(n): 9 | return 1 if n < 1 else j(n - 1) * n 10 | 11 | 12 | print(dd.j(3)) 13 | import d as ddd 14 | 15 | print(ddd.j(5)) 16 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我运行我自己/2/test.py: -------------------------------------------------------------------------------- 1 | # import sys 2 | import os 3 | 4 | print(__file__) # 自己文件的绝对路径 5 | 6 | os.system(__file__) 7 | os.open(__file__) 8 | 9 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/我运行我自己/exec无限/test.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | print(1) 4 | with open(os.listdir()[0], encoding="utf-8") as f: 5 | exec(f.read()) 6 | 7 | # 被检测到了无限递归,被迫终止 8 | -------------------------------------------------------------------------------- /python迷惑行为/【待研究】/线程舞蹈/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年11月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from threading import Thread 9 | 10 | 11 | def t(n): 12 | if n < 0: 13 | return 14 | print(n) 15 | Thread(target=t, args=(n - 1,)).start() 16 | 17 | # 不能有返回值? 18 | # def fab(x): 19 | # if x < 0: 20 | # return 0 21 | # if x == 1: 22 | # return 1 23 | # return Thread(target=fab, args=(x - 1,)).start() + Thread(target=fab, args=(x - 2,)).start() 24 | 25 | 26 | def main(): 27 | t(15) 28 | return None 29 | 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /python迷惑行为/中文编程/a.pycn: -------------------------------------------------------------------------------- 1 | 定义 质数检测(带判断数): 2 | 如果 带判断数 《 2: 3 | 返回 假 4 | 迭代 数1 在 范围(2,整数(带判断数 ** 0.5)+1): 5 | 如果 带判断数 % 数1 == 0: 6 | 返回 假 7 | 返回 真 8 | 9 | 定义 主函数(): 10 | 迭代 数字 在 范围(1, 10000): 11 | 如果 质数检测(数字): 12 | 打印(数字) 13 | 14 | 主函数() -------------------------------------------------------------------------------- /python迷惑行为/中文编程/chinese.py: -------------------------------------------------------------------------------- 1 | 真 = True 2 | 假 = False 3 | 范围 = range 4 | 打印 = print 5 | 整数 = int 6 | 小数 = float 7 | 字符串 = str 8 | 长度 = len 9 | 索引迭代 = enumerate 10 | 解析 = eval 11 | 12 | 13 | class 字典(dict): 14 | 项 = dict.items 15 | 16 | 17 | class 列表(list): 18 | 追加 = list.append 19 | -------------------------------------------------------------------------------- /python迷惑行为/中文编程/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年08月14日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 空 = None 10 | 真 = True 11 | 12 | 13 | def 主函数(): 14 | 15 | 打印 = print 16 | 打印(123) 17 | 18 | 19 | return 空 20 | 21 | 22 | if __name__ == "__main__": 23 | 主函数() 24 | -------------------------------------------------------------------------------- /python迷惑行为/中文编程/test.py: -------------------------------------------------------------------------------- 1 | """ 2 | 全中文编程的翻译运行主文件 3 | """ 4 | 5 | from translation import trans 6 | 7 | with open("a.pycn", encoding="utf-8") as f: 8 | content = f.read() 9 | content = trans(content) 10 | 11 | with open("chinese.py", encoding="utf-8") as f: 12 | content = f.read() + content 13 | 14 | # print(content) 15 | exec(content) 16 | -------------------------------------------------------------------------------- /python迷惑行为/中文编程/translation.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm translation 4 | 此文件对中文编程的代码字符串进行关键字和一些中文符号的替换 5 | 2022年08月14日 6 | by littlefean 7 | """ 8 | from typing import * 9 | 10 | signDic = { 11 | ":": ":", 12 | ",": ",", 13 | "(": "(", 14 | ")": ")", 15 | "【": "[", 16 | "】": "]", 17 | "“": "\"", 18 | "”": "\"", 19 | "‘": "'", 20 | "’": "'", 21 | ";": ";", 22 | "?": "?", 23 | "、": "\\", 24 | "!": "!", 25 | "¥": "$", 26 | "《": "<", 27 | "》": ">", 28 | "的": ".", 29 | } 30 | kwDic = { 31 | "迭代": "for", 32 | "返回": "return", 33 | "在": "in", 34 | "类": "class", 35 | "如果": "if", 36 | "是": "is", 37 | "导入": "import", 38 | "定义": "def", 39 | } 40 | 41 | 42 | def trans(string: str) -> str: 43 | for k, v in (signDic | kwDic).items(): 44 | string = string.replace(k, v) 45 | return string 46 | 47 | 48 | def main(): 49 | return None 50 | 51 | 52 | if __name__ == "__main__": 53 | main() 54 | -------------------------------------------------------------------------------- /python迷惑行为/我把我自己删了/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月04日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # # 1 12 | # import os 13 | # os.remove(__file__) 14 | # # 2 15 | # eval("__import__('os').remove(__file__)") # 隐藏式传入os库并把自己删除 16 | 17 | # 3 加密一层 18 | # newString = "" 19 | # for char in "__import__('os').remove(__file__)": 20 | # newString += chr(ord(char) + 1) 21 | # print(newString) 22 | # newString = "``jnqpsu``)(pt(*/sfnpwf)``gjmf``*" 23 | # originString = "" 24 | # for char in newString: 25 | # originString += chr(ord(char) - 1) 26 | # print(originString) 27 | 28 | # 简化代码 29 | # eval("".join([chr(ord(char) - 1) for char in "``jnqpsu``)(pt(*/sfnpwf)``gjmf``*"])) 30 | 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /python迷惑行为/我把我自己删了/new.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm new 4 | 5 | 2022年06月04日 6 | by littlefean 7 | """ 8 | from typing import * 9 | from random import randint 10 | import os 11 | import sys 12 | 13 | 14 | def main(): 15 | # 创建一个新文件, 16 | # 新文件py里写的内容和自己一样 17 | # 运行新文件 18 | # 最后把自己删除 19 | with open(__file__, encoding="utf-8") as sf: 20 | sfc = sf.read() 21 | rand = randint(1, 1000000000000000) 22 | with open(f"{rand}.py", "w", encoding="utf-8") as f: 23 | f.write(sfc) 24 | # 执行新文件 25 | # os.system(f"{rand}.py") 26 | eval(open(f"{rand}.py", encoding="utf-8").read()) 27 | os.remove(__file__) 28 | sys.exit(0) 29 | 30 | 31 | if __name__ == "__main__": 32 | try: 33 | main() 34 | except Exception as e: 35 | print(e) 36 | input() 37 | -------------------------------------------------------------------------------- /python迷惑行为/我把我自己删了/t/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年06月11日 5 | by littlefean 6 | """ 7 | 8 | 9 | def main(): 10 | return None 11 | -------------------------------------------------------------------------------- /python迷惑行为/我把我自己删了/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年06月04日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | print("hello world") 12 | return None 13 | 14 | 15 | if __name__ == "__main__": 16 | main() 17 | -------------------------------------------------------------------------------- /python迷惑行为/我把我自己删了/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test2 4 | 2022年06月04日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import os 9 | 10 | 11 | def main(): 12 | os.system("python testArray.py") 13 | os.system("test.py") 14 | return None 15 | 16 | 17 | if __name__ == "__main__": 18 | main() 19 | -------------------------------------------------------------------------------- /python迷惑行为/我有了花括号/outline.py: -------------------------------------------------------------------------------- 1 | def f1(): 2 | a = 15 3 | if a == 15: 4 | if a == 177: 5 | if a == 166: 6 | if a == 157: 7 | if a == 1577: 8 | if a == 1571: 9 | if a == 1579: 10 | print("VVV") 11 | else: 12 | print("BBB") 13 | else: 14 | print("AA") 15 | else: 16 | print("b") 17 | else: 18 | print("c") 19 | else: 20 | print("d") 21 | else: 22 | print("e") 23 | else: 24 | print("f") 25 | 26 | 27 | # py有个梗,拿尺子比着屏幕 28 | # pycharm还算贴心,有竖线,以及自动显示 29 | # 但是有人他就是不满意,他就是喜欢大括号,甚至因为这个能和别人打起来 30 | # 我们可以魔改一下python,给他加上大括号 31 | 32 | 33 | def f2(): 34 | a = 15 35 | if (a == 15): 36 | {print(a)} 37 | else: 38 | { 39 | print("no") 40 | } 41 | 42 | # 这样就可以了 43 | # 解释 小括号是怎么回事,大括号是怎么回事 44 | # import ast 45 | # 美观打印一下发现是set 46 | 47 | # 于是这样就有缺陷了,大括号里只能写函数调用语句, 48 | # 不能赋值语句和其他循环判断语句 49 | # 所以我们可以自己定义语句 50 | -------------------------------------------------------------------------------- /python迷惑行为/我有了花括号/setTest.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | 3 | 4 | class MyObj: 5 | index = 0 6 | 7 | def __init__(self, name: str): 8 | self.name = name 9 | 10 | def __str__(self): 11 | return self.name 12 | 13 | __repr__ = __str__ 14 | 15 | def __hash__(self): 16 | # MyObj.index += 1 17 | # return MyObj.index 18 | return randint(1, 100000) 19 | 20 | 21 | s = {MyObj("a"), MyObj("c"), MyObj("e")} 22 | print(s) 23 | for item in s: 24 | print(item) 25 | # {a, c, e} 26 | 27 | s2 = set() 28 | s2.add(MyObj("a")) 29 | s2.add(MyObj("c")) 30 | s2.add(MyObj("e")) 31 | print(s2) 32 | 33 | for item in s2: 34 | print(item) 35 | -------------------------------------------------------------------------------- /python迷惑行为/我有了花括号/show.py: -------------------------------------------------------------------------------- 1 | import ast 2 | 3 | string = """ 4 | a = 15 5 | if (a == 15):{ 6 | print(a), 7 | print(a) 8 | } 9 | else:{ 10 | print("no"), 11 | 12 | } 13 | """ 14 | 15 | 16 | def myPrint(string: str): 17 | tab = 0 18 | tabStr = " " 19 | for char in string: 20 | if char in "([{": 21 | print(char, end="") 22 | tab += 1 23 | print("\n", end=tabStr * tab) 24 | elif char in ")]}": 25 | print() 26 | tab -= 1 27 | print(tabStr * tab, end=char) 28 | elif char == ",": 29 | print(char) 30 | print(tabStr * tab, end="") 31 | else: 32 | print(char, end="") 33 | 34 | 35 | myPrint(ast.dump(ast.parse(string))) 36 | 37 | a = 1 38 | if (a == 1): { 39 | print(a) 40 | } 41 | -------------------------------------------------------------------------------- /python迷惑行为/我有了花括号/美观打印.py: -------------------------------------------------------------------------------- 1 | def myPrint(string: str): 2 | tab = 0 3 | tabStr = " " 4 | for char in string: 5 | if char in "([{": 6 | # print() 7 | # print(tabStr * tab, end=char) 8 | print(char, end="") 9 | tab += 1 10 | print("\n", end=tabStr * tab) 11 | elif char in ")]}": 12 | print() 13 | tab -= 1 14 | print(tabStr * tab, end=char) 15 | elif char == ",": 16 | print(char) 17 | print(tabStr * tab, end="") 18 | else: 19 | print(char, end="") 20 | ... 21 | ... -------------------------------------------------------------------------------- /python迷惑行为/我的代码一旦改了就报错/background.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm background 4 | 2022年08月23日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import inspect 9 | 10 | 11 | def test(): 12 | """sss""" 13 | print("sss") 14 | 15 | 16 | def main(): 17 | print(inspect.getsource(test)) 18 | return None 19 | 20 | 21 | if __name__ == "__main__": 22 | main() 23 | -------------------------------------------------------------------------------- /python迷惑行为/我的代码一旦改了就报错/test.py: -------------------------------------------------------------------------------- 1 | import inspect 2 | 3 | 4 | def myStrHash(string: str) -> int: 5 | res = 0 6 | for i, char in enumerate(string): 7 | res += ord(char) ** (i + 1) 8 | res %= 1000 9 | return res 10 | 11 | 12 | def func(): 13 | """ 14 | 这个函数巴拉巴拉 15 | 我是一个*** 16 | :return: 17 | """ 18 | ... 19 | ... 20 | print("hello") 21 | 22 | 23 | def judge(): 24 | try: 25 | content = inspect.getsource(func) 26 | code = myStrHash(content) 27 | if code == 341: 28 | # 答对了 29 | print("我的代码没有被修改") 30 | ... 31 | else: 32 | # 被修改了 33 | print("我的代码被修改了!") 34 | import email 35 | # email.send(user, password, content) 36 | ... 37 | except NameError: 38 | print("我的函数被改名了或者被删除了!") 39 | 40 | 41 | def judge2(): 42 | with open("main.py") as f: 43 | c = f.read() 44 | print(myStrHash(c)) 45 | ... 46 | 47 | 48 | def main(): 49 | # func() 50 | judge() 51 | ... 52 | 53 | 54 | if __name__ == "__main__": 55 | main() 56 | -------------------------------------------------------------------------------- /python迷惑行为/我的代码一旦改了就报错/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | 4 | https://hpyculator.readthedocs.io/zh_CN/latest/utils_api/hpyfunc.html#hpyfunc-dont-change-my-code 5 | 来自 Howie皓子 的优化 6 | """ 7 | from typing import * 8 | import inspect 9 | 10 | 11 | def dont_change_my_code(fun: Callable, sign: str) -> None: 12 | """沙雕系列:别修改我的代码! 13 | 直接使用print输出hash值,未计算出结果则输出-1 14 | 15 | :param fun: 不要修改这个函数! 16 | :param sign: 标识符 17 | :return: None""" 18 | two_part_text = inspect.getsource(fun).split(sign) 19 | if len(two_part_text) > 2: 20 | raise Exception("标识符只能出现一次") 21 | if len(two_part_text) == 1: 22 | return 23 | for num in range(1_0000): 24 | if easy_text_hash(two_part_text[0] + str(num) + two_part_text[1]) == num: 25 | print(num) 26 | print("完毕") 27 | return None 28 | 29 | 30 | def easy_text_hash(string: str) -> int: 31 | res = 153434884 32 | for i, char in enumerate(string): 33 | res += ord(char) ** (i + 1) 34 | res %= 10000 35 | return res 36 | 37 | 38 | def fun_name_aaa(): 39 | """给组员:你要是改了,,有你好果子吃,,,""" 40 | if easy_text_hash(inspect.getsource(fun_name_aaa)) != '!!!': # ""里面的是标识符 41 | print("改了是吧,有你好果子吃") 42 | 43 | 44 | def main(): 45 | dont_change_my_code(fun=fun_name_aaa, sign="'!!!'") 46 | return None 47 | 48 | 49 | if __name__ == "__main__": 50 | main() 51 | -------------------------------------------------------------------------------- /python迷惑行为/我给你我自己还是调用自己/fg.py: -------------------------------------------------------------------------------- 1 | from random import random 2 | 3 | 4 | def f(): 5 | return f if random() < 0.5 else g() 6 | 7 | 8 | def g(): 9 | return f() if random() < 0.5 else g 10 | 11 | 12 | print(f()()()()()()) 13 | print(f()()()()()()) 14 | print(f()()()()()()) 15 | print(f()()()()()()) 16 | print(f()()()()()()) 17 | 18 | -------------------------------------------------------------------------------- /python迷惑行为/我给你我自己还是调用自己/r.py: -------------------------------------------------------------------------------- 1 | from random import random 2 | 3 | a = 1 4 | import sys 5 | sys.setrecursionlimit(1000000) 6 | 7 | 8 | def f(): 9 | global a 10 | a *= 2 11 | print(a) 12 | return f if random() < 0.00001 else f() 13 | 14 | 15 | f() -------------------------------------------------------------------------------- /python迷惑行为/我继承我自己/change_print.py: -------------------------------------------------------------------------------- 1 | # print.f = print 2 | print_ = print 3 | 4 | 5 | def print(*args, **kwargs): 6 | print_(*args, **kwargs) 7 | return print_ 8 | 9 | 10 | print("hello")("world") 11 | -------------------------------------------------------------------------------- /python迷惑行为/我继承我自己/demo.py: -------------------------------------------------------------------------------- 1 | class MyClass: 2 | def __init__(self): 3 | self.x = 10 4 | 5 | pass 6 | 7 | 8 | class MyClass(MyClass): 9 | def __init__(self): 10 | super().__init__() 11 | self.x = 11 12 | self.y = 20 13 | 14 | pass 15 | 16 | 17 | a = MyClass() 18 | print(a.x, a.y) 19 | print(dir(a)) 20 | 21 | # 自己是可以扩展的 22 | # 与字典类似 23 | dic = {"a": 1, "b": 2} 24 | # dic = dic | {"c": 3} 25 | dic |= {"c": 3} 26 | print(dic) 27 | 28 | 29 | # 论如何说服你的团队成员学习并使用git 30 | class int(int): 31 | def __new__(cls, x): 32 | res = super().__new__(cls, x) 33 | res.y = 20 34 | import random 35 | if random.random() < 0.01: 36 | res += 1 37 | return res 38 | 39 | pass 40 | 41 | 42 | n = int("100") 43 | print(n, type(n)) 44 | 45 | # 甚至可以把 int 给换掉 46 | -------------------------------------------------------------------------------- /python迷惑行为/我继承我自己/strange_code.py: -------------------------------------------------------------------------------- 1 | class A: 2 | def __new__(cls, *args, **kwargs): 3 | return A 4 | 5 | 6 | class A(A()()()(A(A(A(A(A)))))): 7 | pass 8 | 9 | # 这样的写法可以迷惑人,让人误以为是无限递归,让抄作业的人看不懂,但是实际上是可以运行的 -------------------------------------------------------------------------------- /python迷惑行为/我自己写我自己/a.py: -------------------------------------------------------------------------------- 1 | open(__file__, "a").write(open(__file__).read()) 2 | -------------------------------------------------------------------------------- /python迷惑行为/我自己写我自己/a.txt: -------------------------------------------------------------------------------- 1 | # 2 | # 3 | # 4 | # 5 | # 6 | # 7 | -------------------------------------------------------------------------------- /python迷惑行为/我自己写我自己/p1.py: -------------------------------------------------------------------------------- 1 | open(__file__, "a").write(open(__file__).read()) -------------------------------------------------------------------------------- /python迷惑行为/我自己写我自己/test.py: -------------------------------------------------------------------------------- 1 | arr = [1] 2 | 3 | 4 | def run(): 5 | global arr 6 | cacheLen = len(arr) 7 | for _ in range(cacheLen): 8 | arr += arr.copy() 9 | 10 | 11 | run() 12 | print(len(arr)) 13 | run() 14 | print(len(arr)) 15 | run() 16 | print(len(arr)) 17 | -------------------------------------------------------------------------------- /python迷惑行为/我自己写我自己/test2.py: -------------------------------------------------------------------------------- 1 | # 此算法用来实验a.py运行四次之后会变成多少行 2 | 3 | lines = 1 4 | 5 | 6 | def run(): 7 | global lines 8 | cacheLen = lines 9 | for _ in range(cacheLen): 10 | lines += lines 11 | 12 | 13 | run() # 2 14 | run() # 8 15 | run() # 2048 16 | run() # 10 ^ 620 17 | print(lines) 18 | -------------------------------------------------------------------------------- /python迷惑行为/我自己套我自己/d.py: -------------------------------------------------------------------------------- 1 | dic = {} 2 | dic["d"] = dic 3 | 4 | print(dic) 5 | 6 | print(eval("{'d': {...}}")) 7 | 8 | d2 = {} 9 | d1 = {"1": d2} 10 | d2["2"] = d1 11 | 12 | print(d1, d2) 13 | -------------------------------------------------------------------------------- /python迷惑行为/我自己套我自己/dl.py: -------------------------------------------------------------------------------- 1 | dic = {} 2 | lst = [] 3 | 4 | dic[1] = lst 5 | lst.append(dic) 6 | 7 | print(dic) 8 | print(lst) 9 | 10 | print("-" * 100) 11 | 12 | t = () 13 | print(t) 14 | t += t 15 | 16 | print(t) 17 | 18 | t = (..., ) 19 | print(t) 20 | t += t 21 | 22 | print(t) -------------------------------------------------------------------------------- /python迷惑行为/我自己套我自己/main.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | N = 800 4 | """ 5 | a1 = [] 6 | a2 = [] 7 | a3 = [] 8 | ... 9 | a799 = [] 10 | 11 | """ 12 | 13 | string = "".join(f"a{i} = []\n" for i in range(N)) 14 | for i in range(N): 15 | string += f"a{i}.append(a{N - 1})\n" if i == 0 else f"a{i}.append(a{i - 1})\n" 16 | 17 | for i in range(N): 18 | string += f"print(a{i})\n" 19 | 20 | exec(string) 21 | -------------------------------------------------------------------------------- /python迷惑行为/我自己套我自己/more.py: -------------------------------------------------------------------------------- 1 | # a1 = ["a1"] 2 | # a2 = ["a2"] 3 | # a3 = ["a3"] 4 | # a1.append(a3) 5 | # a2.append(a1) 6 | # a3.append(a2) 7 | # print(a1) 8 | # print(a2) 9 | # print(a3) 10 | 11 | N = 800 12 | string = "".join(f"a{i} = []\n" for i in range(N)) 13 | for i in range(N): 14 | string += f"a{i}.append(a{N - 1})\n" if i == 0 else f"a{i}.append(a{i - 1})\n" 15 | 16 | for i in range(N): 17 | string += f"print(a{i})\n" 18 | 19 | exec(string) 20 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/decoDouble.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 4 | 2022年06月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | # 装饰装饰器的装饰器 11 | def deco(robotFunc): 12 | def newRobotFunc(func): 13 | return robotFunc(robotFunc(func)) 14 | 15 | return newRobotFunc 16 | 17 | 18 | def robot(func): 19 | # 一个最简单的装饰器 20 | def newFunc(): 21 | print("=") 22 | func() 23 | 24 | return newFunc 25 | 26 | 27 | for _ in range(10): # 2^n 28 | robot = deco(robot) 29 | 30 | 31 | @robot 32 | def f(): 33 | print("hello world") 34 | 35 | 36 | f() 37 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 4 | 2022年06月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import sys 9 | 10 | sys.setrecursionlimit(10000) 11 | 12 | 13 | def f2(deco): 14 | def newDeco(func): 15 | return deco(deco(func)) 16 | 17 | return newDeco 18 | 19 | 20 | V = 0 21 | 22 | 23 | def f1(func): 24 | # 一个最简单的装饰器 25 | def newFunc(): 26 | global V 27 | V += 1 28 | print(V) 29 | # print("=") 30 | func() 31 | 32 | return newFunc 33 | 34 | 35 | def f0(): 36 | print("hello world") 37 | 38 | 39 | # ========== 2^n 很好理解 40 | # for _ in range(7): 41 | # f1 = f2(f1) 42 | # f0 = f1(f0) 43 | # f0() 44 | 45 | # ========== 2 4 16 256 ... 2↑↑n 46 | # ========== 2 2*2 4*4 16*16 47 | # f2 = f2(f2) # 4 这个好理解 {x2} => {{x2} {x2}} 48 | # f2 = f2(f2(f2)) # 16 {{{x2} {x2}} {{x2} {x2}}} 49 | # f2 = f2(f2(f2(f2))) # 256 { {{{x2} {x2}} {{x2} {x2}}} {{{x2} {x2}} {{x2} {x2}}} } 50 | # f2 = f2(f2(f2(f2(f2)))) # 直接崩掉 大于2327 51 | # f1 = f2(f1) 52 | # f0 = f1(f0) 53 | # f0() 54 | 55 | # ========== 2 4 256 内存暴涨 2↑↑↑n 56 | for _ in range(4): 57 | f2 = f2(f2) 58 | 59 | # 2 , 3 60 | # {x2} 61 | # f2 = f2(f2) # 4 , 27 {{x2} {x2}} 62 | # f2 = f2(f2) # 256 , boom {{{{x2} {x2}} {{x2} {x2}}} {{{x2} {x2}} {{x2} {x2}}} } 63 | # 64 | f1 = f2(f1) 65 | f0 = f1(f0) 66 | f0() 67 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/第一次套娃.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm simply 4 | 2022年10月24日 5 | pycharm中选中输出的=号然后按 ctrl F ,可以查看有多少个=号,进而获悉有多少层 6 | by littlefean 7 | """ 8 | from typing import * 9 | 10 | 11 | def deco2(robotFunc): 12 | def newRobotFunc(func): 13 | return robotFunc(robotFunc(func)) 14 | 15 | return newRobotFunc 16 | 17 | 18 | # 2^n级别增长 19 | @deco2 20 | @deco2 21 | @deco2 22 | @deco2 23 | @deco2 24 | @deco2 25 | def deco1(func): 26 | # 一个最简单的装饰器 27 | def newFunc(): 28 | print("=") 29 | func() 30 | 31 | return newFunc 32 | 33 | 34 | @deco1 35 | def f(): 36 | print("hello world") 37 | 38 | 39 | def main(): 40 | f() 41 | return None 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/第三次套娃.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | sys.setrecursionlimit(2147483647) 4 | 5 | 6 | def nbDeco(oldDeco): 7 | def newDeco(func): 8 | return oldDeco(oldDeco(func)) 9 | 10 | return newDeco 11 | 12 | 13 | nbDeco = nbDeco(nbDeco) # nbDeco {x2} => {{x2}{x2}} 14 | nbDeco = nbDeco(nbDeco) # nbDeco {{{x2}{x2}}} => {{{{x2}{x2}}}{{{x2}{x2}}}}{{{{x2}{x2}}}{{{x2}{x2}}}} 15 | nbDeco = nbDeco(nbDeco) 16 | 17 | 18 | @nbDeco 19 | def deco(func): 20 | def newFunc(): 21 | print("=") 22 | func() 23 | 24 | return newFunc 25 | 26 | 27 | @deco 28 | def f0(): 29 | print("hello") 30 | 31 | 32 | f0() 33 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/第二次套娃.py: -------------------------------------------------------------------------------- 1 | def nbDeco(oldDeco): 2 | def newDeco(func): 3 | return oldDeco(oldDeco(func)) 4 | 5 | return newDeco 6 | 7 | 8 | # nbDeco = nbDeco(nbDeco) 9 | # nbDeco = nbDeco(nbDeco(nbDeco)) 10 | nbDeco = nbDeco(nbDeco(nbDeco(nbDeco))) 11 | 12 | 13 | @nbDeco 14 | def deco(func): 15 | def newFunc(): 16 | print("=") 17 | func() 18 | 19 | return newFunc 20 | 21 | 22 | @deco 23 | def f0(): 24 | print("hello") 25 | 26 | 27 | f0() 28 | # pycharm中选中输出的=号然后按 ctrl F ,可以查看有多少个=号,进而获悉有多少层 29 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/视频字幕.txt: -------------------------------------------------------------------------------- 1 | 欢迎来到这一期的python迷惑小视频儿啊 2 | 我们都知道,装饰器的作用是装饰一个函数,给一个函数进行加工, 3 | 这个经过加工之后的函数就可以为我们所用了。 4 | 我们最终用的函数就是一个加工好了的,套了一层壳的函数。 5 | 6 | 如果你只是看到函数能装饰函数 7 | 你肯定不迷惑,因为这是很正常的现象啊 8 | 9 | 啊 又因为装饰器本身就是一个函数,所以 装饰器 还可以装饰 装饰器函数啊 10 | 我们管这个装饰 装饰器的函数叫《装饰装饰器》。 11 | 比如一个 装饰装饰器 可以给一个装饰器进行加工, 12 | 让这个 装饰器 的 装饰行为 重复两遍 13 | 然后 装饰器 再去装饰 普通函数 14 | 这样我们就可以看到普通函数 经过 装饰装饰器 装饰了的装饰器 装饰了 之后 15 | 被装饰的效果变多了一次! 16 | 17 | 如果你只是看到装饰器的装饰效果多了一次 18 | 你肯定不迷惑,因为这是很正常的现象啊 19 | 20 | 所以我们可以用这个 装饰装饰器 装饰这个 装饰器 两次 21 | 最终装饰行为就会变成4次 22 | 装饰3次,最终就会变成8次 23 | 装饰4次,最终就会变成16次 24 | 2 4 8 16 32 这变成了指数爆炸 25 | 26 | 如果你只是看到装饰器的装饰效果变成了指数爆炸次 27 | 你肯定不迷惑,因为这是很正常的现象啊 28 | 29 | 所以我们可以用这个装饰装饰器 去 装饰 这个装饰装饰器它本身 30 | 装饰完自己本身之后再去装饰 装饰器 31 | 最终装饰行为会变成4次 32 | 如果自己装饰自己2次 33 | 最终会变成16次 34 | 如果自己装饰自己3次 35 | 最终会变成256次 36 | 如果自己装饰自己4次 37 | 最终会变成65536次 这就爆栈了 38 | 2 4 16 256 65536 这是 指数爆炸的指数爆炸 39 | 40 | 如果你只是看到装饰器的装饰效果从指数爆炸次变成了 指数爆炸的指数爆炸 次 41 | 你肯定不迷惑,因为这是很正常的现象啊 42 | 43 | 所以我们可以用这个装饰装饰器 继续装饰自己本身 44 | 在装饰完本身之后,让装饰完本身的自己 再去装饰 装饰完本身的自己 45 | 用这种方法装饰一次 46 | 最终会变成 4 次 47 | 如果自我装饰两次 48 | 最终装饰行为就直接跳过16次 变成了 256 次 49 | 如果自我装饰3次 50 | 就会变成 340万亿亿亿亿 次 51 | 52 | 2 4 256 340万亿亿亿亿 这是 指数爆炸的指数爆炸的指数爆炸 53 | 再这样下去我们的计算机就要废啦 54 | 55 | 所以你可以用这段代码发给你的好朋友, 56 | 通过看他是不是不假思索的运行了这段代码 57 | 来检测一下他对装饰器的理解 58 | 好开个玩笑哈, 59 | 这一期视频儿就是分享一个装饰器装饰自己的迷惑行为。感谢大家的观看 60 | -------------------------------------------------------------------------------- /python迷惑行为/装饰装饰器/通向公式.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm mathTest 4 | 此模块用于找出最终套娃的时候的 通项公式 5 | 2022年10月30日 6 | by littlefean 7 | """ 8 | from typing import * 9 | 10 | 11 | def main(): 12 | def f(x): 13 | return 2 ** (2 ** x - 1) 14 | 15 | dp = [1] 16 | dp.extend((dp[-1] * dp[-1]) << 1 for _ in range(10)) 17 | for i, n in enumerate(dp): 18 | print(n) 19 | print(f(i)) 20 | print() 21 | return None 22 | 23 | 24 | if __name__ == "__main__": 25 | main() 26 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/002 推导式效率.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 002 推导式效率 4 | 5 | 8分34秒 t3-t1 低级错误 6 | 7 | 2022年08月17日 8 | by littlefean 9 | """ 10 | from typing import * 11 | from time import * 12 | 13 | 14 | def myAll(arr): 15 | for item in arr: 16 | if not bool(item): 17 | return False 18 | return True 19 | 20 | 21 | def main(): 22 | # 实际上连续执行两段还可能是有问题的 23 | # arr = list(range(1_0000_0000)) 24 | # print("start") 25 | # t1 = perf_counter_ns() 26 | # 27 | # myAll(arr) 28 | # 29 | # t2 = perf_counter_ns() 30 | # 31 | # all(arr) 32 | # 33 | # t3 = perf_counter_ns() 34 | # 35 | # d1 = t2 - t1 36 | # d2 = t3 - t2 37 | # print(d1, d2, d1 / d2) 38 | 39 | # 第二种测试方法 40 | def func(): 41 | myAll(list(range(1_0000_0000))) 42 | 43 | from timeit import timeit 44 | print(timeit(func)) 45 | 46 | # 真的快慢,还是要看底层,看C源码,看逻辑,还有列表扩容机制 47 | 48 | return None 49 | 50 | 51 | if __name__ == "__main__": 52 | main() 53 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/002 推导式效率内存问题.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 002 推导式效率内存问题 4 | 2022年08月22日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from memory_profiler import profile 9 | 10 | 11 | @profile 12 | def memoryTest(): 13 | lst0 = list(range(100)) 14 | lst1 = list(range(100000)) 15 | lst2 = [i ** i for i in range(10000)] 16 | 17 | 18 | def main(): 19 | memoryTest() 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/005 函数注解.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 005 函数注解 4 | 0分22秒 函数注释,是三引号的东西 5 | 如何获取文档注释 6 | 如何书写文档注释 7 | 8 | 2022年08月17日 9 | by littlefean 10 | """ 11 | from typing import * 12 | 13 | 14 | def func(a: int, b: float): 15 | """ 16 | vege hjuu ui gjufmdede 17 | Args: 18 | a: sdfasdf 19 | b: dsfasdds 20 | 21 | Returns: fj 22 | 23 | """ 24 | ... 25 | 26 | 27 | def main(): 28 | # 注释 29 | print(func.__doc__) 30 | func(1, 1) 31 | 32 | return None 33 | 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/008 拆包解包.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 008 拆包解包 4 | 5分25秒 集合拆包不推荐,集合的顺序是不确定的 5 | 2022年08月17日 6 | by littlefean 7 | """ 8 | from typing import * 9 | 10 | 11 | def main(): 12 | return None 13 | 14 | 15 | if __name__ == "__main__": 16 | main() 17 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/009 装饰器的本质.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 009 装饰器的本质 4 | 18分22秒 nonlocal 问题 5 | 6 | 2022年08月17日 7 | by littlefean 8 | """ 9 | from typing import * 10 | 11 | 12 | def main(): 13 | return None 14 | 15 | 16 | if __name__ == "__main__": 17 | main() 18 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/045 isinstance(a,b)和type(a)==b/1.py: -------------------------------------------------------------------------------- 1 | class A: 2 | ... 3 | 4 | 5 | class B(A): 6 | ... 7 | 8 | 9 | class C(B): 10 | ... 11 | 12 | 13 | b = B() 14 | c = C() 15 | 16 | print(type(b)) # 17 | print(type(b) == A) # False 18 | print(isinstance(b, A)) # True 19 | 20 | # b的类型是A的类型 如果用户自己写了一个MyInt类,isinstance可以识别出来int。 21 | # isinstance 更好 22 | 23 | print(type(c)) # 24 | print(type(c) == A) # False 25 | print(type(c) == B) # False 26 | print(isinstance(c, A)) # True 27 | print(isinstance(c, B)) # True 28 | 29 | # isinstance可以识别继承 30 | # 这只是个demo,录视频的时候可以加更多东西 31 | 32 | print(isinstance(c, (A, int, dict))) # 可以写更多的东西,相当于or在一起 33 | 34 | # 举一些实际的例子 35 | # 找到以前的使用type的地方。 36 | 37 | # 做点补充,各种内置类的继承关系 38 | 39 | print(type(None)) 40 | 41 | # 复杂的继承关系 42 | 43 | issubclass(A, B) # 和isinstance的区别就是第一个参数传入的是类,而不是实例 44 | 45 | # 这时候再把三种物质都拿出来,元类,类,实例 46 | # 那么类可不可以是元类的实例 47 | 48 | # 可以结合assert使用 49 | assert isinstance(b, B) 50 | 51 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/045 isinstance(a,b)和type(a)==b/show.py: -------------------------------------------------------------------------------- 1 | type 2 | isinstance( 3 | 4 | ) 5 | issubclass() 6 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/045 isinstance(a,b)和type(a)==b/多继承情况.py: -------------------------------------------------------------------------------- 1 | class M1(type): 2 | ... 3 | 4 | 5 | class M2(type): 6 | ... 7 | 8 | 9 | class C1(metaclass=M1): 10 | ... 11 | 12 | 13 | class C2(metaclass=M2): 14 | ... 15 | 16 | 17 | class S(C1, C2): 18 | ... 19 | 20 | 21 | print(type(S)) 22 | -------------------------------------------------------------------------------- /视频中的翻车行为记录/经常口误的内容.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | 编译器 解释器 编辑器 4 | 编译器:将代码文件编译成可运行文件,一般是对C语言,java来说的 5 | 解释器:python解释器,边运行边翻译 6 | 编辑器:pycharm、IDLE、vscode、记事本(配吗?) 7 | 8 | 数组arr 列表lst 9 | python的内置对象list是列表。具有非常丰富的操作 10 | python有内置模块array,导入后就可以使用了。数组。 11 | 在C语言中int arr[?] = {}; 称之为数组 12 | 13 | 方法 函数 14 | 一般类外面的def是函数 15 | 类里的是方法 16 | 17 | tuple的英文名 18 | ta-pou✓ tiu-pou?? tiu-pe?? 19 | 20 | 报错 警告 21 | 运行的时候解释器报错 22 | 编写的时候编辑器给出代码高亮警告、或者运行的时候出现 warning 23 | 24 | 包,模块,库 25 | 模块:.py文件 26 | 包:包含__init__.py 的文件夹 27 | 库:范围更大,可以是一个完整的项目 28 | 29 | 迭代器 生成器 30 | 生成器是特殊的迭代器 a = (i**3 for i in range(5)) 31 | 32 | 2022年08月17日 33 | by littlefean 34 | 35 | """ 36 | -------------------------------------------------------------------------------- /视频还没录但计划的/040 魔术方法大总结的补充/内容策划.txt: -------------------------------------------------------------------------------- 1 | 之前那期不够细啊 2 | 高级一点的,比如__enter__,__prepare__,__cause__ 之类的 -------------------------------------------------------------------------------- /视频还没录但计划的/050 next/字符串是否有两个相邻一样字符.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 字符串是否有两个相邻一样字符 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def validate(string: str) -> bool: 11 | return all(string[i] != string[i - 1] for i in range(1, len(string))) 12 | 13 | 14 | def main(): 15 | return None 16 | 17 | 18 | if __name__ == "__main__": 19 | main() 20 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 pathlib快速处理文件/a/a.shit: -------------------------------------------------------------------------------- 1 | shit -------------------------------------------------------------------------------- /视频还没录但计划的/050 pathlib快速处理文件/a/test1/b.shit: -------------------------------------------------------------------------------- 1 | shitbbb -------------------------------------------------------------------------------- /视频还没录但计划的/050 pathlib快速处理文件/main.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | # 1. 获取文件所在目录,不是工作目录 4 | root = Path(__file__).parent 5 | # 2. 遍历所有子文件(夹) 6 | for dir in root.iterdir(): 7 | print(dir.as_posix()) 8 | # 3. glob pattern 9 | for file in root.glob("./**/*.shit"): 10 | print(file.as_posix()) 11 | # 4. 读写文件 12 | (root / "a" / "a.shit").write_text("shit") 13 | (root / "a" / "test1" / "b.shit").write_text( 14 | (root / "a" / "a.shit").read_text() + "bbb" 15 | ) 16 | # 5. 链接 (what == a/a.shit) 17 | """ 18 | error: short read while indexing 视频还没录但计划的/050 pathlib快速处理文件/what 19 | error: 视频还没录但计划的/050 pathlib快速处理文件/what: failed to insert into database 20 | error: unable to index file '视频还没录但计划的/050 pathlib快速处理文件/what' 21 | """ 22 | (root / "what.ignore").hardlink_to(root / "a" / "a.shit") 23 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 python和C联动/main.py: -------------------------------------------------------------------------------- 1 | """ 2 | 3 | C文件编译成 so文件 4 | gcc -fPIC -shared c文件路径 -o 文件名.so 5 | """ 6 | 7 | # from ctypes import CDLL 8 | import ctypes 9 | # CDLL("") 10 | ctypes.windll 11 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 python和C联动/tool.c: -------------------------------------------------------------------------------- 1 | int add(int a, int b) { 2 | return a + b; 3 | } 4 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 python版本详解/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年06月29日 5 | by littlefean 6 | """ 7 | import asyncio 8 | from typing import * 9 | 10 | """ 11 | 3.1 12 | 13 | 3.2 14 | 3.3 15 | 3.4 16 | 3.5 17 | 18 | 19 | 20 | 3.6 21 | 22 | 23 | 24 | 3.7 25 | 3.8 26 | 3.9 27 | 3.10 28 | 3.11 29 | 30 | """ 31 | 32 | # 3.5 33 | 34 | """ 35 | async 和 await 36 | *[] **{} 37 | 新的矩阵乘法运算符: a @ b. 38 | typing库 39 | 改进了zip支持 40 | """ 41 | a = (15,) 42 | b = (155,) 43 | print(a @ b) 44 | 45 | # 3.6 46 | """ 47 | f"{}" 48 | 100_000 49 | """ 50 | 51 | 52 | # 允许在异步函数内同时出现yield和await,也就是可以实现异步生成器 53 | async def ticker(delay, to): 54 | """Yield numbers from 0 to *to* every *delay* seconds.""" 55 | for i in range(to): 56 | yield i 57 | await asyncio.sleep(delay) 58 | 59 | 60 | # 异步推导式 61 | 62 | # result = [i async for i in aiter() if i % 2] 63 | # result = [await fun() for fun in funcs if await condition()] 64 | 65 | # https://blog.csdn.net/Qwertyuiop2016/article/details/123556754 66 | 67 | 68 | # 3.7 69 | 70 | import importlib.resources as res 71 | 72 | 73 | # https://blog.csdn.net/be5yond/article/details/120062721 74 | 75 | # 3.9 76 | 77 | # 3.10 78 | # https://blog.csdn.net/qq_56630261/article/details/123996258 79 | 80 | # 3.11 81 | # https://xw.qq.com/cmsid/20220605A014JA00 82 | 83 | def main(): 84 | """ 85 | 86 | :return: 87 | """ 88 | 89 | return None 90 | 91 | 92 | if __name__ == "__main__": 93 | main() 94 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 python版本详解/新特性.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 新特性 4 | 2022年07月06日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | return None 12 | 13 | 14 | if __name__ == "__main__": 15 | main() 16 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 python版本详解/获取版本号.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 获取版本号 4 | 2022年06月29日 5 | by littlefean 6 | """ 7 | 8 | import sys 9 | 10 | 11 | def main(): 12 | print("Python version: ", sys.version) 13 | print("Python version info: ", sys.version_info) 14 | 15 | return None 16 | 17 | 18 | if __name__ == "__main__": 19 | main() 20 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 yield async await/asy.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm asy 4 | 2022年11月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def run(coroutine): 11 | try: 12 | coroutine.send(None) 13 | except StopIteration as e: 14 | return e.value 15 | 16 | 17 | async def async_function(): 18 | return 1 19 | 20 | 21 | async def await_coroutine(): 22 | # await语法只能出现在通过async修饰的函数中,否则会报SyntaxError错误。 23 | result = await async_function() 24 | print(result) 25 | 26 | 27 | run(await_coroutine()) 28 | 29 | 30 | def main(): 31 | return None 32 | 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 yield async await/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年11月13日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def f(): 11 | # 普通函数 12 | return 1 13 | 14 | 15 | def g(): 16 | # 生成器函数 17 | # 把yield想象成print,产出的东西会缓存到一个队列里 18 | # 外层用for接受这个 for item in gen() 19 | # 就可以从这个里面取出东西来了 20 | for i in range(100): 21 | yield i ** 2 22 | 23 | 24 | async def af(): 25 | # 异步函数 26 | return 1 27 | 28 | 29 | async def ag(): 30 | # 异步生成器函数 31 | for i in range(100): 32 | yield i ** 2 33 | 34 | 35 | def main(): 36 | print(type(f)) 37 | print(type(af)) 38 | print(type(g)) 39 | print(type(ag)) 40 | # 上面全都是 func 41 | return None 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 yield async await/异步.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | 4 | # async 意思是异步 5 | 6 | async def f(): 7 | # 在 def 前面加上 async之后,这个函数就是异步函数了,或者应该叫 协程函数 8 | # 协程函数返回的就是一个 协程对象 res = f() 只是得到协程对象,实际不会执行函数内容 9 | import random 10 | import time 11 | # 模拟网络请求情况,随机等待一段时间 12 | t = random.random() * 3 + 1 13 | time.sleep(t) 14 | print("随机时间结束", t, "s") 15 | ... 16 | 17 | 18 | # 事件循环 19 | loop = asyncio.get_event_loop() # 先获取一个事件循环 20 | 21 | loop.run_until_complete(f()) # 想要执行协程函数,要交给事件循环来处理 22 | 23 | # =============以前的写法 24 | 25 | # 现在 26 | asyncio.run(f()) # 3.7 之后加进来的 27 | 28 | # ============= await 29 | # await 后面一般跟着可等待的对象 30 | """ 31 | res = await f() 32 | await就是等待拿到结果之后再继续往下走 33 | 如果当前是等待的状态,那么就会先不执行,让事件循环里执行其他的事件 34 | """ 35 | 36 | 37 | async def func(): 38 | await asyncio.sleep(1) 39 | return "a" 40 | 41 | 42 | async def start(): 43 | taskList = [ 44 | asyncio.create_task(func(), name='t1'), 45 | asyncio.create_task(func(), name='t2'), 46 | ] 47 | done, pending = await asyncio.wait(taskList) 48 | print(done) 49 | 50 | 51 | asyncio.run(start()) 52 | 53 | # https://www.bilibili.com/video/BV1cK4y1E77y/?p=8 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 yield async await/用在链表上.py: -------------------------------------------------------------------------------- 1 | class Node: 2 | def __init__(self, val): 3 | self.val = val 4 | self.next = None 5 | 6 | def __iter__(self): 7 | # 生成器函数 return变成了yield 8 | node = self 9 | while node: 10 | yield node 11 | node = node.next 12 | 13 | def __next__(self): 14 | if self is None: 15 | raise StopIteration 16 | else: 17 | return self.next 18 | 19 | def __str__(self): 20 | return f"<{self.val}, {self.__dict__}>" 21 | 22 | __repr__ = __str__ 23 | 24 | 25 | from typing import * 26 | 27 | 28 | def main(): 29 | head = Node(1) 30 | head.next = Node(5) 31 | head.next.next = Node(3) 32 | head.next.next.next = Node(4) 33 | for item in head: 34 | print(item) 35 | print() 36 | print(head) 37 | for item in head: 38 | print(item) 39 | 40 | ... 41 | 42 | 43 | main() 44 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 优雅使用变量名/main.py: -------------------------------------------------------------------------------- 1 | from time import time 2 | from typing import * 3 | 4 | # 不知道怎么起名字可以看看这个网站 5 | # https://unbug.github.io/codelf/ 6 | 7 | # 单个字母变量的通常的含义 8 | 9 | a: int 10 | b: int 11 | c: str # for char in string, for c in string, 12 | d: dict # 字典简写 13 | e: Exception # 通常try的时候用 14 | f: callable # 可以用来表示函数 15 | g: float # 重力加速度? 16 | h: int 17 | i: int # 经典循环变量 18 | j: int # 二重循环变量 19 | k: int # 三重?或者一些其他变量 20 | l: "left=1" 21 | m: int 22 | n: int 23 | o: object # 不知道是啥的变量 24 | p: None # c指针思想 25 | q: None # c指针思想, queue 或者队列 26 | r: "left=1" 27 | s: str # 通常表示字符串 28 | t: time # 物理学的好 29 | u: None # 从来没用过这个 30 | v: complex # 可以表示矢量,也可以是速度 31 | w: int # 重量 32 | x: float # 数学变量,坐标 33 | y: float # 数学变量,坐标 34 | z: float # 数学变量,值 35 | 36 | # 数组 37 | array: list 38 | arr: list 39 | dataList: list 40 | nameList: List[str] 41 | personList: List[object] 42 | nameArr: List[str] 43 | name_arr: List[str] 44 | _arr = [] 45 | 46 | # 队列 47 | from collections import deque 48 | 49 | q: deque 50 | que: deque 51 | queue: deque 52 | Q: deque 53 | node_que: deque 54 | ... 55 | 56 | # 字典 57 | """ 58 | dic 59 | d 60 | dictionary 61 | nameDic 62 | name_dic 63 | indexDic 64 | index_dic 65 | """ 66 | 67 | # 集合 68 | """ 69 | s 70 | assemble 71 | numberSet 72 | """ 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 伪函数重载/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/050 伪函数重载/1.png -------------------------------------------------------------------------------- /视频还没录但计划的/050 伪函数重载/1.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations # 允许竖线语法 2 | from typing import overload 3 | 4 | 5 | # 其实overload并非真正的函数重载,带有@overload的函数会被ide识别为用法 6 | # 最终这个函数指向最后定义的函数 7 | # 并且一个函数内带有overload装饰器的都是一个函数 8 | 9 | 10 | @overload 11 | def func(a: str, b: int) -> str: 12 | """ 13 | a[b] 14 | """ 15 | 16 | 17 | print(id(func)) 18 | 19 | 20 | @overload 21 | def func(a: int, b: str) -> int: 22 | """ 23 | a + len(b) 24 | """ 25 | 26 | 27 | print(id(func)) 28 | 29 | 30 | @overload 31 | def func(a: int, b: list, c: tuple) -> int: 32 | """ 33 | a - len(b) + len(c) 34 | """ 35 | 36 | 37 | print(id(func)) 38 | 39 | 40 | def func(a: str | int, b: str | int, c: tuple = None): 41 | print("===") 42 | print(a, type(a)) 43 | print(b, type(b)) 44 | print(c, type(c)) 45 | if isinstance(a, str) and isinstance(b, int) and not c: 46 | # 第一个overload 47 | return a[b] 48 | elif isinstance(a, int) and isinstance(b, str) and not c: 49 | # 第二个overload 50 | return a + len(b) 51 | elif isinstance(a, int) and isinstance(b, list) and isinstance(c, tuple): 52 | # 第三个overload 53 | a - len(b) + len(c) 54 | print("===") 55 | 56 | 57 | print(id(func)) 58 | 59 | 60 | # 1.png 61 | # 图片里的 -> None 是因为截屏的时候没写返回值 62 | 63 | print(func("abc", 1)) 64 | print(func(5, "abcde")) 65 | print(func(3, [1, 2, 3], ())) 66 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 关键字/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月01日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import keyword 9 | 10 | 11 | def main(): 12 | # print(keyword.kwlist) 13 | lst = [ 14 | # 等待理解的关键字 15 | 'assert', 16 | 'async', 17 | 'await', 18 | 'yield', 19 | ] 20 | 21 | # help("assert") 22 | async def f(): 23 | await f() 24 | ... 25 | 26 | return None 27 | 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 内置object大总结/main.py: -------------------------------------------------------------------------------- 1 | allList = [ 2 | abs, 3 | dict, 4 | help, 5 | min, 6 | setattr, 7 | 8 | all, 9 | dir, 10 | hex, 11 | next, 12 | slice, 13 | 14 | any, 15 | divmod, 16 | id, 17 | object, 18 | sorted, 19 | 20 | ascii, 21 | enumerate, 22 | input, 23 | oct, 24 | staticmethod, 25 | 26 | bin, 27 | eval, 28 | int, 29 | open, 30 | str, 31 | 32 | bool, 33 | exec, 34 | isinstance, 35 | ord, 36 | sum, 37 | 38 | bytearray, 39 | filter, 40 | issubclass, 41 | pow, 42 | super, 43 | 44 | bytes, 45 | float, 46 | iter, 47 | print, 48 | tuple, 49 | 50 | callable, 51 | format, 52 | len, 53 | property, 54 | type, 55 | 56 | chr, 57 | frozenset, 58 | list, 59 | range, 60 | vars, 61 | 62 | classmethod, 63 | getattr, 64 | locals, 65 | repr, 66 | zip, 67 | 68 | compile, 69 | globals, 70 | map, 71 | reversed, 72 | __import__, 73 | 74 | complex, 75 | hasattr, 76 | max, 77 | round, 78 | 79 | delattr, 80 | hash, 81 | memoryview, 82 | set, 83 | 84 | ] 85 | 86 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 内置object大总结/分类.py: -------------------------------------------------------------------------------- 1 | allList = [ 2 | # 基础 3 | print, help, input, eval, exec, 4 | # 数学 5 | abs, round, divmod, sum, max, min, pow, 6 | hex, oct, bin, 7 | # 函数式 8 | map, filter, 9 | # 字符 10 | ascii, str, repr, ord, chr, bytearray, format, 11 | # 基础数据类型 12 | int, open, bool, bytes, complex, float, 13 | # 面向对象 14 | object, 15 | staticmethod, classmethod, 16 | isinstance, type, issubclass, super, 17 | setattr, getattr, delattr, hasattr, 18 | dir, id, property, 19 | slice, callable, hash, 20 | # 算法相关 21 | len, range, reversed, enumerate, sorted, any, all, zip, 22 | # 迭代 23 | iter, next, 24 | # 基础组合数据类型 25 | tuple, list, set, dict, frozenset, 26 | # 代码相关 27 | vars, compile, globals, locals, memoryview, 28 | # 其他 29 | __import__, 30 | quit, 31 | ] 32 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 函数参数问题/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月29日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def func1(a, b, c): 11 | ... 12 | 13 | 14 | def func2(a, *b, **c): 15 | ... 16 | 17 | 18 | # 非法 19 | # def func3(a, *b, *c): 20 | # ... 21 | 22 | # 非法 23 | # def func4(a, b, **c, *d): 24 | # ... 25 | 26 | # 得到结论,*? 与**?只能有一个,并且顺序有讲究 27 | 28 | def func4(*d, a, **b): 29 | ... 30 | 31 | 32 | 33 | # def f(a, b, /, c, d, *, e, h): / 是3.8里面的 34 | # print(a, b, c, d, e, h) 35 | 36 | 37 | def main(): 38 | return None 39 | 40 | 41 | if __name__ == "__main__": 42 | main() 43 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 多线程与多进程/pro/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年09月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | from multiprocessing import Process 10 | 11 | 12 | def main(): 13 | 14 | return None 15 | 16 | 17 | if __name__ == "__main__": 18 | main() 19 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 多线程与多进程/多线程/main.py: -------------------------------------------------------------------------------- 1 | # async def f(): 2 | # for i in range(10000): 3 | # print(i) 4 | # 5 | # 6 | # async def g(): 7 | # for i in range(10000, 10000 * 2): 8 | # print(i) 9 | # 10 | # 11 | # f() 12 | # g() 13 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 多线程与多进程/多线程/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年06月12日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import threading 9 | 10 | 11 | def f(): 12 | for i in range(100000): 13 | print("\t", i) 14 | ... 15 | 16 | 17 | def g(): 18 | for i in range(100000): 19 | print(i) 20 | ... 21 | 22 | 23 | def main(): 24 | return None 25 | 26 | 27 | if __name__ == "__main__": 28 | main() 29 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 如何优雅的收集异常/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年06月03日 5 | by littlefean 6 | 7 | 来自一个b站小伙伴提出的 8 | 在研究exceptionite收集log日志,用过logru 9 | 自带功能有点弱 10 | """ 11 | from typing import * 12 | 13 | 14 | def main(): 15 | return None 16 | 17 | 18 | if __name__ == "__main__": 19 | main() 20 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 如何优雅的收集异常/用tryexcept收集异常并美观打印.py: -------------------------------------------------------------------------------- 1 | import re 2 | import traceback 3 | import rich 4 | from pygments import highlight 5 | from pygments.lexers import Python3Lexer 6 | from pygments.formatters import TerminalFormatter 7 | 8 | def f(): 9 | raise Exception("111112222报错辣") 10 | 11 | def main(): 12 | f() 13 | 14 | try: 15 | main() 16 | except Exception as e: 17 | exc = traceback.format_exc().strip() # 获取traceback 18 | err, msg = exc.splitlines()[-1].split(": ") if len(exc.splitlines()[-1].split(": ")) == 2 else (exc.splitlines()[-1], "") # 获取err,msg 19 | tb = re.findall(r" +File [\"'](.+)[\"'], line (\d+), in (.+)\n +(.+)", exc, re.M) 20 | # 获取到信息之后就可以开始打印了 21 | rich.print("[red]Traceback[/red] [blue](most recent call last):[/blue]") 22 | for i in tb: 23 | rich.print(f" [green]{i[0].split('/')[-1]}[/green] >> {i[2]}") 24 | rich.print(f" {i[1]:0>3} | ", end="") 25 | print(highlight(i[3], Python3Lexer(), TerminalFormatter()), end="") 26 | rich.print(f"[blue]{err}[/blue] {msg}") 27 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 字典变种/只读字典.py: -------------------------------------------------------------------------------- 1 | from types import MappingProxyType 2 | 3 | mpt = MappingProxyType({2: 1, 4: 5}) 4 | print(mpt) 5 | 6 | # mpt[1000000] = 1000 # 尝试修改添加,编辑器已经开始警告了 7 | # 8 | # mpt[1000000] = 1000 # 尝试修改添加,编辑器已经开始警告了 9 | 10 | print(mpt) 11 | 12 | # 这有什么用呢?? 13 | 14 | print(mpt[2]) # 保留了查询的功能 15 | 16 | 17 | # 字典key套字典? 18 | 19 | # a = { 20 | # mpt: 123 21 | # } 22 | # print(a) 23 | # s = {mpt} 24 | # 套个der啊,不能套 25 | 26 | 27 | class M: 28 | count = 0 29 | 30 | def __init__(self): 31 | self.name = 15 32 | 33 | 34 | print(type(M.__dict__)) 35 | # 类的属性就是一种映射代理类型 36 | print(type(M().__dict__)) 37 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 字典变种/子类化UserDict.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 子类化U萨尔D尺寸图 4 | 2022年06月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | # 用于自己创建一个新的字典类,比如传入的键都会默认转化成字符串的键 12 | 13 | return None 14 | 15 | 16 | if __name__ == "__main__": 17 | main() 18 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 字典变种/字典额外操作.py: -------------------------------------------------------------------------------- 1 | # 合并字典 2 | 3 | dict1 = {'a': 1, 'b': 2} 4 | dict2 = {'b': 3, 'c': 4} 5 | # merged = {**dict1, **dict2} 6 | merged = dict1 | dict2 7 | print(merged) 8 | # {'a': 1, 'b': 3, 'c': 4} 9 | 10 | # 如果存在相同的key,来自第一个字典的key会被覆盖。 11 | 12 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 字典变种/有序字典.py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | 3 | dic = {} 4 | o = OrderedDict() 5 | string = "aoiwevnaekl" 6 | for char in string: 7 | dic[char] = 1 8 | o[char] = 1 9 | 10 | print(dic) 11 | print(o) 12 | 13 | dic.pop("o") 14 | o.pop("o") 15 | 16 | print(dic) 17 | print(o) 18 | 19 | # 3.7 字典和orderedDict一样有顺序了 20 | 21 | 22 | # from sortedContainers import SortedDict 23 | # 2022年5月28日 看力扣杯困难题发现的 这他娘的是第三方库 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 字典变种/锁链字典.py: -------------------------------------------------------------------------------- 1 | import builtins 2 | from collections import ChainMap 3 | 4 | 5 | # https://blog.csdn.net/langb2014/article/details/100122209 6 | def collection_test2(): 7 | a = {"name": 15555} 8 | b = {"age": 24} 9 | c = {"wife": "qian"} 10 | lookUp = ChainMap(a, b, c) 11 | print(lookUp) 12 | 13 | print(lookUp['age']) # 相当于字典合并 14 | print(lookUp.maps) # 视图?? 15 | lookUp.update({"age": 25}) 16 | print(lookUp) 17 | b['age'] = 26 18 | print(lookUp) 19 | print(type(lookUp.maps)) 20 | lookUp.maps[0]['age'] = 20 21 | lookUp.maps[1]['age'] = 22 22 | print(lookUp) 23 | print("-----------") 24 | d = {"name": "leng"} 25 | e = {"name": "123"} 26 | cm = ChainMap(d, e) 27 | print(cm) 28 | print(cm['name']) 29 | 30 | 31 | collection_test2() 32 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 巧用exec/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/050 巧用exec/1.png -------------------------------------------------------------------------------- /视频还没录但计划的/050 巧用exec/1.py: -------------------------------------------------------------------------------- 1 | """ 2 | exec的docstring: 3 | ↓↓↓↓↓↓↓↓↓注意这里的类型 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓全局变量 ↓↓↓↓↓↓↓↓↓本地变量(或者说是内部变量) 4 | exec(__source: ReadableBuffer | str | CodeType, __globals: dict[str, Any] | None = ..., __locals: Mapping[str, object] | None = ..., /) -> None 5 | Execute the given source in the context of globals and locals. 6 | 7 | The source may be a string representing one or more Python statements or a code object as returned by compile(). The globals must be a dictionary and locals can be any mapping, defaulting to the current globals and locals. If only globals is given, locals defaults to it. 8 | """ 9 | 10 | from pathlib import Path 11 | 12 | # 用法1 13 | print("返回值:", exec("print('hello from string 1')")) # 正确 14 | # print( 15 | # "返回值:", 16 | # exec( 17 | # """ 18 | # print('hello from string 2') 19 | # """ 20 | # ), 21 | # ) # 缩进错误 22 | print( 23 | "返回值:", 24 | exec( 25 | """ 26 | print('hello from string 3') 27 | """ 28 | ), 29 | ) # 正确 30 | 31 | print("----------") 32 | 33 | # 用法2 34 | # 看1.png!!!!!! 35 | print("返回值:", exec("print('hello from stringio')".encode("utf-8"))) 36 | with open((Path(__file__).parent / "testfile.py").as_posix(), "rb") as f: 37 | print("返回值:", exec(f.read())) # 这个不是str!!!! 38 | 39 | print("----------") 40 | 41 | # 用法3 42 | def func(): 43 | print("hello from code object") 44 | print("返回值:", exec(func.__code__)) 45 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 巧用exec/testfile.py: -------------------------------------------------------------------------------- 1 | print("hello from testfile.py") -------------------------------------------------------------------------------- /视频还没录但计划的/050 巧用exec/自己exec自己,code版.py: -------------------------------------------------------------------------------- 1 | from sys import setrecursionlimit 2 | setrecursionlimit(2147483647) # c int最大值 3 | # setrecursionlimit(2147483648) # 超过2147483647就报错 4 | def func(): 5 | exec(func.__code__) 6 | func() -------------------------------------------------------------------------------- /视频还没录但计划的/050 巧用exec/自己exec自己,str版.py: -------------------------------------------------------------------------------- 1 | from sys import setrecursionlimit 2 | setrecursionlimit(2147483647) # c int最大值 3 | # setrecursionlimit(2147483648) # 超过2147483647就报错 4 | with open(__file__, "r", encoding="u8") as f: 5 | exec(f.read()) 6 | # 运行结束记得看退出代码 7 | # cmd查看方法:echo %errorlevel% 8 | # pycharm查看方法:运行结果最后 -------------------------------------------------------------------------------- /视频还没录但计划的/050 循环函数类的各种嵌套问题/099 defAndClass/main.py: -------------------------------------------------------------------------------- 1 | import self 2 | 3 | 4 | def f(): 5 | def g(): 6 | def h(): 7 | ... 8 | 9 | 10 | class A: 11 | class B: 12 | class C: 13 | class D: 14 | class E: 15 | ... 16 | 17 | 18 | class AB: 19 | def __init__(self): 20 | self.name = None 21 | 22 | def f1(self): 23 | self.name = 1 24 | 25 | class BA: 26 | def f2(self): 27 | ... 28 | 29 | 30 | def func(): 31 | class Q: 32 | def f2(self): 33 | class P: 34 | ... 35 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 总结各种编辑器的使用技巧/show.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm show 4 | 2022年06月27日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | """ 10 | 更改变量名文件名 shift F6 11 | 移动文件夹,代码可以自动跟着改 12 | 13 | 快捷键 14 | alt+shift+回车:自动修改代码、自动修改代所有同类错误 15 | 16 | 窗口分界面 17 | 左边一个右边一个 18 | 运行结果也分出来 19 | 如果有两个屏幕,可以左边和右边拆出来窗口 20 | 21 | 查找替换 22 | 23 | 24 | 自定义代码模板,一创建一个py文件就自动写出代码模板 25 | 26 | 代码格式化 27 | 28 | 插件推荐 29 | 翻译 30 | 自动代码优化 31 | 32 | 代码缩放 33 | 34 | debug工具:其实用的很少,不如print大法 35 | 36 | 中键关闭页面 ctrlW 37 | 中键点击某个对象跳转到对应位置, ctrl+左键也可以 38 | 中键选择多光标 39 | 多个地方编写产生多个光标,按住Alt键点多个不同的地方 40 | 按键技巧 41 | 代码写着写着遇到覆盖后面字符了,那是因为你按backspace的时候按到insert键了 42 | home、end、del、ctrl右、ctrlW选择包裹字符 43 | 44 | 打开代码文件所在地方 45 | 46 | TODO写法打标签 47 | pycharm添加注记标签 (这个还真没用过) 48 | 49 | """ 50 | 51 | 52 | def main(): 53 | 54 | return None 55 | 56 | 57 | if __name__ == "__main__": 58 | main() 59 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 操作符函数写法/a.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm a 4 | 2022年08月24日 5 | by littlefean 6 | """ 7 | from functools import reduce 8 | from typing import * 9 | from operator import * 10 | 11 | 12 | def main(): 13 | # https://leetcode.cn/problems/redundant-connection/comments/ 14 | edges = edges = [[1, 2], [1, 3], [2, 3]] 15 | print(edges) 16 | a = a = a = a = 12 17 | print(a) 18 | p = p = p = p = list(range(max(reduce(add, edges)) + 1)) 19 | print(p) 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 概率论random模拟一切/050 random概率论.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 050 random概率论 4 | 2022年06月29日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | # random 库里的各种概率函数 10 | # secrets 模块可以访问你的操作系统所能提供的最安全的随机性来源。 11 | # https://docs.python.org/zh-cn/3.6/library/secrets.html#module-secrets 12 | import secrets 13 | 14 | 15 | def main(): 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 概率论random模拟一切/newTest.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm newTest 4 | 2022年07月23日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from functools import lru_cache 9 | 10 | 11 | @lru_cache() 12 | def fab(n): 13 | if n == 1: 14 | return 1 15 | if n == 2: 16 | return 2 17 | return fab(n - 1) + fab(n - 2) 18 | 19 | 20 | def main(): 21 | for i in range(1000): 22 | print(i, fab(i + 1)) 23 | return None 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 概率论random模拟一切/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月02日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from random import * 9 | 10 | 11 | def main(): 12 | # random 可以干什么 13 | 14 | randrange(1, 10, 3) 15 | random() 16 | randint(-5, 10) 17 | uniform(1, 20) 18 | 19 | # 抽奖,抽签 20 | # 在一坨东西里随机选一个 21 | print(choice([1, 2, 3, 4, 5, 6])) 22 | print(choice(range(10))) 23 | # 随机抽多个 24 | print(sample(list(range(100)), 10)) 25 | 26 | # 洗牌序列 27 | print(shuffle(list(range(100)))) 28 | return None 29 | 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 概率论random模拟一切/概率论.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 概率论 4 | 2022年07月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | from random import * 10 | 11 | 12 | def main(): 13 | for _ in range(100): 14 | u = uniform(1, 10000) 15 | t = triangular(1, 10000, 200) 16 | # 生成1到1万的随机数,生成的值更接近第三个数 17 | 18 | print(int(t), end="\t\t\t") 19 | print(int(u)) 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 概率论random模拟一切/草稿.py: -------------------------------------------------------------------------------- 1 | from random import * 2 | from typing import Sequence 3 | 4 | 5 | class Arr(Sequence): 6 | def __init__(self): 7 | self.arr = [] 8 | 9 | def push(self, n): 10 | self.arr.append(n) 11 | 12 | def __getitem__(self, item): 13 | return self.arr[item] 14 | 15 | def __len__(self): 16 | return len(self.arr) 17 | 18 | 19 | a = Arr() 20 | a.push(12) 21 | a.push(11) 22 | a.push(1111) 23 | print(choice(a)) 24 | 25 | # ============ 26 | 27 | array1 = [1, 2, 3, 4, 5] 28 | for i in reversed(range(1, len(array1))): 29 | print(i) 30 | 31 | print(sample({i for i in range(1000)}, 5)) 32 | print(sample(list(range(1000)), 5)) 33 | 34 | # =========== 35 | 36 | print("=" * 20) 37 | for _ in range(100): 38 | print(uniform(1000, 900)) 39 | 40 | # ======== 41 | print(randrange(5)) 42 | 43 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 用pprint美化输出/main.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | from pprint import PrettyPrinter 3 | 4 | pp = PrettyPrinter(indent=4) 5 | # indent 用于设置缩进 4 就是四个空格 6 | 7 | # 随便找的一个json文件 8 | with open("j.json", encoding="utf-8") as f: 9 | d = eval(f.read()) 10 | # pp.pprint(d) # 直接打印格式化后的形式 11 | 12 | string = PrettyPrinter(indent=1, width=20, depth=None, compact=False, sort_dicts=True).pformat(d) 13 | # 打印的层级数量由 depth 控制 如果数据结构的层级被打印得过深,其所包含的下一层级会被替换为 ... 14 | # compact = False 则长序列的每一项将被格式化为单独的行。 15 | # compact = True 则将在 width 可容纳的的情况下 把尽可能多的项放入每个输出行。(就是每一项打完换不换行的意思) 16 | # sort_dicts=True 字典的键会排序后输出显示 17 | 18 | print(string) 19 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 研究random/1.py: -------------------------------------------------------------------------------- 1 | import random 2 | import types 3 | from typing import * 4 | 5 | def f1(func: types.FunctionType, *args, **kwargs): 6 | """检测随机数范围,算法是撤硕里想出来的(doge""" 7 | a = [] 8 | for _ in range((sum(args) ** 3) or (3 ** 3)): 9 | a.append(func(*args, **kwargs)) 10 | a = list(set(a)) # 去重 11 | print(func.__qualname__, args, "范围:", min(a), "~", max(a), "其中一个结果:", random.choice(a)) 12 | 13 | def f2(func: types.FunctionType, *args, **kwargs): 14 | """检测随机选择的范围""" 15 | a = [] 16 | for _ in range(len(args[0]) ** 3): 17 | a.append(func(*args, **kwargs)) 18 | a = list(set(a)) # 去重 19 | print(func.__qualname__, args, "范围:", a) 20 | 21 | # 1. 最常用的几个方法 22 | f1(random.randint, 1, 10) 23 | f1(random.random) # 憋想了,这个范围算不准的,只能看文档和docstring 24 | f2(random.choice, ("这究竟是多少年前的事了呢?", "我不到啊。", "所以说,", "你们是从世界之外,", "漂游过来的?")) 25 | print(random.shuffle([1, 2, 3])) # shuffle要传可修改的iterable 26 | f1(random.randrange, 10) 27 | f1(random.randrange, 1, 11) 28 | 29 | # 2. Random对象 30 | myrandomobj = random.Random(f"1292734{random.randint(111111111111111, 111111919181000810)}1111113412341234{114514 ** 2}") # 每个seed对应一个随机数 31 | f1(myrandomobj.randint, 1, 10) 32 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 研究random/2.py: -------------------------------------------------------------------------------- 1 | import random 2 | from typing import * 3 | 4 | class MyRandom(random.Random): 5 | def __init__(self, x: Any = ...): 6 | super().__init__(x) 7 | 8 | def random(self, *args, **kwargs): 9 | print("调用了random") 10 | return super().random(*args, **kwargs) 11 | 12 | def randint(self, *args, **kwargs): 13 | """ 14 | randint就是randrange 15 | 原始定义: 16 | def randint(self, a, b): 17 | return self.randrange(a, b+1) 18 | """ 19 | print("调用了randint") 20 | return super().randint(*args, **kwargs) 21 | 22 | def randrange(self, *args, **kwargs): 23 | print("调用了randrange") 24 | return super().randrange(*args, **kwargs) 25 | 26 | myrandom = MyRandom() 27 | 28 | # 所有有关随机的方法都会调用random,最终调用_randbelow 29 | # randint其实就是randrange 30 | print("randint") 31 | myrandom.randint(1, 10) 32 | print("randrange") 33 | myrandom.randrange(10) 34 | print("choice") 35 | myrandom.choice((1, 2, 3)) 36 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 研究random/3.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | # 还有个叫做systemrandom的东西 4 | 5 | print(random.SystemRandom().random()) 6 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 组合数据类型合并/合并字典.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 合并字典 4 | 2022年06月29日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | d = {'spam': 1, 'eggs': 2, 'cheese': 3} 10 | e = {'cheese': 'cheddar', 'aardvark': 'Ethel'} 11 | 12 | # 方法1 13 | print({**d, **e}) 14 | # 方法2 15 | from collections import ChainMap 16 | 17 | print(dict(ChainMap(e, d))) 18 | # 方法3 19 | print(dict(d, **e)) 20 | # 方法4 21 | d.update(e) 22 | print(d) 23 | 24 | # 方法5 25 | print(e | d) 26 | print(e & d) 27 | print(e ^ d) 28 | 29 | def main(): 30 | a = 141534 31 | 32 | return None 33 | 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 运算符总结/test.py: -------------------------------------------------------------------------------- 1 | """ 2 | 运算符总结 3 | """ 4 | 5 | """ 6 | 太基础了啦 7 | + - * / // % ** 8 | += -= *= /= %= //= **= 9 | 10 | """ 11 | 12 | """ 13 | ^ & | 14 | ^= &= |= 15 | """ 16 | 17 | print(3 ^ 2) 18 | # print(3 | 3) 19 | print(3 & 4) 20 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 进制转化问题/十六进制的应用.py: -------------------------------------------------------------------------------- 1 | # 颜色的应用 2 | 3 | r = 255 4 | g = 35 5 | b = 156 6 | 7 | c1 = (r, g, b) 8 | print(c1) 9 | c2 = f"{hex(r)[2:]}{hex(g)[2:]}{hex(b)[2:]}" 10 | 11 | print(c2) 12 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 进制转化问题/进制转化.py: -------------------------------------------------------------------------------- 1 | # 进制转化问题 2 | print(bin(6666)) 3 | print(oct(555)) 4 | print(hex(15453)) 5 | 6 | # 十进制 decimal 7 | import decimal 8 | 9 | # print(int("0b111")) # bug 10 | 11 | print(decimal.Decimal(0b111)) 12 | 13 | # 加不加前缀都可以的 14 | print(int("0b111", 2)) 15 | print(int("111", 2)) 16 | 17 | # print(int("1121", 2)) # 非法,报错了 18 | 19 | print(int("111", 3)) # 任意进制 20 | print(int("111", 4)) # 任意进制 21 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 集合问题/冻结集合.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 冻结集合 4 | 2022年06月03日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def main(): 11 | fs = frozenset({1, 2, 3, 4}) 12 | s = {1, 2, fs} 13 | print(s) # 集合可以套冻结集合 14 | 15 | # 直接查询 O1 16 | print(frozenset({1, 2, 3, 4}) in s) 17 | print(frozenset((1, 2, 3, 4)) in s) 18 | print(frozenset([1, 2, 3, 4]) in s) 19 | return None 20 | 21 | 22 | if __name__ == "__main__": 23 | main() 24 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 集合问题/字典套集合.py: -------------------------------------------------------------------------------- 1 | graph = { 2 | 1: {1, 2, 3}, 3 | 2: {2, 3}, 4 | 3: {1}, 5 | } 6 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 集合问题/无重复列表.py: -------------------------------------------------------------------------------- 1 | import _ctypes 2 | 3 | 4 | class SetList: 5 | def __init__(self): 6 | self.lst = [] 7 | self.dic = {} 8 | 9 | def add(self, val): 10 | if val in self.dic: 11 | return 12 | self.dic[val] = len(self.lst) 13 | self.lst.append(val) 14 | 15 | def __iter__(self): 16 | """ 17 | 18 | :return: 19 | """ 20 | """ 21 | for item in self.lst: 22 | yield item 23 | """ 24 | # 以上代码直接简化 25 | yield from self.lst 26 | 27 | def __contains__(self, item): 28 | return item in self.dic 29 | 30 | def remove(self, item): 31 | if item not in self.dic: 32 | return 33 | delIndex = self.dic[item] 34 | self.dic.pop(item) # 删除dic里的数据 35 | popRes = self.lst[delIndex] 36 | self.lst[delIndex] = self.lst[-1] 37 | self.dic[self.lst[-1]] = delIndex 38 | self.lst.pop() 39 | return popRes 40 | 41 | def __str__(self): 42 | res = "<" 43 | for i, item in enumerate(self.lst): 44 | res += str(item) 45 | if i != len(self.lst) - 1: 46 | res += ", " 47 | return f"{res}>" 48 | 49 | __repr__ = __str__ 50 | 51 | 52 | sl = SetList() 53 | print(sl) 54 | 55 | sl.add(13) 56 | sl.add(15) 57 | sl.add(14) 58 | print(sl) 59 | sl.remove(15) 60 | print(sl) 61 | sl.remove(14) 62 | print(sl) 63 | sl.remove(13) 64 | print(sl) 65 | -------------------------------------------------------------------------------- /视频还没录但计划的/050 集合问题/集合操作.py: -------------------------------------------------------------------------------- 1 | # 集合操作符总结一下 2 | 3 | s1 = {1, 2, 3} 4 | s2 = {2, 3, 4} 5 | # print(s1 + s2) # bug 6 | 7 | print(s1 & s2) # 与 Tom & Jerry 8 | print(s1 | s2) # 或 9 | print(s1 ^ s2) # 非 shit + 6 = ^ 10 | 11 | print("and", s1 and s2) # & 12 | print("or", s1 or s2) # ??? 13 | print(not s2) # 判断空取反 14 | print(not s1) # 判断空取反 15 | print(s1.difference(s2), s1 - s2) # 差集 16 | 17 | while s1: 18 | print(s1) 19 | s1.pop() 20 | 21 | s3: set 22 | 23 | # 不报错的删除 24 | s = {1, 2, 3} 25 | s.remove(2) 26 | s.discard(2) 27 | 28 | # 如何实现一个有序集合 29 | 30 | 31 | # in 32 | 33 | # 集合之间的包含关系 34 | print({1, 2, 3} <= {1, 2, 3, 4}) 35 | print({1, 2, 3} <= {1, 3, 4, 5}) 36 | 37 | # 集合占用内存? 38 | print({1}.__sizeof__()) 39 | print({1, 2}.__sizeof__()) 40 | print({1, 2, 3}.__sizeof__()) 41 | print((1,).__sizeof__()) 42 | print([1].__sizeof__()) 43 | print([1, 2, 3].__sizeof__()) 44 | print("1".__sizeof__()) 45 | print(set(range(333)).__sizeof__()) 46 | -------------------------------------------------------------------------------- /视频还没录但计划的/056 导入/README.md: -------------------------------------------------------------------------------- 1 | # 导入问题 2 | 3 | --- 4 | 5 | ## 不同位置的导入问题 6 | 7 | ### 同级导入 8 | 9 | 直接import即可 10 | 11 | ### 引入更下面的内容 12 | 13 | imoprt 文件夹.模块名 即可 14 | 15 | ### 引入上面的内容 16 | 17 | 这个比较麻烦 18 | 19 | ```python 20 | import sys 21 | 22 | sys.path.insert(0, "../") 23 | import phe 24 | 25 | 26 | def main(): 27 | print(phe.f0()) 28 | return None 29 | ``` 30 | 31 | 这个情况是,目前写的这个文件在一个文件夹里。但是phe文件在父层文件夹里 32 | 33 | 缺点:pycharm不认,虽然运行不会报错,但是会有红色波浪线,很烦 34 | 35 | 36 | 37 | ## 模块代码自动执行问题 38 | 39 | 会自动执行的情况 40 | 41 | ```python 42 | import xxx 43 | ``` 44 | 45 | 只会执行一次 -------------------------------------------------------------------------------- /视频还没录但计划的/056 导入/d/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年09月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | import sys 10 | 11 | for item in sys.path: 12 | print(item) 13 | sys.path.insert(0, "../") 14 | 15 | import phe 16 | 17 | 18 | def main(): 19 | print(phe.f0()) 20 | return None 21 | 22 | 23 | if __name__ == "__main__": 24 | main() 25 | -------------------------------------------------------------------------------- /视频还没录但计划的/056 导入/f1/__init__.py: -------------------------------------------------------------------------------- 1 | from f2.test2 import func 2 | -------------------------------------------------------------------------------- /视频还没录但计划的/056 导入/f1/f2/test2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月27日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | 10 | def func(): 11 | print("....") 12 | ... 13 | 14 | 15 | def main(): 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /视频还没录但计划的/056 导入/phe.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm phe 4 | 2022年09月21日 5 | by littlefean 6 | """ 7 | from typing import * 8 | def f(): 9 | return "as" 10 | 11 | def main(): 12 | return None 13 | 14 | 15 | if __name__ == "__main__": 16 | main() 17 | -------------------------------------------------------------------------------- /视频还没录但计划的/056 导入/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年07月27日 5 | by littlefean 6 | """ 7 | from typing import * 8 | # from f1.f2.test2 import func 9 | import f1 10 | 11 | 12 | def main(): 13 | f1.func() 14 | 15 | 16 | return None 17 | 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/example.py: -------------------------------------------------------------------------------- 1 | """ 2 | python风格的设计模式 3 | """ 4 | 5 | """ 6 | 首先类可以分为很多情况,有些类的效果能用元类实现。 7 | 8 | 创建不出实例的类:抽象类 9 | 只能创建一个实例的类:单例模式 10 | 不能被继承的类:final类 11 | 必须被继承才能有作用的类:基类、元类 12 | 13 | 类创建出的实例具有自我复制能力:原型模式 14 | 15 | """ -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/单例模式/example_1.py: -------------------------------------------------------------------------------- 1 | """ 2 | 单例模式 3 | 懒汉模式 4 | """ 5 | 6 | 7 | class Singleton: 8 | __instance = None 9 | 10 | @staticmethod 11 | def getInstance(): 12 | if Singleton.__instance is None: 13 | Singleton() 14 | return Singleton.__instance 15 | 16 | def __init__(self): 17 | if Singleton.__instance is not None: 18 | raise Exception("This class is a singleton!") 19 | else: 20 | Singleton.__instance = self 21 | 22 | def someMethod(self): 23 | pass 24 | 25 | 26 | def main(): 27 | # Usage 28 | s1 = Singleton.getInstance() 29 | s2 = Singleton.getInstance() 30 | 31 | print(s1 == s2) # True 32 | 33 | 34 | if __name__ == '__main__': 35 | main() 36 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/单例模式/example_2.py: -------------------------------------------------------------------------------- 1 | from abc import ABCMeta, abstractmethod 2 | from typing import Dict 3 | 4 | 5 | class SingletonMeta(type): 6 | _instances: Dict[type, object] = {} 7 | 8 | def __call__(cls, *args, **kwargs): 9 | if cls not in cls._instances: 10 | cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs) 11 | return cls._instances[cls] 12 | 13 | 14 | class Singleton(metaclass=SingletonMeta): 15 | pass 16 | 17 | 18 | class MyABC(metaclass=ABCMeta): 19 | @abstractmethod 20 | def f(self): 21 | pass 22 | 23 | 24 | class MyClassA(Singleton, MyABC): 25 | def f(self): 26 | print('A') 27 | 28 | 29 | class MyClassB(Singleton, MyABC): 30 | def f(self): 31 | print('B') 32 | 33 | 34 | def main(): 35 | s1 = Singleton() 36 | s2 = Singleton() 37 | print(id(s1), id(s2)) # 打印两个对象的id,可以看到它们是同一个对象 38 | a1 = MyClassA() 39 | a2 = MyClassA() 40 | b1 = MyClassB() 41 | b2 = MyClassB() 42 | a1.f() # A 43 | a2.f() # A 44 | b1.f() # B 45 | b2.f() # B 46 | 47 | 48 | if __name__ == '__main__': 49 | main() 50 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/单例模式/outline.txt: -------------------------------------------------------------------------------- 1 | 用过程性、灵活性和创造性的方式来理解单例模式。《从全局变量到单例模式的自然演进过程》 2 | 3 | 0. globals.py 文件,里面定义了很多的全局变量。 4 | 1. 大字典:发现这些全局变量太多,并且有嵌套结构,可以写一个大字典。 5 | 2. 工具类:发现大字典里写函数很麻烦,并且key没有代码提示,于是把大字典改成了一个类。键值对改成了类属性 6 | 3. 单例类:发现函数需要用到一些属性。于是把类属性变成了实例属性。这就导致了需要创建实例才能用,但只用一个实例就可以了。 7 | 4. 更安全的单例类(防止外部调用产生新实例): 8 | 可以把类名前面加下划线,君子协议 9 | 可以del删掉这个类名称本身,但类还是在内存中不会被垃圾回收机制清理掉。 10 | 更安全的方法:创建单例类元类,这样创建出来的类都是一个实例了 11 | 5. 懒汉式单例模式: 12 | 这个单例的创建过程非常消耗时间,没必要一开始就创建。可以后面真正需要的时候才创建 13 | 但可能有线程安全问题,因为创建单例的过程不是原子操作。threading.Lock() 14 | 15 | 以上顺序不一定就是后面一种比前面一种好,只是一种扩展性增强和不断优化的思路。 16 | 可以说越是靠前,可能就越使用小轻量级的场景和项目,越是靠后,可能就越适合大型项目和复杂场景。 -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/原型模式/example.py: -------------------------------------------------------------------------------- 1 | class A: 2 | def __init__(self, x): 3 | # === 4 | # 这里中途可能花费了很大的时间复杂度用来计算出一个数值 5 | # === 6 | self.x = x 7 | 8 | def build1(self): 9 | for i in range(10000000): 10 | self.x += 15 11 | 12 | def build2(self): 13 | for i in range(10000000): 14 | self.x += 20 15 | 16 | def clone(self): 17 | return A(self.x) 18 | 19 | 20 | class B: 21 | 22 | def __init__(self, a): 23 | self.a = a 24 | 25 | def func(self): 26 | print(self.a) 27 | 28 | 29 | """ 30 | 原型模式可能应用到的地方: 31 | 1. 性能优化:由于创建复杂对象时,原型模式可以减少创建对象的过程,从而提高性能。 32 | 地形生成、 33 | 34 | 2. 资源优化:由于创建复杂对象时,原型模式可以减少内存占用,从而节省系统资源。 35 | 和第一个差不多 36 | 37 | 3. 代码复用:由于创建复杂对象时,原型模式可以减少代码量,从而提高代码复用率。 38 | 子弹克隆 39 | 40 | 41 | """ 42 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/原型模式/outline.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1. 可能消耗很大计算量才能创建出一个实例,并且写在了工厂函数里。再次创建相同类型的实例可以直接克隆节省时间 4 | 2. 使用简单化。比如在游戏中,让某个枪类给一个子弹属性, 5 | 每次发射开火的时候都不停的复制这个子弹,所以直接给子弹写一个克隆方法就可以,不需要再写子弹的颜色之类的东西了。 6 | 这样给枪切换不同的子弹的时候,只需要更改蓝图子弹就可以了。 7 | 8 | 还可能是机器学习模型训练的时候,每次训练都需要重新生成一个模型,这时候直接用原型模式就很方便。 9 | UI项目中,原型模式还可以直接生成好一个组件,然后每次用户拖拽到舞台上就是不停的复制一份这个组建,吸附在鼠标上然后放在舞台上 -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/__pycache__/a_class.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/__pycache__/a_class.cpython-311.pyc -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/__pycache__/b_class.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/__pycache__/b_class.cpython-311.pyc -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/__pycache__/factory.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/__pycache__/factory.cpython-311.pyc -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/b_class.py: -------------------------------------------------------------------------------- 1 | class B: 2 | def __init__(self, a: int): 3 | self.a = a 4 | 5 | def __str__(self): 6 | return f"<{self.a}>" 7 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/show/client.py: -------------------------------------------------------------------------------- 1 | from a_class import A 2 | from factory import AFactory 3 | 4 | 5 | def main(): 6 | 7 | a_normal_1 = AFactory.get_normal_instance() 8 | # ==== 9 | a2 = A(1, 1.3, 'world', [3, 4], {'c': 3, 'd': 4}) 10 | # ==== 11 | 12 | a3 = A(2, 2.3, 'python', [5, 6], {'e': 5, 'f': 6}) 13 | 14 | AFactory.SYSTEM_PERFORMANCE = 0.5 # 模拟系统性能下降,降低创建对象的速度 15 | 16 | # ==== 17 | a_normal_2 = AFactory.get_normal_instance() 18 | a_normal_3 = AFactory.get_normal_instance() 19 | 20 | AFactory.SYSTEM_PERFORMANCE = 1 # 模拟系统性能恢复,恢复创建对象的速度 21 | 22 | a_strange_1 = AFactory.get_strange_instance() 23 | 24 | # ==== 25 | a_strange_2 = AFactory.get_strange_instance() 26 | print(a_normal_1, a_normal_2, a_normal_3, a_strange_1, a_strange_2) 27 | 28 | 29 | if __name__ == '__main__': 30 | main() 31 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/study/example_1.py: -------------------------------------------------------------------------------- 1 | """ 2 | 工厂模式举例 3 | 4 | 1. 直接写在类的静态方法中 5 | """ 6 | 7 | 8 | class Vector: 9 | def __init__(self, x: int, y: int): 10 | self.x = x 11 | self.y = y 12 | 13 | @staticmethod 14 | def get_zero() -> 'Vector': 15 | # 目的:简化参数,可以直接通过类名调用静态方法 16 | return Vector(0, 0) 17 | 18 | @staticmethod 19 | def get_random() -> 'Vector': 20 | # 目的:简化参数,可以直接通过类名调用静态方法 21 | import random 22 | return Vector(random.randint(0, 100), random.randint(0, 100)) 23 | 24 | pass 25 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/工厂模式/study/ouline.txt: -------------------------------------------------------------------------------- 1 | 工厂模式: 2 | 3 | 0. 正常写类:直接写一个类 4 | 1. 出现工厂方法:但随着构造函数的参数越来越多,开始麻烦起来了。直接写在类里的一个静态方法(类方法也行) 5 | 2. 出现工厂方法的Utils文件:为了避免类中出现太多静态方法,可以把静态方法都放在一个Utils文件中。 6 | (单独写在一个文件里还可以更清晰,因为多个工厂函数内部可能调用到同一个其他的函数,那么这个被调用的函数就可以放在utils里,函数名前面加下划线表示私有) 7 | 3. 出现工厂类:发现可能集装在一个类中可能更好一些,可以写类属性,统一控制这些工厂方法。 8 | (java里必须写成类,因为函数没法单独存在) 9 | (工厂类还可以不停的继承,实现,扩展,父工厂类可以有2个工厂函数,子工厂类可以有2+1个工厂函数) 10 | 4. 出现工厂类的继承或实现(抽象工厂):发现工厂类的某一个属性需要在不同的场景中频繁修改,于是开始了工厂类的继承或者实现。 11 | (这个属性可能是代表xx性能属性) 12 | (如果直接从utils方法转成抽象工厂,那还需要再写一个工厂类) 13 | 5. 抽象工厂的抽象工厂:为了让A工厂类和B工厂类统一接口,所以出“AB统一工厂”这个抽象工厂,为了让C工厂类和D工厂类统一接口,所以出“CD统一工厂”。 14 | 然后可能会发现 CD统一工厂 和 AB统一工厂 有些重复,于是又出现了“统一工厂”这个更抽象的抽象工厂。 15 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/抽象工厂模式/example_1.py: -------------------------------------------------------------------------------- 1 | """ 2 | 传统的抽象工厂模式 3 | 4 | 抽象工厂模式是一种创建型设计模式, 5 | 它提供一个创建一系列相关或相互依赖对象的接口, 6 | 而无需指定它们具体的类。 7 | 8 | 在抽象工厂模式中, 9 | 一个工厂接口负责创建相关对象, 10 | 而子类则负责实现这些对象的创建。 11 | 12 | 13 | 北京工厂、上海工厂、广州工厂等, 14 | 这些所有的工厂都统一写一个接口,这个工厂的接口就是抽象工厂。 15 | 抽象工厂不能说是生产工厂的工厂,而是工厂的统一规定,工厂的接口。 16 | 17 | 抽象工厂模式的选择是基于工厂模式的类写法来的。 18 | 19 | 1 工厂方法写在类本身中 20 | 2 工厂方法单独写在一个类中(工厂类) 21 | 3 工厂类被统一成一个接口(抽象工厂类) 22 | """ 23 | 24 | 25 | class AbstractFactory(object): 26 | def create_product_a(self): 27 | pass 28 | 29 | def create_product_b(self): 30 | pass 31 | 32 | 33 | class ConcreteFactory1(AbstractFactory): 34 | def create_product_a(self): 35 | return ConcreteProductA1() 36 | 37 | def create_product_b(self): 38 | return ConcreteProductB1() 39 | 40 | 41 | class ConcreteFactory2(AbstractFactory): 42 | def create_product_a(self): 43 | return ConcreteProductA2() 44 | 45 | def create_product_b(self): 46 | return ConcreteProductB2() 47 | 48 | 49 | class AbstractProductA(object): 50 | pass 51 | 52 | 53 | class ConcreteProductA1(AbstractProductA): 54 | pass 55 | 56 | 57 | class ConcreteProductA2(AbstractProductA): 58 | pass 59 | 60 | 61 | class AbstractProductB(object): 62 | pass 63 | 64 | 65 | class ConcreteProductB1(AbstractProductB): 66 | pass 67 | 68 | 69 | class ConcreteProductB2(AbstractProductB): 70 | pass 71 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/构造器模式/example.py: -------------------------------------------------------------------------------- 1 | class Person: 2 | def __init__(self, name, age, hair_color=None, height=None, weight=None, address=None): 3 | self.name = name 4 | self.age = age 5 | self.hair_color = hair_color 6 | self.height = height 7 | self.weight = weight 8 | self.address = address 9 | 10 | 11 | class PersonBuilder: 12 | def __init__(self): 13 | self.person = Person(None, None) 14 | 15 | def with_name(self, name): 16 | self.person.name = name 17 | return self 18 | 19 | def with_age(self, age): 20 | self.person.age = age 21 | return self 22 | 23 | def build(self): 24 | return self.person 25 | 26 | 27 | """ 28 | 好处: 29 | 参数太多的时候可以分步骤构建,顺序可能可以换,(但实际上py有默认参数,可以不用这么麻烦) 30 | 参数太多可以把几个捏在一起放在一个构造过程函数里 31 | """ 32 | builder = PersonBuilder() 33 | person = builder.with_name("John").with_age(30).build() 34 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/创建型/构造器模式/outline.txt: -------------------------------------------------------------------------------- 1 | 一般来说python不需要构造器模式,因为: 2 | 3 | 动态追加属性(虽然可能有编辑器警告,不太推荐) 4 | 可变默认参数,可以让参数灵活决定位置 5 | 可以让构造函数没有参数,让属性全都是先给定一个默认值,后面只对需要的进行更改,这样可以减少代码量 6 | 7 | 如果遇到这种情况可以考虑构造器模式: 8 | 9 | 1. 将构造函数的职责分解为多个小函数,每个小函数负责一个构造步骤 10 | 可选参数太多,统一写起来太麻烦,可以把三四个包起来形成一个步骤 11 | 2. 创建对象的逻辑和对象本身分离。可以单独写一个 XxxGenerator 类 -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/奇怪的模式/file_type_class/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/063 设计模式大全/奇怪的模式/file_type_class/__init__.py -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/奇怪的模式/file_type_class/file_type_object.py: -------------------------------------------------------------------------------- 1 | """ 2 | 将当前这个代码文件直接视为一个对象 3 | """ 4 | 5 | value = 100 6 | value2 = 200 7 | 8 | _value3 = 300 9 | __value4 = 400 10 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/奇怪的模式/file_type_class/test.py: -------------------------------------------------------------------------------- 1 | import file_type_object 2 | 3 | 4 | def main(): 5 | print(file_type_object) 6 | print(file_type_object.value) 7 | 8 | print(file_type_object._value3) # 警告但可以访问 9 | print(file_type_object.__value4) # 反而又没有警告了 10 | 11 | pass 12 | 13 | 14 | if __name__ == '__main__': 15 | main() 16 | -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/结构型/适配器模式/对象适配器.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/063 设计模式大全/结构型/适配器模式/对象适配器.py -------------------------------------------------------------------------------- /视频还没录但计划的/063 设计模式大全/结构型/适配器模式/类适配器.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/063 设计模式大全/结构型/适配器模式/类适配器.py -------------------------------------------------------------------------------- /视频还没录但计划的/070 存根文件重载方法/api.py: -------------------------------------------------------------------------------- 1 | def run(): 2 | """ 3 | 1321365435453 4 | :return: 5 | """ 6 | print("hello") 7 | print("hello") 8 | print("hello") 9 | print("hello") 10 | print("hello") 11 | ... 12 | 13 | 14 | def jump(): 15 | print("....") 16 | ... 17 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 存根文件重载方法/api.pyi: -------------------------------------------------------------------------------- 1 | def run(): 2 | """ 3 | 这个方法具有神奇的功效 4 | 尤其是你在吃饭的时候 5 | :return: 6 | """ 7 | for i in range(10): 8 | print(i) 9 | ... 10 | 11 | 12 | def swim(): 13 | ... 14 | 15 | 16 | def func(a: list[int], b: float) -> str: 17 | ... 18 | 19 | 20 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 存根文件重载方法/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 4 | 2022年08月19日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from api import * 9 | 10 | 11 | def main(): 12 | run() 13 | """ 14 | 为什么是pyi呢?因为i是interface的意思 15 | 有接口的意思,但是python没有接口, 16 | 只是提供一个特殊的扩展 17 | 存根文件仅包含模块公共接口的描述,没有任何实现。 18 | 19 | 鼠标中键点击函数,会跳转到pyi那里 20 | 21 | 鼠标悬停函数上方,显示的是pyi那里函数的的文档注释 22 | 如果pyi和py里都写了函数注释,则会显示pyi里的注释 23 | 如果pyi里的没写注释,py里的写了注释,则显示不到注释了 24 | 25 | 如果两个地方都写了实现,则以py里的实现为主 26 | 不管pyi里有没有实现,总是按py里的实现走 27 | 28 | IDE的自动补全插件和文件回溯插件会优先去寻找XXX.pyi 29 | """ 30 | 31 | swim() 32 | # jump() # 出现警告了,说明如果两个都有文件的时候,有没有这个方法,pyi说了算 33 | 34 | return None 35 | 36 | 37 | def xxx(): 38 | ... 39 | 40 | 41 | if __name__ == "__main__": 42 | main() 43 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 用于ACM的技巧/优化性能.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 优化性能 4 | 2022年08月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import sys 9 | import gc 10 | 11 | sys.setrecursionlimit(5001) 12 | print(gc.get_threshold()) 13 | gc.set_threshold(700, 10, 5) 14 | 15 | 16 | def main(): 17 | return None 18 | 19 | 20 | if __name__ == "__main__": 21 | main() 22 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 用于ACM的技巧/前缀和.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 前缀和 4 | 2022年08月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from itertools import accumulate 9 | 10 | 11 | def main(): 12 | arr = [1, 2, 3, 4, 5] 13 | acc = list(accumulate(arr, initial=0)) 14 | acc2 = list(accumulate(arr, initial=1000)) 15 | print(acc) 16 | print(acc2) 17 | return None 18 | 19 | 20 | if __name__ == "__main__": 21 | main() 22 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 用于ACM的技巧/快速输入.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm main 4 | 2022年08月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | import sys 10 | 11 | a = sys.stdin.buffer.readline() 12 | # 能快 16ms ,在一些极限排名上可以拉扯一下 13 | 14 | print(a) 15 | 16 | 17 | def main(): 18 | if sys.hexversion == 50792688: # 中键点进去不一定准确 19 | sys.stdin = open("input.txt") 20 | else: 21 | input = sys.stdin.readline 22 | MOD = 10 ** 9 + 7 23 | return None 24 | 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 用于ACM的技巧/数学技巧.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 数学技巧 4 | 2022年10月19日 5 | by littlefean 6 | """ 7 | from typing import * 8 | from math import * 9 | 10 | 11 | def main(): 12 | print(comb(5, 2)) 13 | return None 14 | 15 | 16 | if __name__ == "__main__": 17 | main() 18 | -------------------------------------------------------------------------------- /视频还没录但计划的/070 用于ACM的技巧/输入技巧.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm 输入技巧 4 | 2022年08月10日 5 | by littlefean 6 | """ 7 | from typing import * 8 | 9 | def list_input(): 10 | # 使用列表接收单行输入的数据 11 | nums1 = list(map(int, input().split())) # 接收数字 12 | nums2 = [_ for _ in input().split()] # 同上 13 | nums3 = list(input().split()) # 接收字符串 14 | print(f"{nums1=!r} {nums2=!r} {nums3=!r}") # !r 表示输出前调用 repr() 15 | 16 | # 先输入数字n,再输入n行列表(每行一个列表, 用空格分隔) 17 | n = int(input()) 18 | nums = [list(map(int, input().split())) for _ in range(n)] # 可读性较低, 不太优雅 19 | print(f"{nums=}") 20 | 21 | # 先输入数字n,再输入n行数字(每行一个数) 22 | n = int(input()) 23 | nums = [int(input()) for _ in range(n)] 24 | print(f"{nums=}") 25 | 26 | 27 | def input_many(): 28 | """多组输入""" 29 | # 次数未知的多组输入 30 | while True: 31 | try: 32 | a, b, c = map(int, input().split()) 33 | print(a + b + c) 34 | ... 35 | except ValueError: # 实际使用过程中若有问题可将异常类型改为空或Exception 36 | break 37 | 38 | # 有次数的多组输入(给定数据输入次数, 对每次输入的数据进行处理) 39 | n = int(input()) 40 | while n: 41 | num = int(input()) 42 | print(num) 43 | ... 44 | n -= 1 45 | 46 | 47 | def main(): 48 | # 一行输入两个变量 49 | a, b = map(int, input().split()) 50 | # 一行输入n个变量用一个元组接收 51 | *c, = map(int, input().split()) 52 | 53 | print(a, b, c) 54 | 55 | return None 56 | 57 | 58 | if __name__ == "__main__": 59 | main() 60 | -------------------------------------------------------------------------------- /视频还没录但计划的/099 内置库大总结/test.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test 罗列出所有内置库 4 | 2022年08月19日 5 | by littlefean 6 | """ 7 | from typing import * 8 | import os 9 | import token, tokenize, trace, types, uuid, colorsys 10 | import bdb, __future__ 11 | 12 | 13 | def main(): 14 | a = { 15 | "b": 125, 16 | "obj": 17 | { 18 | "b": 125, 19 | } 20 | } 21 | # lst = os.listdir(r"D:\Software\WorkSoftware\Python 3.11b\Lib") 22 | # lst = os.listdir(r"C:\Users\20281\AppData\Local\JetBrains\PyCharmCE2021.1\python_stubs\489258500") 23 | # for item in lst: 24 | # if item.startswith("_"): 25 | # continue 26 | # print(item.replace(".py", "")) 27 | return None 28 | 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661106269.8573835.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661106269.8573835.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661106776.49253.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661106776.49253.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661116435.9107966.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661116435.9107966.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661116526.845693.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661116526.845693.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661116720.6373894.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661116720.6373894.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661117677.7113774.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661117677.7113774.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661160230.0184052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661160230.0184052.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661161044.056865.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661161044.056865.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661161414.3180752.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661161414.3180752.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661161600.858725.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661161600.858725.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/1661161871.3957865.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/100 用PIL绘图/1661161871.3957865.png -------------------------------------------------------------------------------- /视频还没录但计划的/100 用PIL绘图/test1.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | PyCharm test1 4 | 火灾图 5 | 2022年08月21日 6 | by littlefean 7 | """ 8 | from typing import * 9 | from random import random 10 | 11 | 12 | def main(): 13 | arr = [[0] * 100 for _ in range(100)] 14 | for line in arr: 15 | for i in range(len(line)): 16 | line[i] = 1 if random() < 0.4 else 0 17 | # 感染 18 | for y in range(len(arr)): 19 | if arr[y][0] == 0: 20 | continue 21 | q = [(0, y)] 22 | while q: 23 | 24 | position = q.pop() 25 | 26 | return None 27 | 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /视频还没录但计划的/999 语法解析/kw.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/999 语法解析/kw.xlsx -------------------------------------------------------------------------------- /视频还没录但计划的/999 语法解析/test.py: -------------------------------------------------------------------------------- 1 | import ast 2 | import pprint 3 | 4 | # https://blog.csdn.net/ThinkTimes/article/details/110831176 5 | 6 | # 直接传入字符串 7 | # ast.literal_eval("a = 155") 8 | string = """ 9 | for i in range(10): 10 | ... 11 | else: 12 | ... 13 | """ 14 | root = ast.parse(string) 15 | d = ast.dump(root) 16 | 17 | print(d) 18 | 19 | from _ast import * 20 | from keyword import * 21 | from collections import Counter 22 | 23 | count = {item: 0 for item in kwlist} 24 | 25 | 26 | class For(For): 27 | def __init__(self, *args, **kwargs): 28 | super().__init__(*args, **kwargs) 29 | count["for"] += 1 30 | ... 31 | 32 | ... 33 | 34 | 35 | class FunctionDef(FunctionDef): 36 | def __init__(self, *args, **kwargs): 37 | super().__init__(*args, **kwargs) 38 | count["def"] += 1 39 | 40 | 41 | a = Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=ListComp(elt=Name(id='i', ctx=Load()), generators=[ 42 | comprehension(target=Name(id='i', ctx=Store()), 43 | iter=Call(func=Name(id='range', ctx=Load()), args=[Num(n=10)], keywords=[]), ifs=[], is_async=0)]))]) 44 | print(count) 45 | -------------------------------------------------------------------------------- /视频还没录但计划的/999 语法解析/test2.py: -------------------------------------------------------------------------------- 1 | import keyword 2 | 3 | for item in keyword.kwlist: 4 | print(item, end="\t") 5 | 6 | docDic = { 7 | 'False': "假值,可以经过int转化为0", 8 | 'None': "空值", 9 | 'True': "真值,可以经过int()转化为1", 10 | 'and': "逻辑与", 11 | 'as': "起别名,通常和import,with 连用", 12 | 'assert': "断言语句", 13 | 'async': "异步", 14 | 'await': "异步", 15 | 'break': "跳出循环使用", 16 | 'class': "定义类", 17 | 'continue': "继续本轮循环", 18 | 'def': "定义函数", 19 | 'del': "删除对象", 20 | 'elif': "多年不写py之后最容易写错的关键字", 21 | 'else': "和if连用,也可以和for,while连用", 22 | 'except': "和try连用一起捉虫子", 23 | 'finally': "出事儿后的善后工作", 24 | 'for': "循环,也在列表推导式中出现", 25 | 'from': "引用时候使用", 26 | 'global': "在函数中声明某个变量是全局变量", 27 | 'if': "条件判断", 28 | 'import': "引入模块", 29 | 'in': "属于一种运算符", 30 | 'is': "内存地址是否相同", 31 | 'lambda': "缩句爱好者使用,但需要保证一行实现", 32 | 'nonlocal': "当出现函数嵌套的时候,你要在内层修改外层的变量", 33 | 'not': "逻辑非", 34 | 'or': "逻辑或", 35 | 'pass': "py特色", 36 | 'raise': "产生了错误", 37 | 'return': "函数的出口", 38 | 'try': "捉虫子专用", 39 | 'while': "发现死循环的时候通常是这里出了问题", 40 | 'with': "经常打开文件的时候使用,经典as f", 41 | 'yield': "生成器", 42 | } 43 | -------------------------------------------------------------------------------- /视频还没录但计划的/测试123/t2.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/测试123/t2.py -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/README.md: -------------------------------------------------------------------------------- 1 | 1. 生成 rsa 私钥和公钥(私钥必须是 pksc1 格式,公钥必须是 pksc8 格式,不带密码) 2 | 2. 在 `real.py` 中编写要加密的代码 3 | 3. 运行 `main.py`,会在 `project/my_utils.bin` 生成加密代码 4 | 4. 在 `project/main.py` 中可以导入 `loader`,通过 `exec(loader.load_module())` 将加密代码导入到当前作用域 5 | -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/main.py: -------------------------------------------------------------------------------- 1 | import rsa # pip install rsa 2 | from pathlib import Path 3 | 4 | root = Path(__file__).parent 5 | pubkey = rsa.PublicKey.load_pkcs1_openssl_pem((root / "pubkey.pem").read_bytes()) 6 | (root / "project" / "my_utils.bin").write_bytes( 7 | rsa.encrypt((root / "real.py").read_bytes(), pubkey) 8 | ) 9 | -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/project/__pycache__/loader.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/迷惑行为/只有我能运行的代码/project/__pycache__/loader.cpython-312.pyc -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/project/loader.py: -------------------------------------------------------------------------------- 1 | import rsa 2 | from pathlib import Path 3 | 4 | root = Path(__file__).parent 5 | privkey = rsa.PrivateKey.load_pkcs1((root / "privkey.pem").read_bytes()) 6 | 7 | 8 | def load_module(name: str) -> str: 9 | return rsa.decrypt((root / f"{name}.bin").read_bytes(), privkey).decode() 10 | -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/project/main.py: -------------------------------------------------------------------------------- 1 | # 尝试导入utils 2 | import loader 3 | 4 | exec(loader.load_module("my_utils")) 5 | hello("world") 6 | -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/project/my_utils.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LiRenTech/SmartPython/f9921e9d884aa760b0bffd1a21294be30944fa4f/视频还没录但计划的/迷惑行为/只有我能运行的代码/project/my_utils.bin -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/pubkey.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3uNiZWK5fWdJYS7SaApQ 3 | YmZJknYM6vCsPaKvNGlah1qB3MP+WB52lRRhESOWIfzFiZrGbiKEZXwfP1CU6wAO 4 | N89/ux7MqTTy8VW7kPYjkUZ4+onqfQuml+yleNdkx1QgSJxXEyOeG3TOoPhr9jlr 5 | wV5Q7ShoeOxuNvaOUynlejLPyDkt3wsl0F9wlOvM/2i6NN6QFXrt7QQTGYjC5UEC 6 | mn5QIV80WV9wOkv65u2sPJVg0rUiRB3EJdxMiOYMDTUwi3pmmBAFa+rCxAyMkiEq 7 | ktEPjw6sDNpAjHo5zGYoXeuyWctCPgOimv7q0kTABTk30vkh9X6CuVJT1TRtMywk 8 | owIDAQAB 9 | -----END PUBLIC KEY----- 10 | -------------------------------------------------------------------------------- /视频还没录但计划的/迷惑行为/只有我能运行的代码/real.py: -------------------------------------------------------------------------------- 1 | def hello(name: str) -> None: 2 | print("Hello", name) 3 | --------------------------------------------------------------------------------