目录Python基础5Python中条件语句块Python基础6Python中循环语句块Python基础7Python中的函数Python基础8深入了解Python函数Python基础9了解Python中的数据容器Python基础10了解列表的增删改查操作Python基础11列表注意事项及切片的使用Python基础12元组Python基础13set集合Python基础14字典dictPython基础15数据容器特性总结与通用排序sorted的介绍数据容器特点对比表补充说明对应表格核心差异Python基础16JSON的使用Python基础17文件相关操作与with语句块Python基础18面向对象之构造与析构Python基础5Python中条件语句块# 1. 布尔逻辑 not / and / or 基础 # ok True # ok False # if语句块 ok 5 3 # 在python中not关键字为取反 # 在python中or为C/C中的||运算符and 就是运算符。 if not ok: print(53是错误的) # 2. 多独立if 分数判断 score int(input(请输入一个分数\n)) if score 90: print(成绩优秀) if 90 score 60: print(成绩一般) if score 60: print(成绩不合格) # 3. if-elif-else 互斥多分支 # if ... else.... if ... elif... ... else... like input(校花喜欢你吗\n) if like 是: print(去表白) elif like 一般: print(约她看场电影) else: print(努力学习赚大钱买大房) # 4. match-case 匹配分支Python3.10新特性等价C switch-case number int(input(请输入你的班级号\n)) match number: case 1: print(您好一班的同学) case 2: print(您好二班) case 3: print(你好三班) case 4 | 5: print(您好三班或四班的同学) # 以下的语句相当于switch case中的最后的一个条件即default: # 这个条件放在match case中的最后。 case _: print(你好其它班的同学)# 导入随机数模块 import random # 生成0~10之间的随机整数包含0和10 number random.randint(0,10) # 获取用户输入并转为整型 confirm int(input(请输出一个数字来猜大小)) # 判断猜数字结果 if confirm number: print(你猜中了) elif confirm number: print(你猜小了) else: print(你猜大了)Python基础6Python中循环语句块# while for while 条件表达式: 条件满足时则执行的内容 import time # 基础有限while循环注释示例 # i 0 # while i 10: # i 1 # print(i) # time.sleep(1) # 在循环语句块中常用两个关键字break, continue # break: 退出当下的循环体 # continue: 跳过当下循环体中的本次循环继续执行下一次循环。 # 带break、continue的死循环控制示例 i 0 while True: i 1 if i 10: break if i 5: continue print(i) time.sleep(1)# 与C/C中一样while循环也是可以嵌套使用的 import time i 0 # 外层循环嵌套内层循环 while i 3: i 1 time.sleep(1) print(你好) j 0 while j 3: print(gaowanxi , end ) j 1 print()Python基础7Python中的函数 python中的函数内置函数: print,len,range,int(),float(),str(),input... python中也提供了自定义的函数的形式: def 函数名 (形参列表) -返回值类型进行说明: 函数体如果这个函数体有返回值的话那么就使用return进行返回。 return 返回值 # 1. 无参无返回函数 def show(): print(helloworld) # 调用函数 show() # 注释两参数加法函数 # def add(a,b): # return a b # python中同名函数是没有重载概念 # 覆盖上面的add仅三参数加法生效 def add(a, b, c): return a b c # None 空值等价C NULL / C nullptr c None d None # 带文档注释的减法函数 # 添加函数注释: def sub(a, b): :param a: 第一个参数 :param b: 第二个参数 :return: 任意类型的返回值 return a - b # 调用加法、减法函数 print(add(1, 2, 3)) sub(10, 20) # 全局变量与global关键字 x 100 def showInfo(): # global 声明使用全局变量x global x x 200 print(x) # 调用全局变量函数 showInfo() # 打印修改后的全局x print(x)7.2# 1. 多返回值函数 def f_test(x, y): return x, y # 2. 多分支return不同类型返回值 def test1(x): if x 1: return gaowanxi if x 2: return 123 # 打印多返回值的类型 print(type(f_test(1, 2))) # 3. 默认参数函数 def add(a20, b10): return a b # 在python中函数参数的默认值从右往左依次赋值不可以跳跃。 print(add(40)) # 4. 可变位置参数 *args # python中的可变参数 # *args代表一个可变参数类型个数可变 def show(*args): print(args) show(10, 3.14, gaowanxi) # 5. 可变关键字参数 **kwargs def show1(**kwargs): # kwargskkey,wword整体是字典key为传入参数名value为实参值 print(kwargs[name], kwargs[age], kwargs[score]) # 关键字传参顺序可随意调换 show1(namegaowanxi, age35, score98) # python中函数传参时默认是一一对应 show1(age35, score98, namegaowanxi) # 6. lambda匿名函数 # python中的匿名函数 Lambda表达式 func lambda x, y: x y print(func(1, 2))Python基础8深入了解Python函数# 1. 普通双参函数 def add(a,b): return a b print(add(1,2)) # 2. 带默认参数函数 def add1(a1,b2): return a b print(add1()) # 3. lambda匿名函数 func lambda x,y:x y print(func(1,2)) # 4. *args可变位置参数求和 def add2(*args): # *args 就是一个元组对象 my_sum 0 for i in args: my_sum my_sum i return my_sum print(add2(1,2,3,4,5,6,7,8,9,10)) # 5. **kwargs可变关键字参数 def showInfo(**kwargs): # 关键词的key与value的字典 print(kwargs[name], kwargs[age], kwargs[score]) showInfo(namegaowanxi, age35, score98) showInfo(score98, namegaowanxi, age35) # python一切皆对象变量、函数、类型全是对象 print(type(add))Python基础9了解Python中的数据容器 在python中常用的数据容器list列表tuple元组set集合dict字典string字符串 1. 以上这些数据容器都是可迭代的类型内部有__iterator__方法也就是可以类似于C中迭代器 可以使用枚举for循环在python中就是可以使用python中的for循环进行遍历。 2. list列表tuple元组是一种顺序连续的序列支持下标操作所以也支持切片。 set集合dict字典是一种非连续性的可迭代序列所以是不支持切片。 list数据容器是类似于Cvector容器的一种顺序表结构的容器并非是C中那种list双向循环链表。 list数据容器是类似于Cvector容器的一种顺序表结构的容器并非是C中那种list双向循环链表。 # 创建空列表两种写法等价 list1 list() # list1 [] # list1.append(1) print(list1.__sizeof__()) list1.append(1) print(list1.__sizeof__()) # 循环1~99依次添加到列表 for i in range(1, 100): list1.append(i) # 打印有效元素数量、底层数组容量 print(list1中的有效元素的个数: %d, 容器大小: %d%(len(list1), (list1.__sizeof__()-40)//8))Python基础10了解列表的增删改查操作print(--------------------------------------------------) list2 list([gaowanxi, 35, 99.99, 3.14, 5.12]) for i in list2: print(i) list3 [gaowanxi, 35, 99.99, 3.14, 5.12] for i in list3: print(i) print(------------------------CRUD------------------------) # 列表增加元素的操作 # append尾部追加时间复杂度是O(1) list2.append(lisi) for i in list2: print(i, end ) print() # 指定位置插入操作insert(下标要插入元素的值)时间复杂度是O(n) list2.insert(3, Wangwu) for i in list2: print(i, end ) print() # 删除列表中的元素的方式remove(_value) 时间复杂度O(n) list2.remove(Wangwu) for i in list2: print(i, end ) print() list2.remove(list2[2]) for i in list2: print(i, end ) print() # 尾部删除pop()方法 list2.pop() for i in list2: print(i, end ) print() # 使用pop(index下标) 的方式指定删除 list2.pop(0) for i in list2: print(i, end ) print() # 改操作直接通过下标的方式去改 list2[0] 88 for i in list2: print(i, end ) print() # 查操作下标访问可以直接使用下标来访问 print(list2[0]) # index(_value)获取在列表中的下标位置 # 类似于C的泛型算法中的find方法 print(list2.index(3.14)) # list列表中反转操作 list2.reverse() for i in list2: print(i, end ) print() # 统计列表中某个元素的值在列表所出现的次数 list2.append(88) count list2.count(88) print(count) # list列表也提供了排序的方法sort def compair(a): return a -10 list3 [gaowanxi, lisi, Wangwu] list3.sort(keylen) for i in list3: print(i, end ) print() list2.sort(keycompair) for i in list2: print(i, end ) print() # 获取列表中的最大值的方法 number_list [5, 2, 3, 8] Max number_list[0] for i in number_list: if Max i: Max i print(Max)Python基础11列表注意事项及切片的使用# 获取列表中最大值的方法是一个内置方式max number_list [5, 2, 3, 8] Max max(number_list) print(Max) # 在python如果我们想按条件删除列表的元素时一个注意事项当删除之后会涉及到元素的移动的问题 my_list [5, 8, 9, 4, 11, 15, 30, 31] # 【错误写法】正向for in遍历同时删除元素会漏删 for i in my_list: if i 10: my_list.remove(i) print(my_list) # 重新初始化演示正确方案 my_list [5, 8, 9, 4, 11, 15, 30, 31] # 第一方式使用while循环 i 0 while i len(my_list): if my_list[i] 10: my_list.remove(my_list[i]) else: i 1 print(my_list) # 重新初始化 my_list [5, 8, 9, 4, 11, 15, 30, 31] # 第二种方式使用反向迭代for循环 for i in range(len(my_list)-1, -1, -1): if my_list[i] 10: my_list.pop(i) print(my_list) # ----------------列表切片---------------- # 列表中的切片的概念 # 把列表中数据按照一个规则生成一个新的子列表就是切片。 # 切片只能用于支持下标操作的连续性的数据容器list、tuple、str。 # 切片语法形式 [起始下标:结束下标:步长] my_list [0,1,2,3,4,5] sub_list my_list[1:3:1] print(sub_list) myname gaowanxi sub_name myname[3:None:1] sub_name1 myname[3::1] sub_name2 myname[::3] sub_name3 myname[::-1] sub_name4 myname[:2:-1] sub_name5 myname[3::-1] sub_name6 myname[3::] print(原字符串, myname) print(sub_name , sub_name) print(sub_name1 , sub_name1) print(sub_name2 , sub_name2) print(sub_name3 , sub_name3) print(sub_name4 , sub_name4) print(sub_name5 , sub_name5) print(sub_name6 , sub_name6) # myname[0] l # 报错字符串str是不可变序列不支持下标修改 # 下节课讲元组Python基础12元组# 元组不可修改的列表就是元组 t tuple() t1 () print(type(t)) print(type(t1)) # 构建有元素的元组 t tuple([gaowanxi, lisi, 35, 28]) print(t) t1 (gaowanxi, lisi, 35, 28) print(t1) # 可以省略括号直接逗号构成元组 t2 gaowanxi, lisi, 35, 28 print(t2) def getvalu(x, y): return x, y # return多个值自动打包成元组 t3 getvalu(gaowanxi, lisi) print(t3) # 元组是连续序列元素不可修改 print(------------------------------------------------) for i in t2: print(i, end ) print()Python基础13set集合# set集合的构建方式 s1 set() print(type(s1)) # 有元素的无序、元素不可重复集合 s2 set([gaowanxi, lisi, Wangwu]) print(type(s2)) s3 {gaowanxi, lisi, wangwu, 88, 99, 33} print(type(s3)) # 遍历集合s3 for i in s3: print(i, end ) print() s4 set({gaowanxi, wangwu, malu}) print(type(s4)) for i in s4: print(i, end ) print() # 交集 s5 s3 s4 print(交集, s5) # 1. 增操作 add重复元素添加无效 s4.add(tianqi) print(add后, s4) # 2. 删除操作 remove(元素)元素不存在会报错 s4.remove(malu) print(remove后, s4) # pop() 随机删除一个元素 s4.pop() print(pop随机删除后, s4) # 并集 | s6 s4 | s3 print(并集, s6)Python基础14字典dict# 创建空字典的方式 d1 dict() d2 {} print(type(d1)) print(type(d2)) # 创建有元素字典方式1嵌套可迭代对象 d3 dict([(name, gaowanxi), (age, 35), (score, 98)]) print(type(d3)) print(d3) # 创建方式2关键字传参 d4 dict(namegaowanxi, age35, score98) print(type(d4)) print(d4) # 创建方式3dict包裹字典 d5 dict({1:name, 2:age, 3:score}) print(type(d5)) print(d5) # 创建方式4字面量{}最常用 d6 {name:gaowanxi, age:35, score:98} print(type(d6)) print(d6) d7 {1:name, 2:age, 3:score} print(type(d7)) print(d7) print(------------------------------------------------------) # 通过key取值 print(d6[name]) # 获取所有key转为列表 key_list list(d6) print(key_list) # 获取键值对数量 print(len(d6)) # 修改valuekey存在则修改不存在则新增 d6[name] lisi print(d6) # 判断key是否存在只检查key不检查value print(name in d6) print(-----------------------) # get取值推荐key不存在不会崩溃 print(d6.get(name)) print(d6.keys()) # pop根据key删除指定键值对 d6.pop(score) print(d6) # popitem()Python3.7删除最后插入的键值对 print(d6.popitem()) print(d6) # update用另一个字典合并更新同名key会覆盖 d6.update(d7) print(d6) # values() 获取所有value视图 view_map d6.values() print(view_map)Python基础15数据容器特性总结与通用排序sorted的介绍数据容器特点对比表表格对比维度列表元组字符串集合字典元素数量支持多个支持多个支持多个支持多个支持多个元素类型任意任意仅字符任意Key: ValueKey: 除字典外任意类型Value: 任意类型下标索引支持支持支持不支持不支持重复元素支持支持支持不支持不支持可修改性支持不支持不支持支持支持数据有序是是是否否使用场景可修改、可重复的一批数据记录场景不可修改、可重复的一批数据记录场景一串字符的记录场景不可重复的数据记录场景以 Key 检索 Value 的数据记录场景补充说明对应表格核心差异有序 / 无序列表、元组、字符串是有序序列支持下标和切片集合、字典是无序哈希表不支持下标访问。可修改性列表、集合、字典是可变容器支持增删改元组、字符串是不可变容器创建后无法修改内部元素。重复元素列表、元组、字符串允许重复元素集合、字典的键Key不允许重复。元素类型字符串仅能存放字符字典是键值对结构键必须可哈希值无限制。# sorted通用排序sorted(可迭代对象) # 可迭代对象内置类型string, list, tuple, set, dict # 1. 字符串排序 str1 dfeacbjklnmoqpzrtyuivcx # 正向排序返回排序后的字符列表 str_list sorted(str1) print(字符串正向排序结果, str_list) # 反向排序 reverse_str_list sorted(str1, reverseTrue) print(字符串反向排序结果, reverse_str_list) print(------------------------------------------------------) # 2. 列表排序 list_l [9, 3, 4, 2, 1, 5, 7, 6, 8] l1 sorted(list_l) print(列表正向排序结果, l1) print(------------------------------------------------------) # 3. 元组排序 t1 9, 3, 4, 2, 1, 5, 7, 6, 8 list_t sorted(t1) print(元组排序结果, list_t) print(------------------------------------------------------) # 4. 集合排序 set_list {9, 3, 4, 2, 1, 5, 7, 6, 8} list_set sorted(set_list) print(集合排序结果, list_set) print(------------------------------------------------------) # 5. 字典排序 d1 {1001: gaowanxi, 1005: lisi, 1003: zhangsan, 1004: malu} # 字典sorted默认按key排序返回排序后的key列表 d_list sorted(d1) print(字典按键排序结果, d_list) # 按value排序的写法 d_list_value sorted(d1.items(), keylambda x: x[1]) print(字典按value排序结果, d_list_value)Python基础16JSON的使用# JSON序列化基础概念 # 序列化把数据容器对象转为字符串用于文件保存/网络传输 # 反序列化把JSON字符串/文件数据还原成Python容器对象 # JSON支持序列化列表list、元组tuple、字典dictset集合不支持 # json包4个核心API # dumps() 对象 → JSON字符串 loads() JSON字符串 → 对象 # dump() 对象 → 文件流 load() 文件流 → 对象 # 口诀带s的操作【字符串】不带s的操作【文件】 # import 相当于C/C #include 头文件 import json # -------------------- 1. list列表 序列化与反序列化 -------------------- list_1 [5, 3, 4, 5, 2, 5, 23, 3] str_list json.dumps(list_1) print(str_list) print(type(str_list)) list_2 json.loads(str_list) print(list_2) print(type(list_2)) print(------------------------------------------------------) # -------------------- 2. tuple元组 序列化与反序列化 -------------------- tuple_1 (5, 3, 4, 5, 2, 5, 23, 3) str_tuple json.dumps(tuple_1) print(str_tuple) print(type(str_tuple)) # ⚠️重点元组序列化后loads还原得到的是list不再是tuple tuple_2 json.loads(str_tuple) print(tuple_2) print(type(tuple_2)) print(------------------------------------------------------) # -------------------- 3. dict字典 序列化与反序列化 -------------------- # ensure_asciiFalse 解决中文被转义问题 d1 {姓名: gaowanxi, 年龄: 35} str_d1 json.dumps(d1, ensure_asciiFalse) print(str_d1) print(type(str_d1)) d2 json.loads(str_d1) print(d2) print(type(d2)) print(----------------以下为文件相关的json操作----------------) # -------------------- 4. dump / load 文件读写JSON -------------------- # 1序列化将容器对象写入json文件 d3 [{姓名: gaowanxi, 年龄: 35}, {姓名: lisi, 年龄: 28}, {姓名: Wangwu, 年龄: 22}] f open(./data.json, w, encodingutf-8) json.dump(d3, f, ensure_asciiFalse) f.close() # 2反序列化读取json文件还原成容器对象 f1 open(./data.json, r, encodingutf-8) d4 json.load(f1) f1.close() print(d4) print(type(d4))Python基础17文件相关操作与with语句块# 文件打开模式说明 # r 只读模式w 只写模式r 读写模式 # 如果操作二进制文件模式后面加上字母 brb / wb / ab # 打开文本文件读写模式 r指定编码utf-8 f open(./mytext.txt, r, encodingutf-8) print(type(f)) # write() 写入多行文本 f.write(姓名:高万喜年龄35\n 姓名:李四年龄28\n 姓名:王五年龄22\n) # 文件光标操作 seek(offset, whence) # whence标记位0 文件开头1 当前位置2 文件末尾 # ⚠️文本模式下仅支持 whence0 f.seek(0) # ---------------------- 文件读取方式 ---------------------- # 方式1read(-1) 一次性读取全部内容 # str_text f.read(-1) # print(str_text) # 方式2readline() 只读取一行 text_line f.readline() print(text_line) print(--------------------------------------------------) # 方式3readlines() 读取所有行返回字符串列表 text_lines f.readlines() print(text_lines) print(--------------------------------------------------) # 方式4list()强制转换文件对象得到所有行列表 f.seek(0) text_lines list(f) print(text_lines) print() # 文件对象属于【可迭代对象】支持for循环逐行读取 print(--------------------------------------------------) f.seek(0) # print(dir(f)) # 查看文件对象所有内置方法 for i in f: print(i, end) # 文件操作完毕必须手动关闭释放资源 f.close() # 二进制文件读写示例图片/视频等 # rb 二进制读写模式 f2 open(d:/Gril.png, rb) str_binary f2.read() print(str_binary) f2.close() # wb 二进制只写模式复制图片文件 f3 open(./my_pixmap.png, wb) f3.write(str_binary) f3.close() # with 语句块上下文管理器推荐 # with 原理类必须实现 __enter__进入、__exit__退出两个魔法方法 class A: def __enter__(self): print(进入了) def __exit__(self, exc_type, exc_val, exc_tb): print(出来了) print(--------------------------------------------------) with A() as f: print(abc) # with 打开文件代码块结束自动调用close()防止忘记关闭 with open(./mytext.txt, r, encodingutf-8) as f5: for line in f5: print(line, end) 知识点总结 1、open打开模式区分 文本模式r / w / r / a 二进制模式rb / wb / rb / ab 不能写encoding参数 r文件不存在 → 报错 w文件不存在自动创建存在直接清空原有内容 r可读可写文件不存在报错从光标位置覆盖写入 2、光标 seek(0) 回到文件头部读写共用同一个光标写完需要seek才能从头读取 3、读取方法区别 read()读取全部返回str readline()读取一行 readlines()读取全部行list[str] for in f逐行迭代节省内存大文件首选 4、二进制文件图片、音频、视频、exe都必须用带b模式读写 5、with上下文管理器优势 自动关闭文件即使代码发生异常也能安全释放句柄工程开发优先使用 6、重要限制 文本模式下 seek 仅支持相对于文件开头偏移 想要使用相对当前、文件末尾偏移必须打开为二进制模式 Python基础18面向对象之构造与析构# 1.在python定义一个类的语法形式 class Person: # 成员属性 name None age None # 成员方法self 类似于C中this指针只要是非静态成员方法第一个参数必须是self def hard_work(self): print(姓名%s年龄%d正在努力的工作 % (self.name, self.age)) # 类中的构造方法 __init__ def __init__(self, name, age): self.name name self.age age print(Person类的构造) # 析构方法 __del__ def __del__(self): print(Person的析构) # 关于类对象的构建方式 p Person(gaowanxi, 35) p.hard_work() print(p.__dir__()) print(p.__dict__) 核心知识点笔记 1、class 关键字用来定义类Python3 自定义类默认继承 object 基类 2、self实例方法第一个形参代表当前对象本身类比C this指针 3、__init__(self,...) 构造方法 创建对象时自动调用用来初始化成员属性 如果有额外参数实例化 Person(参数) 时传入 4、__del__(self) 析构方法 对象被系统垃圾回收时自动调用一般用来释放资源 无法确定执行时机不要依赖它做关键清理 5、实例化对象变量 类名(构造参数) 6、访问对象.属性 / 对象.方法() 7、内置属性 __dict__ 字典存放该对象自身所有成员属性 __dir__()返回对象所有可用属性、方法列表 8、⚠注意 写 hard_work 打印必须带上 self.name / self.age 直接写name会优先找局部变量会报错 类型差异载体不同 print(type(obj.__dir__())) # 输出class generator print(type(dir(obj))) # 输出class list