ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python 速查表实战指南:基于 awesome-cheatsheets 的 Python 核心语法与工程速查手册

Python 速查表实战指南:基于 awesome-cheatsheets 的 Python 核心语法与工程速查手册 文档【免费下载链接】awesome-cheatsheets超级速查表 - 编程语言、框架和开发工具的速查表单个文件包含一切你需要知道的东西 :zap:项目地址https://gitcode.com/gh_mirrors/awe/awesome-cheatsheets点击查看免费下载本篇技术指南以开源仓库 awesome-cheatsheets 中的 Python 速查表languages/python.md 为主体系统梳理 Python 的数据类型、数据结构、函数、控制流、面向对象、字符串操作、异常处理、推导式与单元测试等核心知识。读完本文你将获得一份可随手查阅、可直接复制运行的 Python 速查手册并理解各知识点的底层机制与工程实践场景足以应对日常开发与面试复习。本文内容源自仓库中 languages/python.md原始中文翻译版另有 TeX 排版版 languages/python.tex两者内容互为印证。该速查表由 Arianne Colton 与 Sean Chen 原著的 Python cheat sheet 中文翻译而来编译者为 ucasFL收录于 awesome-cheatsheets 的「编程语言」分类下见 README.md。一、Python 基础惯例在深入任何语法之前先记住三条贯穿全篇的基础惯例大小写敏感Variable与variable是两个不同的标识符。索引从 0 开始所有序列字符串、列表、元组的第一个元素下标为 0。用缩进而非花括号Python 使用空白符制表符或空格来标识代码块同一代码块内缩进必须一致。获取帮助Python 内置的交互式帮助系统是学习 API 的第一入口help() # 获取主页帮助进入交互式帮助界面 help(str.replace) # 获取函数帮助 help(re) # 获取模块帮助模块库Python 的模块只是一个简单地以.py为后缀的文件dir(module1) # 列出模块内容模块内定义的名称 import module # 导入模块 module1.func1() # 调用模块中的函数注import语句会创建一个新的命名空间namespace并且在该命名空间内执行.py文件中的所有语句。如果你想把模块内容导入到当前命名空间请使用from module1 import *语句。结合本仓库其他速查表可以直观感受模块即文件例如 Bash 速查表、Go 速查表 都以单文件形式承载完整知识点这正体现了本项目单个文件包含一切你需要知道的东西的定位。二、数值类类型查看变量的数据类型使用内置函数type(variable)。Python 中经常使用的数据类型共有六种。六种常用数据类型int/long过大的int类型会被自动转化为long类型在 Python 3 中int与long已统一为int任意大整数原生支持。float64 位Python 中没有double类型。bool真True或假False。str在 Python 2 中默认以 ASCII 编码而在 Python 3 中默认以 Unicode 编码。字符串可置于单引号、双引号或三引号中三引号常用于多行字符串和文档字符串字符串是字符的序列因此可以像处理其他序列一样处理字符串索引、切片、迭代特殊字符可通过\转义或者前缀r实现raw 字符串反斜杠不再转义str1 rthis\f?ff字符串可通过多种方式格式化经典的%格式化方式如下template %.2f %s haha $%d; str1 template % (4.88, hola, 2)NoneType (None)Python 的 null 值None对象只存在一个实例。None不是一个保留关键字而是NoneType的一个唯一实例None通常是可选函数参数的默认值def func1(a, b, cNone): ...None的常见用法判断变量是否为空务必用is而非if variable is None: ...datetimePython 内置的datetime模块提供了datetime、date以及time类型其中datetime组合了存储于date和time中的信息# 从字符串中创建 datetimestrptimestring parse time dt1 datetime.strptime(20091031, %Y%m%d) # 获取 date 对象 dt1.date() # 获取 time 对象 dt1.time() # 将 datetime 格式化为字符串strftimestring format time dt1.strftime(%m/%d/%Y%H:%M) # 更改字段值replace 返回新对象不改动原对象 dt2 dt1.replace(minute0, second30) # 做差diff 是一个 datetime.timedelta 对象 diff dt1 - dt2注str、bool、int和float同时也是显式类型转换函数例如int(42)、float(3.14)。除字符串和元组外Python 中的绝大多数对象都是可变的列表、字典、集合可原地修改。三、数据结构注所有的非只读non-Get函数调用比如下面例子中的list1.sort()除非特别声明都是原地操作不会创建新的对象。元组Tuple元组是 Python 中任何类型的对象的一个一维、固定长度、不可变的序列# 创建元组两种等价写法 tup1 4, 5, 6 tup1 (6, 7, 8) # 创建嵌套元组 tup1 (4, 5, 6), (7, 8) # 将序列或迭代器转化为元组 tuple([1, 0, 2]) # 连接元组返回新元组原元组不变 tup1 tup2 # 解包元组 a, b, c tup1元组应用——最经典的莫过于无需临时变量即可交换两个变量的值a, b b, a列表List列表是 Python 中任何类型的对象的一个一维、非固定长度、可变内容可以被修改的序列# 创建列表 list1 [1, a, 3] list1 list(tup1) # 从元组创建列表 # 连接列表 list1 list2 # 返回新列表 list1.extend(list2) # 原地扩展推荐 # 追加到列表的末尾 list1.append(b) # 插入指定位置 list1.insert(PosIndex, a) # 弹出给定位置的值反向插入的逆操作默认弹出末尾 ValueAtIdx list1.pop(PosIndex) # 移除列表中的第一个值a 必须是列表中第一个出现的值 list1.remove(a) # 检查成员返回 True 或 False 3 in list1 # 对列表进行排序原地排序 list1.sort() # 按特定方式排序 list1.sort(keylen) # 按长度排序性能要点使用连接列表开支较大因为这个过程会创建一个新的列表然后复制对象。因此使用extend()是更明智的选择。insert和append相比会有更大的开支时间/空间因为insert需要移动后续元素。在列表中检查是否包含一个值会比在字典和集合中慢很多前者需要线性扫描后者基于哈希表只需要常数时间。内置的bisect模块bisect用于对一个排序好的列表进行二分查找或插入bisect.bisect找到元素在列表中的位置bisect.insort将元素插入到相应位置保持有序。用法import bisect list1 list(range(10)) # 找到 5 在 list1 中的位置从 1 开始因此 position index 1 bisect.bisect(list1, 5) # 将 3.5 插入 list1 中合适位置 bisect.insort(list1, 3.5)注bisect模块中的函数并不会去检查列表是否排序好因为这很耗时。所以对未排序好的列表使用这些函数也不会报错但可能返回不正确的结果——调用方需自行保证列表有序。针对序列类型的切片序列类型包括str、array、tuple、list等均支持切片操作list1[start:stop] # 如果使用 step步长 list1[start:stop:step]注切片结果包含start索引但不包含stop索引左闭右开start/stop索引可以省略省略时默认为序列从开始到结束如list1 list1[:]。step的应用# 取出奇数位置的元素下标 0、2、4... list1[::2] # 反转字符串 str1[::-1]字典哈希表字典是无序指键的存储顺序由哈希决定的键值对集合# 创建字典 dict1 {key1: value1, 2: [3, 2]} # 从序列创建字典zip 配对两个列表 dict(zip(KeyList, ValueList)) # 获取 / 设置 / 插入元素 dict1[key1] dict1[key1] NewValue # get 提供默认值 dict1.get(key1, DefaultValue) # 检查键是否存在 key1 in dict1 # 获取键列表 dict1.keys() # 获取值列表 dict1.values() # 更新值dict1 中与 dict2 相同的键被 dict2 的值替换新键则新增 dict1.update(dict2)注意如果键不存在使用dict1[key]会抛出KeyError Exception当键不存在时get()如果不提供默认值则返回None以相同的顺序返回键列表和值列表但顺序不是特定的也就是说极大可能非排序。有效字典键类型键必须是不可变的比如标量类型int、float、string或者元组元组中的所有对象也必须是不可变的这儿涉及的技术术语是可哈希hashability。可以用函数hash()检查一个对象是否可哈希hash(This is a string)会返回一个哈希值而hash([1, 2])则会报错列表不可哈希因此不能作为字典键。集合Set一个集合是一些无序且唯一的元素聚集你可以把它看成只有键的字典。# 创建集合两种等价写法重复元素会被自动去重 set([3, 6, 3]) {3, 6, 3} # 子集测试 set1.issubset(set2) # 超集测试 set1.issuperset(set2) # 测试两个集合中的元素是否完全相同 set1 set2集合操作数学意义上的四种运算操作运算符含义并或set1 \| set2两个集合的并集交与set1 set2两个集合的交集差set1 - set2属于 set1 但不属于 set2对称差异或set1 ^ set2仅属于其中一个集合的元素四、函数Python 的函数参数传递是通过引用传递对象引用可理解为传递的是对象指针。基本形式def func1(posArg1, keywordArg11, ...): ...注关键字参数必须跟在位置参数的后面默认情况下Python 不会延迟求值默认参数的表达式的值在定义时会立刻求出来——因此不要用可变对象如列表、字典作为默认参数值否则所有调用共享同一对象。函数调用机制所有函数均位于模块内部作用域见模块部分在调用函数时参数被打包成一个元组和一个字典函数接收一个元组args和一个字典kwargs然后在函数内部解包这正是*args与**kwargs的底层机制。函数是对象的常见用法函数可作为参数传入其他函数def func1(ops[str.strip, user_define_func, ...], ...): for function in ops: value function(value)返回值如果函数直到结束都没有return语句则返回None如果有多个返回值则通过一个元组来实现return (value1, value2) value1, value2 func1(...) # 解包接收匿名函数Lambda 函数匿名函数是一个只包含一条语句的简单函数lambda x: x * 2 # 等价于 def func1(x): return x * 2匿名函数的典型应用是柯里化currying即利用已存在函数的部分参数来派生新的函数ma60 lambda x: pd.rolling_mean(x, 60)一些有用的函数针对数据结构Enumerate返回一个序列(i, value)元组i是当前item的索引for i, value in enumerate(collection): ...应用创建一个序列中值与其在序列中位置的字典映射假设每一个值都是唯一的{value: i for i, value in enumerate(collection)}Sorted可以从任意序列返回一个排序好的新序列不修改原序列sorted([2, 1, 3]) # [1, 2, 3]应用sorted(set(abc bcd)) # [ , a, b, c, d] # 返回一个字符串排序后无重复的字母序列Zip可以把许多列表、元组或其他序列的元素配对起来创建一系列的元组zip(seq1, seq2) # [(seq1_1, seq2_1), (...), ...]zip()可以接收任意数量的序列作为参数但产生的元素的数目取决于最短的序列应用多个序列同时迭代for i, (a, b) in enumerate(zip(seq1, seq2)): ...unzip另一种思考方式是把一些行转化为一些列seq1, seq2 zip(*zipOutput)Reversed将一个序列的元素以逆序迭代list(reversed(range(10)))注reversed()会返回一个迭代器惰性求值list()使之成为一个列表。五、控制流用于if-else条件中的操作符var1 is var2 # 检查两个变量是否是相同的对象同一性 var1 is not var2 # 检查两个变量是否是不同的对象 var1 var2 # 检查两个变量的值是否相等相等性注Python 中使用and、or、not来组合条件而不是使用、||、!。for循环的常见用法for element in iterator: # 可迭代对象list、tuple或迭代器 pass for a, b, c in iterator: # 如果元素是可以解包的序列 passpass无操作语句在不需要进行任何操作的块中使用占位。三元表达式又称简洁的if-else基本形式value true-expr if condition else false-exprPython 中没有switch/case语句请使用if/elif。六、面向对象编程对象是 Python 中所有类型的根一切类型的最终基类。万物数字、字符串、函数、类、模块等皆为对象每个对象均有一个类型type。对象变量是一个指向变量在内存中位置的指针。所有对象均会被引用计数垃圾回收的基础机制import sys sys.getrefcount(5) # x a 5; b a # 上式会在等号的右边创建一个对象的引用因此 a 和 b 均指向 5 sys.getrefcount(5) # x 2 del(a); sys.getrefcount(5) # x 1类的基本形式class MyObject(object): # self 等价于 Java/C 中的 this def __init__(self, name): self.name name def memberFunc1(self, arg1): pass staticmethod def classFunc2(arg1): pass obj1 MyObject(name1) obj1.memberFunc1(a) MyObject.classFunc2(b) # 静态方法通过类名直接调用有用的交互式工具dir(variable1) # 列出对象的所有可用方法/属性七、常见字符串操作# 通过分隔符连接列表/元组 , .join([v1, v2, v3]) # v1, v2, v3 # 格式化字符串str.format位置参数 {0} 与关键字参数 {name} 混用 string1 My name is {0} {name} newString1 string1.format(Sean, nameChen) # 分裂字符串 sep - stringList1 string1.split(sep) # 获取子串切片 start 1 string1[start:8] # 补 0 向右对齐字符串zfillzero fill常用于月份、编号补零 month 5 month.zfill(2) # 05 month 12 month.zfill(2) # 12长度已足够不补零 month.zfill(3) # 012八、异常处理基本形式try: pass except ValueError as e: print(e) # 精确捕获并拿到异常对象 except (TypeError, AnotherError): pass # 元组形式一次捕获多种异常 except: pass # 兜底捕获所有异常慎用 finally: pass # 清理比如 close db;手动引发异常raise AssertionError # 断言失败 raise SystemExit # 请求程序退出 raise RuntimeError(错误信息 :..)工程提示try/except中的else子句在无异常时执行与finally无论是否异常都执行用于资源清理是完整异常处理的组成raise ... from ...可用于异常链的显式传递。速查表中给出的try/except/finally结构是日常最常用的骨架。九、列表、字典以及元组的推导表达式推导表达式是使代码更加易读易写的语法糖。列表推导用一个简练的表达式通过筛选一个数据集并且转换经过筛选的元素来简明地生成新列表。基本形式[expr for val in collection if condition]等价于result [] for val in collection: if condition: result.append(expr)可以省略过滤条件只留下表达式[expr for val in collection]。字典推导{key-expr: value-expr for value in collection if condition}集合推导和列表推导一样不过是用{}而不是[]注意原速查表中写作()系早期版本的笔误Python 中集合推导使用花括号例如{x * 2 for x in range(5)}。嵌套列表多层for依次展开[expr for val in collection for innerVal in val if condition]十、单元测试Python 自带unittest模块可供我们编写单元测试import unittest我们可以编写继承于unittest.TestCase测试类的子类并在子类中编写具体的测试函数。测试函数命名必须以test_开头否则不会被识别为测试函数进而不会在运行单元测试时被运行。import unittest class TestSubclass(unittest.TestCase): def test_func(self): self.assertEqual(0, 0) # 可以通过 msg 关键字参数提供测试失败时的提示消息 self.assertEqual(0, 0, msgmodified message) self.assertGreater(1, 0) self.assertIn(0, [0]) self.assertTrue(True) # 测试是否会抛出异常 with self.assertRaises(KeyError): _ dict()[1] # 被 unittest.skip 装饰器装饰的测试类或测试函数会被跳过 unittest.skip(reasonjust skip) def test_skip(self): raise Exception(I shall never be tested)另外unittest.TestCase中还有两个特殊的成员函数它们分别会在调用每一个测试函数的前后运行。测试前连接数据库并在测试完成后断开连接是一种常见的使用场景def setUp(self): # To do: connect to the database pass def tearDown(self): # To do: release the connection pass def test_database(self): # To do: test the database pass测试类编写完毕后可以通过添加以下代码来将当前文件当成正常的 Python 脚本使用if __name__ __main__: unittest.main()配套自测将以上代码保存为.py文件后直接运行python test_xxx.py即可看到测试运行结果setUp/tearDown会在每个测试函数前后分别执行保证测试之间相互隔离。结语如何高效使用这份速查表这份 Python 速查表覆盖了从基础类型到单元测试的完整知识闭环其姊妹 TeX 版 languages/python.tex 保留了同样内容适合本地编译阅读。在 awesome-cheatsheets 项目中它与其他语言速查表如 Bash、Go、JavaScript、PHP、Lua以及开发工具速查表Git、GDB、Tmux、ADB 等共同构成单文件速查体系。使用时建议按需查阅写脚本前复习数据类型与结构调试时回看切片与推导式写工程代码时对照异常处理与单元测试章节。将本文的代码片段在本地 Python 解释器中逐段运行验证即可把速查表转化为长期可用的个人知识库。赞分享文档【免费下载链接】awesome-cheatsheets超级速查表 - 编程语言、框架和开发工具的速查表单个文件包含一切你需要知道的东西 :zap:项目地址https://gitcode.com/gh_mirrors/awe/awesome-cheatsheets点击查看免费下载相关推荐Python 核心语法速查基于 awesome-cheatsheets 的完整语言手册Python 核心语法速查基于 awesome cheatsheets 的完整语言手册 本文以 awesome cheatsheets https://lin文档教程Go 语言实战速查手册基于 awesome-cheatsheets 仓库的完整语法、模块与并发编程指南Go 语言实战速查手册基于 awesome cheatsheets 仓库的完整语法、模块与并发编程指南 本文以开源速查表集合仓库 awesome cheats文档教程现代 JavaScript 速查手册基于 modern-js-cheatsheet 的 ES6 核心语法实战指南现代 JavaScript 速查手册基于 modern js cheatsheet 的 ES6 核心语法实战指南 本指南整理自 modern js cheat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表