Python 基础复习全笔记从变量到函数一篇把基础复习一遍适合人群已经摸过 Python、想系统回顾一遍基础的同学。 本文把我自己复习基础时写的练习代码整理成了一份笔记从变量、数据类型、运算符一路到容器和函数。所有代码都在 Python 3 环境实测通过可以直接复制运行。以下为内容部分一、变量与数据类型Python 里变量不需要提前声明类型直接赋值即可。变量名的规则是由字母、数字、下划线组成不能以数字开头。mynum 1 # 数字开头不行字母开头可以mynumer 2_number 1 # 下划线开头可以the_number 3the_name xiaoming # 用下划线分隔多个单词是推荐写法x1 5 # 数字放中间或结尾没问题Python 的常用类型可以先记这么几个a 1 # int 整数c word # str 字符串d a # 单引号、双引号都表示字符串e False # bool 布尔值f True再往下就是四种容器类型这一块是后面各个章节的基础先混个脸熟ab [1, 2, 3, 4] # 列表 list中括号bc (1, 2, 3) # 元组 tuple小括号dc {1, 2, 3, 4} # 集合 set花括号nb {name: 1, id: 2} # 字典 dict花括号 键值对print(ab, bc, dc, nb)运行结果[1, 2, 3, 4] (1, 2, 3) {1, 2, 3, 4} {name: 1, id: 2}小结中括号列表、小括号元组、花括号集合、花括号加冒号字典四种容器的括号形状先记住后面的增删改查都是围绕它们展开的。二、输入、输出与格式化输出用print()三种拼接字符串的方式都很常见a 10b 11k a b # k 21print(f我是xiaoyong今年马上{k}岁了你呢) # 推荐f-stringprint(f我是xiaoyong今年马上%d岁了你呢 % k) # 老写法% 占位符两种写法的输出是一样的我是xiaoyong今年马上21岁了你呢我是xiaoyong今年马上21岁了你呢输入用input()它的返回值永远是字符串需要数字时要自己转换b str(input(请输入你的需求))ks 请到柜台机处办理相关业务print(结果是%s % ks)print()还有一个常用的end参数用来控制末尾换不换行print(结束判断, endend) # 输出结束判断end三、转义字符反斜杠加字母表示特殊字符最常用的是\t制表符和\n换行print(五十个人\t你有八个人) # \t 相当于一个 Tabprint(我\n\t\n文化) # \n 换行print(\n\n\n\n我有文化\n, endenen)第一条输出会在中间空出一段距离第三条会先空出四行再打印内容末尾不换行直接接上enen。四、类型转换四个常用转换函数int()、float()、str()、bool()。a 15b str(a) # 15 - 15c float(b) # 15 - 15.0print(结果%s % b)print(type(b), type(c))运行结果结果15class str class float五、随机数 random 模块random是标准库直接import就能用import randoma random.randint(1, 200) # 1~200 之间的整数print(a)b random.uniform(1, 200) # 1~200 之间的小数print(b)c random.random() # 0~1 之间的小数print(c)randint(a, b)取[a, b]区间的整数两端都能取到。uniform(a, b)取[a, b]区间的小数。random()固定取[0, 1)的小数。六、运算符先说赋值和复合赋值注意赋值是一个等号判断相等是两个等号a 1b a 1c 5c 2 # 等价于 c c 2print(c) # 7c - 2print(a, b, c) # 1 2 5字符串也能做乘法* * 30常用来打印分隔线print(* * 30)常见算术运算符d 8e 7f e * d # 乘g e / d # 除结果一定是 floatk e ** 2 # 幂运算e 的平方m (d e) / ((d - e) * 15) # 括号优先级print(f, g, k, m)运行结果56 0.875 49 1.0还有一个特别常用的取余%常用来判断奇偶a 10print(a % 4) # 2七、布尔运算 and / or / notand与两边都为真才为真or或一边为真就为真not非取反a Falseb not a # 非假即真print(f{a},{b}) # False,Truec (a and (b or not a)) or aprint(c) # False这一小节看似简单但and/or的短路特性和优先级是后面写条件判断的地基建议亲手推一遍上面c的值。八、字符串操作8.1 索引与切片切片的核心规则是左闭右开也就是s[a:b]取的是下标a到b-1的内容。s my name is xiaoming# 0123456789......print(s[1:4]) # y nprint(s[1:5]) # y na几个等价写法和步长用法print(s[0:19]) # my name is xiaomingprint(s[:19]) # 省略起点默认从 0 开始print(s[0:]) # 省略终点默认取到末尾print(s[:]) # 全都要print(s[0:19:2]) # 步长为 2隔一个取一个m aei ioig步长为负数时可以实现逆序这是最经典的用法print(s[::-1]) # 完全逆序gnimoaix si eman ymprint(s[::1]) # 正着取和原串一样print(s[::-2]) # 逆着取中间隔一个gioi iea mprint(s[-19:-1]) # 负数索引倒数第一个字符取不到注意-19到0这种写法不会有全部输出的效果因为下标0属于正数区间它和负数是两个方向。记住**闭和index小于开放index1**这条规律即可。8.2 替换、分割与拼接s my name is xiaomings s.replace(xiaoming, xiaohong) # 用 xiaohong 替换 xiaomingprint(s) # my name is xiaohongarr s.split( ) # 按空格切分得到列表print(arr) # [my, name, is, xiaohong]print(-.join(arr)) # my-name-is-xiaohongprint(-.join(s)) # 把每个字符都拆开再连接print( .join(arr)) # 还原成原来的样子join()的作用是用括号里的符号把参数中的每个元素连起来参数是列表就按元素连是字符串就按字符连。8.3 大小写与空白处理print(hello world.capitalize()) # Hello world 首字母大写print(hello world.title()) # Hello World 每个单词首字母大写print(HEllo world.lower()) # hello world 全部转小写print(hello world.upper()) # HELLO WORLD 全部转大写print( hello.lstrip()) # 去掉左边空白print(hello .rstrip()) # 去掉右边空白print( hello .strip()) # 去掉两边空白九、条件判断 if / elif / else先看最简单的奇偶判断a 10b a % 2 # 取余0 就是偶数if b 0:print(是偶数)else:print(不是偶数)print(结束判断, endend)多分支用elif注意if后面的条件从上往下依次判断命中一个就不再往下走a float(input(请输入你的一个分数\n))if a 90 and a 100:print(best!)elif a 80 and a 90:print(very good!)elif a 60 and a 80:print(good!)elif a 60 and a 0:print(OK!)else:print(你的分数不合法)print( * 50)另外!表示不等于分支语句内部可以继续嵌套另一组判断b 0if b ! 0:print(no)else:print(yes)十、循环 while 与 for10.1 while 循环与 break / continuea 0while a 10:a 1print(a)if a 10:continue # 跳出本次循环继续执行下一次while a 20:a 2print(a)if a 16:break # 直接终止整个循环print(end)continue结束本次循环回到条件判断进入下一轮。break直接跳出整个循环后面的都不执行了。写法上要小心while True:而不加break就是死循环程序会一直跑下去。10.2 for 循环与 rangerange(n)生成0到n-1的数字序列for i in range(10): # 循环 10 次i 依次是 0~9print(Sorry!, end )print()print(骗你的下次还敢)range(a, b)则表示从a到b-1。用嵌套循环打印九九乘法表for i in range(1, 10):for j in range(1, i 1): # j 从 1 取到 iprint(f{i}*{j}{i*j}, end\t)print(\n)for还能直接遍历字符串、列表、元组比用下标省事string abcdefgfor i in string:print(i)a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]for j in a:print(j)10.3 for-else 这个容易忽略的语法for和while都可以接else它的含义是循环正常跑完没有被 break 打断时才执行。for i in range(11):print(i)if i 5:continue # 只是跳过本次循环仍然会跑完else:print(end) # 会执行for i in range(11):print(i)if i 5:break # 循环被中断else:print(end) # 不会执行实测结论遇到continue时else会执行遇到break时else不执行。十一、列表、元组、集合、字典11.1 索引与切片字符串、列表、元组都支持索引和切片只是返回的类型会跟着变string appprint(string[0]) # aprint(string[0:2]) # aparr [1, 2, 3, 4]print(arr[0]) # 1print(arr[0:3:1]) # [1, 2, 3]print(arr[0:3:2]) # [1, 3] 列表切片后还是列表11.2 嵌套列表二维列表可以理解成列表里装列表array [[1, 2, 3], [4, 5, 6], [7, 8, 9]]print(array[1]) # [4, 5, 6] 先取外层索引 1print(array[1][2]) # 6 再取内层索引 2想遍历所有元素嵌套几层就写几层forarray [[[1, 2, 3], [4, 5, 6], [7, 8, 9]],[[3, 2, 5], [4, 5, 8], [7, 8, 9]],[[1, 2, 3], [4, 5, 8], [7, 0, 9]]]for a in array:for b in a:for c in b:print(c) # 遍历所有元素用 numpy 处理这类数据会更直观import numpy as nparr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print(arr)[[1 2 3][4 5 6][7 8 9]]区别普通嵌套列表打印出来还是带逗号的列表形式而 numpy 数组是规整的矩阵排版做数值计算也方便得多。11.3 列表的增删改查列表里的元素类型可以很随意数字、布尔、字符串、甚至另一个列表都能塞进去b 12a [1, False, happy, fun, b, [1, 2, 3, [4, 5, 6, [7]]]]print(a)if 1 in a: # in 判断元素是否存在print(有)elif 2 not in a:print(没有)增元素和排序a.append(abc) # 末尾追加a.insert(1, tt) # 在下标 1 的位置插入a [4, 5, 3, 2, 1]a.sort() # 原地排序直接改自己a sorted(a) # 返回一个新的排好序的列表in/not in判断的是元素本身在不在容器里不是下标这点别搞混。11.4 元组把列表的中括号换成小括号就成了元组元组里的元素不可以修改但可以访问a (1, 2)print(a[0]) # 1也正因为不可修改元组上没有insert、append这类方法。老笔记里我写过n m.insert(1, 0)实际运行会直接报错AttributeError: tuple object has no attribute insert11.5 集合把中括号换成花括号就成了集合它有两个特性无序性和不重复性。s {1, 4, 2, 2}print(s) # {1, 2, 4} 重复的 2 被去掉了h {1, 4, 2}g {4, 1, 2}print(h, g) # {1, 2, 4} {1, 2, 4}因为无序输出顺序不一定和你写的顺序一致不要依赖集合的打印顺序v {1, 1000, 99}print(v) # {1000, 1, 99}print({6, 3, 4}) # {3, 4, 6}print({60, 30, 40}) # {40, 60, 30}print({600, 400, 300}) # {600, 300, 400}11.6 空容器的写法重要坑点字典和集合都是花括号所以空花括号默认是空字典空集合必须用set()a {} # 空字典不是空集合b set() # 空集合c [] # 空列表d () # 空元组11.7 字典字典是键值对结构查找、修改、删除都围绕键来做d {name: xiaoming, age: 20}print(d)print(d.keys()) # dict_keys([name, age])print(d.values()) # dict_values([xiaoming, 20])print(d.items()) # dict_items([(name, xiaoming), (age, 20)])用items()同时拿到键和值来遍历for k, v in d.items():print(k)print(v)增删改查四个动作d {name: pig, age: 20}print(d[name]) # 查找pigd[name] fog # 更改print(d) # {name: fog, age: 20}del d[age] # 删除某个键print(d) # {name: fog}d.clear() # 清空print(d) # {}注意del d和d.clear()是两回事clear()是把字典清空但变量还在del d是把变量本身删掉之后再访问d会报NameError。十二、函数12.1 为什么要用函数如果一段代码要反复用直接把它包进函数里就行。对比一下# 每次都手写重复for i in range(4):print(1); print(2); print(3); print(4); print(5)# 封装成函数def num():print(1)print(2)print(3)print(4)print(5)a Truefor i in range(4):num() # 想用几次调几次if a:num()12.2 参数与返回值函数里定义的n叫形式参数调用时传入的m、k叫实际参数def isoushu(n):if n % 2 0:return Trueelse:return Falsem 15k 16if isoushu(m):print(f{m}是偶数)else:print(f{m}不是偶数)既然返回值本身就是布尔值这个函数还能再简化成一行def isoushu(n):return n % 2 012.3 全局变量 global在函数内部要修改全局变量时必须先用global声明DAY 0 # 在函数外部定义叫全局变量def day():global DAY # 函数体中声明if DAY % 2 0:print(...)else:print(.)DAY 1 # 修改全局变量day()day()print(DAY , DAY) # DAY 212.4 带类型注解和文档字符串的写法函数参数可以标注类型函数内部第一行用三引号写文档字符串这是很规范的写法from PIL import Imagedef put_color(img: Image, x_p: int, y_p: int, long: int, color: tuple):在一个图片中的一个矩形区域里填充一个正方形纯色块:param x_p: 填充正方形的 x 位置:param y_p: 填充正方形的 y 位置:param img: 图片名路径:param long: 正方形的边长:param color: 填充颜色 如 (0, 2, 43):return: 无返回值if long 0:img.putpixel((x_p, y_p), color)for n in range(long):for m in range(long):img.putpixel((x_p n, y_p m), color)im Image.open(D:\\1.png)put_color(im, 1, 3, 10, (2, 3, 4)) # 调用时只写实际参数12.5 程序的入口if __name__ __main__一个文件里函数多了先执行谁用入口判断来指定def main():for i in range(10):a() # 执行 a 函数def a():b()c() # 执行 b 和 c别写成无限循环def b():passdef c():passif __name__ __main__:main()12.6 递归函数为了防止无限循环可以给递归一个终止条件def main():for i in range(10):a(i)def a(num):num 1if num 20:return # 到了 20 就返回不再调用自己else:a(num) # 没到就继续调用自己 —— 这就是递归if __name__ __main__:main()函数每次调用自己都会把num加 1到 20 就停下所以调用次数是有限的不会无限递归下去。12.7 多个返回值与元组拆包def g():return 1, 2b g()print(b) # (1, 2) 结果是元组a, b g() # 用两个变量分别接住两个值print(a, b) # 1 2这种用多个变量接收多个返回值的操作就叫元组的拆包。同理列表、集合、字典也都可以拆包。12.8 不定长参数 *args 与 **kwargs不知道函数会收到几个参数时用不定长参数def a(*args): # 一个星号包裹位置参数for i in args:print(i)a(1, 2, 3, 6, 9) # 爱传几个传几个不定长参数前面还可以加普通参数def a(n, *args):print(n)for i in args:print(i)a(1, 2, 3, 6, 9) # n1剩下的都进 args带默认参数的写法。注意默认参数写在不定长参数前面def a(n, age18, *args):if age 18:print(n)for i in args:print(i)else:print(no!)a(1, 196, 2, 3, 6, 9) # age 被传入的 196 覆盖2 3 6 9 才是不定长部分两种不定长参数的区别*args一个星号包裹位置参数里面可以只写一个值**kwargs两个星号包裹关键字参数里面必须带参数名。def a(n, age18, *args, **kwargs):if age 18:print(n)for i in args:print(i)else:print(no!)print(kwargs[ns])print(kwargs[nt])a(1, 196, 2, 3, 6, 9, ns15, nt16)运行结果12 3 6 91516十三、常见易错点汇总整理笔记的时候我把几个自己踩过的坑单独列出来复习的时候重点看这几条易错点说明{}是空字典空集合必须写set()别想当然元组不可修改元组没有insert/append调用会报AttributeErrordel与clear()clear()清空内容del删除变量删完再访问会NameError切片左闭右开s[1:4]取的是 1、2、3不含 4sort()与sorted()前者原地修改后者返回新列表集合无序打印顺序不一定等同书写顺序别依赖它/的结果是 float即使能整除8 / 4也是2.0%d与 f-string用 f-string 时不需要再套%两种写法别混着用01这种写法非法Python 3 不允许十进制整数带前导零会直接语法报错input()返回字符串要参与计算必须先int()或float()在最后这份笔记覆盖的都是 Python 基础里最核心的部分变量与类型 → 输入输出 → 运算符 → 流程控制 → 字符串 → 四种容器 → 函数。把它当成一张知识地图哪个点想不起来就翻回去照着代码敲一遍比单纯看要有效得多。代码不难难的是把每一处的细节记牢。如果这篇笔记帮你省下了一点翻资料的时间欢迎点赞收藏有问题也欢迎在评论区交流。