
简介这是一份面向Python初学者与具备一定编程基础人群的语法入门资料以68页PDF形式系统梳理Python基础语法帮助读者快速建立语法框架为后续数据分析、Web开发或自动化任务等方向打下根基。资源包共1个文件为1.42MB的PDF文档内容涵盖变量与数据类型、运算符、流程控制、函数、模块等核心主题并配有解释与示例代码。文档从解释型语言特性、标识符命名规则讲起延伸到保留字符、缩进与多行语句写法、换行与不换行输出再深入数字、字符串、列表、元组、字典等数据类型及类型转换函数同时整理数学函数与随机数函数等常用工具。目前已有2045人学习下载适合作为入门速查与知识点巩固的参考读者可借助示例代码边学边练加深对语法细节的理解与掌握。1. 68 页 Python 基础语法合集一份能当“字典”翻的速查手册很多人学 Python 卡住不是因为语法难而是因为知识点散落在几十篇教程里查一个yield要翻三篇文章查一个*args和**kwargs的区别又要重新搜一遍。一份 68 页的 Python 基础语法合集本质上解决的就是这个问题把变量、数据类型、流程控制、函数、类、异常、文件操作、常用内置模块这些高频语法点压缩成一份可以随时翻、随时查、随时对照代码验证的速查文档。它适合两类人一类是刚入门、需要一份系统目录来建立知识框架的新手另一类是写了半年到一年、语法全靠搜索引擎拼凑、想补全盲区的半熟手。我见过太多人把这类合集当成“读完就会”的教材结果翻完一遍什么都没记住——问题不在合集本身而在使用方式。这份 68 页的东西正确用法是当字典不是当小说。2. 把 68 页拆成可执行的语法地图先建索引再填细节2.1 为什么按“数据类型 → 控制流 → 函数 → 类 → 异常 → 文件与模块”排序一份基础语法合集如果按字母顺序排查起来方便但学起来痛苦如果按难度排又容易在早期堆太多概念。我一般建议按“数据怎么存 → 逻辑怎么走 → 代码怎么复用 → 对象怎么组织 → 错误怎么兜住 → 数据怎么进出”这条线来排。这条线对应 Python 的实际执行路径你先有数据int、str、list、dict、set、tuple然后有判断和循环if、for、while然后把重复逻辑收进函数def、lambda、*args、**kwargs再把相关函数和数据打包成类class、继承、魔术方法接着处理运行时错误try/except/finally、自定义异常最后让数据在文件和模块之间流动open、with、import、name。这个顺序的好处是每学一个点前面都有落点。比如学到with open()时你已经知道文件对象是什么、异常怎么处理不会出现“这句话为什么这么写”的断层。68 页的体量如果按这个结构分大概可以切成 6 个区块每个区块 10 页左右剩下的 8 页留给附录常用内置函数表、字符串方法表、列表方法表、字典方法表、格式化输出对照表。这个附录部分才是这份合集最值钱的地方因为它是你写代码时真正会反复翻的。2.2 用一段代码把“索引页”跑出来自动生成语法点目录与其手动翻 68 页找某个语法点不如先写一个脚本把合集里的标题层级抽出来生成一份可搜索的索引。下面这段代码假设你把 PDF 转成了 Markdown 或纯文本按行读取提取以#或数字编号开头的行输出成带行号的目录。# 从纯文本版语法合集中提取标题行生成可搜索索引 import re def build_index(file_path): index [] # 匹配 Markdown 标题# 开头或数字编号标题如 1.2、3.4.1 pattern re.compile(r^(#{1,4}\s.|\d(\.\d)*\s.)$) with open(file_path, r, encodingutf-8) as f: for line_no, line in enumerate(f, start1): stripped line.strip() if pattern.match(stripped): index.append((line_no, stripped)) return index def print_index(index): for line_no, title in index: # 去掉 Markdown 的 # 符号只留文字 clean title.lstrip(#).strip() print(f{line_no:5} | {clean}) if __name__ __main__: idx build_index(python_basic_68p.txt) print_index(idx)这段代码的逻辑很直接逐行扫描用正则判断这一行是不是标题。^(#{1,4}\s.|\d(\.\d)*\s.)$里#{1,4}匹配 1 到 4 个#\d(\.\d)*匹配1、1.2、3.4.1这类编号。enumerate(f, start1)让行号从 1 开始方便你直接跳到原文对应位置。参数上唯一需要改的是file_path换成你实际转换出来的文本文件名。如果你拿到的 PDF 不能直接转文本常见做法是先用pdfplumber或PyPDF2抽文字再喂给这个脚本。注意有些 PDF 里的标题是图片或特殊字体抽出来可能带乱码这时候索引会漏掉几行手动补一下就行不影响整体使用。2.3 每个语法点配一个“最小可运行示例”而不是只写定义68 页里如果全是list.append(x)这种定义式写法翻完就忘。我一般会要求每个语法点至少配一个 3 到 5 行的可运行示例并且示例里要包含输入和输出。比如讲*args和**kwargs不要只写“用于接收可变参数”而是直接给# *args 接收位置参数打包成 tuple def sum_all(*args): return sum(args) print(sum_all(1, 2, 3)) # 输出 6 print(sum_all(10, 20)) # 输出 30 # **kwargs 接收关键字参数打包成 dict def show_info(**kwargs): for key, value in kwargs.items(): print(f{key}: {value}) show_info(nameA同学, age20) # 输出 # name: A同学 # age: 20这段代码里*args把传入的多个位置参数收成一个元组(1, 2, 3)所以sum(args)能直接算。**kwargs把关键字参数收成字典{name: A同学, age: 20}用.items()遍历。参数说明args和kwargs只是约定俗成的名字你写成*nums和**info也完全合法但为了可读性建议保持惯例。常见误用是def f(*args, **kwargs)里又手动去改args但元组不可变改不了只能重新构造。这个点如果只看定义很容易在真实代码里翻车。3. 用 68 页里的高频语法点搭一个可复现的练习环境3.1 本地跑通最小验证从 venv 到第一个脚本拿到一份语法合集最怕的是“看懂了但写不出来”。我的做法是先建一个干净的虚拟环境然后按合集目录每学一个区块就写一个对应的.py文件文件里只放这个区块的示例代码跑通再往下走。这样 68 页会被拆成 6 到 8 个可执行文件每个文件都能独立运行出错也知道是哪个区块的问题。# 创建项目目录并进入 mkdir python_basic_practice cd python_basic_practice # 创建虚拟环境Python 3.8 自带 venv python3 -m venv venv # 激活虚拟环境Linux/macOS source venv/bin/activate # 激活虚拟环境Windows # venv\Scripts\activate # 验证 Python 版本 python --version # 创建第一个练习文件 touch 01_data_types.py这段命令里python3 -m venv venv创建了一个隔离环境避免你系统里的包和练习用的包互相污染。source venv/bin/activate是 Linux/macOS 的激活方式Windows 用venv\Scripts\activate。激活后命令行前面会出现(venv)标记说明你在这个环境里。python --version用来确认版本因为有些语法比如 f-string 的调试写法在 3.8 以下不支持。参数上唯一要注意的是如果你的系统同时有 Python 2 和 3一定要用python3而不是python否则虚拟环境可能建在旧版本上。3.2 数据类型区块用 20 行代码覆盖 list、dict、set、tuple 的增删改查合集里数据类型部分通常占 10 到 15 页但核心操作就那些。我一般会写一个01_data_types.py把四种容器的常用方法各跑一遍跑完你就知道哪个用[]、哪个用{}、哪个用()。# 列表有序、可变、允许重复 fruits [apple, banana, cherry] fruits.append(date) # 尾部添加 fruits.insert(1, blueberry) # 指定位置插入 fruits.remove(banana) # 按值删除 print(fruits) # [apple, blueberry, cherry, date] # 字典键值对、键唯一 student {name: A同学, age: 20} student[score] 95 # 新增键值对 student.update({age: 21}) # 更新 print(student.get(name)) # A同学 print(student.get(gender, 未知)) # 未知get 可设默认值 # 集合无序、不重复 nums {1, 2, 3, 3, 2} print(nums) # {1, 2, 3} nums.add(4) nums.discard(1) # 删除不存在也不报错 print(nums) # {2, 3, 4} # 元组有序、不可变 point (3, 5) x, y point # 解包 print(fx{x}, y{y}) # x3, y5这段代码里append和insert的区别是append永远加在末尾insert(1, blueberry)加在索引 1 的位置原来的元素后移。remove按值删如果值不存在会抛ValueError所以生产代码里通常先if banana in fruits再删。字典的get方法比student[gender]安全因为后者在键不存在时会直接KeyError。集合的discard和remove区别是discard删不存在的元素不报错remove会报KeyError。元组解包x, y point要求两边元素个数一致否则报ValueError。这些细节在 68 页里可能只占几行但实际写代码时天天遇到。3.3 控制流与函数区块把 if/for/while 和 def 串起来跑控制流和函数是语法合集里最容易“看会写废”的部分。我建议用一个实际小任务来串比如统计一段文本里每个单词出现的次数按次数从高到低输出。这个任务会用到for、if、字典、函数定义、sorted和lambda。def word_count(text): # 统一转小写按空格切分 words text.lower().split() counter {} for word in words: # 去掉标点 word word.strip(.,!?;:) if not word: continue counter[word] counter.get(word, 0) 1 return counter def top_n(counter, n3): # 按值降序排序取前 n 个 sorted_items sorted(counter.items(), keylambda x: x[1], reverseTrue) return sorted_items[:n] text Python is great. Python is easy. Learning Python is fun. result word_count(text) print(result) # {python: 3, is: 3, great: 1, easy: 1, learning: 1, fun: 1} print(top_n(result, 2)) # [(python, 3), (is, 3)]word_count里counter.get(word, 0) 1是统计词频的经典写法如果单词不在字典里返回默认值 0加 1 后存进去如果已经在取当前值加 1。strip(.,!?;:)去掉单词两端的标点但注意它不会去掉中间的标点所以dont会变成dont整体。top_n里sorted(counter.items(), keylambda x: x[1], reverseTrue)是按字典的值排序x[1]表示取元组的第二个元素即次数reverseTrue表示降序。[:n]是切片取前 n 个。参数上n3是默认参数调用时不传就用 3。这个例子跑通控制流和函数的核心用法基本就覆盖了。4. 避坑与排查68 页合集里最容易翻车的 5 个语法点4.1 可变默认参数def f(lst[])为什么每次调用都“记住”了上次的结果现象定义一个函数def add_item(item, lst[])第一次调用add_item(1)返回[1]第二次调用add_item(2)返回[1, 2]而不是预期的[2]。原因Python 的默认参数在函数定义时只计算一次lst[]这个空列表被创建后一直复用所有调用共享同一个列表对象。解决默认值用None在函数体内判断并初始化。# 错误写法 def add_item_bad(item, lst[]): lst.append(item) return lst print(add_item_bad(1)) # [1] print(add_item_bad(2)) # [1, 2] 翻车 # 正确写法 def add_item_good(item, lstNone): if lst is None: lst [] lst.append(item) return lst print(add_item_good(1)) # [1] print(add_item_good(2)) # [2]4.2 浅拷贝与深拷贝改嵌套列表时为什么原数据也变了现象a [[1, 2], [3, 4]]b a.copy()修改b[0][0] 99结果a也变成了[[99, 2], [3, 4]]。原因copy()是浅拷贝只复制外层列表内层列表还是同一个对象。解决用copy.deepcopy()做深拷贝或者手动逐层复制。import copy a [[1, 2], [3, 4]] b a.copy() b[0][0] 99 print(a) # [[99, 2], [3, 4]] 原数据被改 c copy.deepcopy(a) c[0][0] 100 print(a) # [[99, 2], [3, 4]] 不受影响4.3 循环里删除列表元素为什么漏掉了一半现象lst [1, 2, 3, 4, 5]用for i in lst: if i % 2 0: lst.remove(i)结果lst变成[1, 3, 5]但预期是[1, 3, 5]看起来对实际中间漏掉了元素。原因遍历时删除元素会导致索引错位后面的元素前移但迭代器继续按原索引走。解决用列表推导式生成新列表或者倒序遍历删除。# 错误写法 lst [1, 2, 3, 4, 5] for i in lst: if i % 2 0: lst.remove(i) print(lst) # [1, 3, 5] 看似对但数据量大时漏删 # 正确写法列表推导式 lst [1, 2, 3, 4, 5] lst [i for i in lst if i % 2 ! 0] print(lst) # [1, 3, 5] # 或者倒序删除 lst [1, 2, 3, 4, 5] for i in range(len(lst) - 1, -1, -1): if lst[i] % 2 0: del lst[i] print(lst) # [1, 3, 5]4.4 字符串拼接在循环里为什么越跑越慢现象循环里用s s str(i)拼接一万次耗时明显比预期长。原因字符串不可变每次都创建新字符串并复制旧内容时间复杂度是 O(n²)。解决用.join(list)或者io.StringIO。# 慢写法 s for i in range(10000): s str(i) # 快写法 parts [] for i in range(10000): parts.append(str(i)) s .join(parts)4.5 异常捕获except Exception为什么把 KeyboardInterrupt 也吞了现象写了一个try: ... except Exception: pass结果按 CtrlC 中断不了程序。原因KeyboardInterrupt继承自BaseException不是Exception但有些环境里except Exception会捕获到它取决于具体异常链。更常见的问题是except Exception把SystemExit之外的几乎所有错误都吞了导致调试时看不到真实报错。解决尽量捕获具体异常比如except ValueError、except KeyError实在要兜底用except Exception as e: print(e)并记录日志。# 不推荐吞掉所有异常 try: result 1 / 0 except Exception: pass # 你永远不知道发生了什么 # 推荐捕获具体异常并输出 try: result 1 / 0 except ZeroDivisionError as e: print(f除零错误: {e})5. 把 68 页用成“活文档”三个让语法合集真正落地的技巧5.1 给每个语法点加一个“我踩过的坑”备注68 页的合集是别人整理的但你的坑是你自己的。我习惯在每学一个语法点后在旁边用注释写一行“我在这里翻过车……”。比如学到dict.get时备注“曾经用d[key]导致 KeyError 线上报错”学到with open时备注“忘记加encodingutf-8导致中文乱码”。这些备注不用长一行就够但下次翻到这一页时你会立刻想起当时的场景记忆强度比单纯看定义高得多。具体做法把 PDF 转成 Markdown 后在每个###小节下面加一个 踩坑引用块写你自己的经历。这样 68 页会慢慢变成你的个人避坑手册。5.2 用 pytest 把示例代码变成可回归的测试合集里的示例代码如果只是复制粘贴跑一遍过两周就忘了。更好的做法是把每个示例改成一个测试函数用pytest跑。这样你每次改代码都能确认这些基础语法点没有因为环境变化而失效。# test_basic_syntax.py import pytest def test_args_kwargs(): def sum_all(*args): return sum(args) assert sum_all(1, 2, 3) 6 assert sum_all() 0 def test_dict_get(): d {a: 1} assert d.get(a) 1 assert d.get(b, 0) 0 def test_deepcopy(): import copy a [[1, 2], [3, 4]] b copy.deepcopy(a) b[0][0] 99 assert a[0][0] 1 # 原数据不变 def test_string_join(): parts [str(i) for i in range(5)] assert .join(parts) 01234运行pytest test_basic_syntax.py -v每个测试函数对应一个语法点。参数上-v显示详细结果-k可以按名字筛选比如pytest -k dict只跑字典相关的测试。这样你每次升级 Python 版本或者换电脑跑一遍测试就知道哪些语法行为变了。我一般会把这份测试文件放在项目根目录和 68 页合集放在一起形成“文档 验证”的闭环。5.3 用python -m pydoc和help()补全合集没写到的细节68 页再全也不可能覆盖所有内置函数和标准库。遇到合集里没写的我一般直接开终端用python -m pydoc查或者在交互式环境里help()。比如查str.format的所有用法python -m pydoc str.format或者在 Python 交互环境里help(str.format)这会输出完整的签名、参数说明和示例。比翻合集快而且永远和当前 Python 版本一致。我习惯把pydoc的输出重定向到文件比如python -m pydoc str str_doc.txt然后和 68 页合集放在同一个目录形成“静态合集 动态文档”的组合。参数上pydoc支持模块名、函数名、类名比如python -m pydoc list.append也能查。注意有些第三方库的文档不在pydoc里需要单独查官方文档但标准库和内置类型基本都能覆盖。最后说一个我自己的习惯这份 68 页的合集我从来不会从头读到尾。我一般是先翻附录的方法表遇到不熟的语法点再跳到对应章节看示例然后把示例改成自己的测试用例跑一遍。跑通了就在那一页折个角跑不通就把报错和解决过程写在旁边。半年下来这本合集被我折得乱七八糟但每个折角都是我真正掌握了的点。希望帮到你。本文还有配套的精品资源点击获取