├── .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 |
"""
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 |
--------------------------------------------------------------------------------