python马士兵学习笔记
前言:本篇文章是作者在B站学习python马士兵视频的笔记,之前章节的内容可参考https://blog.csdn.net/qq_43511094/article/details/113062435
或https://blog.csdn.net/weixin_46860149/article/details/118232264
视频传送门:https://www.bilibili.com/video/BV1wD4y1o7AS
文章目录
- 十一章 异常
- python异常处理机制
- python中常见的异常类型
- traceback模块的使用
- pycharm开发环境的调试
- 十二章 类与对象
- 定义python中的类
- 对象的创建
- 类属性、类方法、静态方法的使用方式
- 动态绑定属性和方法
- 十三章 面向对象
- 面向对象的三大特性----封装、继承、多态
- 封装的实现方式
- 继承及其实现方式
- 方法重写
- Object类
- 多态
- 特殊方法和特殊属性
- 类的浅拷贝与深拷贝
- 十四章 模块
- 什么叫模块、模块化编程的好处
- 模块的导入
- 以主程序方式运行
- python中的包
- python中常用的内置模块
- 第三方模块的安装与使用
- 十五章 文件操作
- 编码格式
- 文件读写原理
- 常用的文件打开模式
- 文件对象的常用方法
- With语句
- 目录操作
- 实操案例——学生信息管理系统
十一章 异常
python异常处理机制
python中常见的异常类型
# print (10/0) #ZeroDivisionErrorlst = [11, 22, 33, 44]
# print(lst[4])#IndexError索引从0开始dic = {'name': '张三', 'age': 20}
# print(dic['gender']) #KeyError# print (num) # NameError# int a=20 #SyntaxError python中的变量没有数据类型a = int('hello') # ValueError
traceback模块的使用
pycharm开发环境的调试
十二章 类与对象
定义python中的类
class Student: # Student为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写native_pace = '吉林' # 直接写在类里的变量,称为类属性def __init__(self, name, age): # 初始化方法self.name = name # self.name称为实体属性,进行了一个赋值的操作,将局部变量的name的值赋给实体属性 self.age = age# 实例方法def eat(self):print('学生在吃饭...')# 静态方法@staticmethoddef method(): # 静态方法中不能加selfprint('我使用了staticmethod进行修饰,所以我是静态方法')# 类方法@classmethoddef cm(cls):print('我是类方法,因为我使用了classmethod进行修饰')# 类之外定义的叫函数,类里定义的叫方法def drink():print('喝水')
对象的创建
# 创建Student类的对象
stu1 = Student('张三', 20)
stu1.eat() # 对象名.方法名()
print(stu1.name)
print(stu1.age)Student.eat(stu1) # 第二种调用方式, 类名.方法名(类的对象)-->实际上就是方法定义处的self# 输出
'''学生在吃饭...
张三
20
学生在吃饭...'''
类属性、类方法、静态方法的使用方式
# 类属性的使用方式
print(Student.native_pace) # 访问类属性
stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print(stu1.native_pace)
print(stu2.native_pace)
'''输出:
吉林
吉林
吉林'''#类方法的使用方式
Student.cm() # 实例方法需要传实例对象,而类方法通过类名来调用
'''输出: 我是类方法,因为我使用了classmethod进行修饰'''#静态方法的使用方式
Student.method() # 没有默认参数,也是通过类名来调用
'''输出: 我使用了staticmethod进行修饰,所以我是静态方法'''
动态绑定属性和方法
class Student: # Student为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(self.name + '在吃饭')stu1 = Student('张三', 20)
stu2 = Student('李四', 30)# 为stu1动态绑定性别属性
stu1.gender = '女'
print(stu1.name, stu1.age, stu1.gender)
'''输出: 张三 20 女'''
print(stu2.name, stu2.age)
'''输出: 李四 30'''# 一个Student类可以创建N多个Student类的实例对象,每个实体对象的属性值不同def show():print('定义在类之外的,称函数')# 为stu1动态绑定方法
stu1.show = show
stu1.show()
十三章 面向对象
面向对象的三大特性----封装、继承、多态
封装的实现方式
class Student:def __init__(self, name, age):self.name = nameself.__age = age # 年龄不希望在类的外部被使用,所以加了两个_def show(self):print(self.name, self.__age)stu = Student('张三', 20)
stu.show()
# 在类外使用name
print(stu.name)
# print(stu.__age) 访问不了
print(stu._Student__age) # 在类的外部可以通过 _类名__属性名 进行访问,但是不建议
继承及其实现方式
class Person(object): # Person类继承object类def __init__(self, name, age):self.name = nameself.age = agedef info(self):print(self.name, self.age)class Student(Person): # Student类继承Person类def __init__(self, name, age, stu_no):super().__init__(name, age) # 使用super调用父类的方法self.stu_no = stu_noclass Teacher(Person): # Teacher类继承Person类def __init__(self, name, age, teachofyear):super().__init__(name, age)self.teachofyear = teachofyearstu = Student('张三', 20, '1001')
teacher = Teacher('李四', 30, 10)stu.info()
teacher.info()
'''输出:
张三 20
李四 30'''
#多继承
class A(object):pass
class B(object):pass
class C(A,B):pass
方法重写
class Person(object): # Person类继承object类def __init__(self, name, age):self.name = nameself.age = agedef info(self):print(self.name, self.age)class Student(Person): # Student类继承Person类def __init__(self, name, age, stu_no):super().__init__(name, age)self.stu_no = stu_nodef info(self): # 重写父类的方法super().info() # 先执行父类的方法print(self.stu_no)class Teacher(Person): # Teacher类继承Person类def __init__(self, name, age, teachofyear):super().__init__(name, age)self.teachofyear = teachofyeardef info(self):super().info() # 先执行父类的方法print('教龄', self.teachofyear)stu = Student('张三', 20, '1001')
teacher = Teacher('李四', 30, 10)stu.info()
teacher.info()
'''输出:
张三 20
1001
李四 30
教龄 10'''
Object类
class Student:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return '我的名字是{0},今年{1}岁'.format(self.name, self.age)stu = Student('张三', 20)
print(dir(stu))
print(stu) # 默认会调用__str__()这样的方法'''输出:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name']
我的名字是张三,今年20岁'''
多态
python是动态语言,它只关心这个类有没有相应的方法,像上面的Person类没有继承Animal类,但它有eat()方法
这是与java等静态语言不一样的地方
特殊方法和特殊属性
特殊属性
class A(object):passclass B(object):passclass C(A, B):def __init__(self, name, age):self.name = nameself.age = age# 创建C类的对象
x = C('jack', 20) # x是C类的一个实例对象
print(x.__dict__) # 实例对象的属性字典
print(C.__dict__) # 类的属性字典
print('--------')
print(x.__class__) # 输出对象所属的类
print(C.__bases__) # 输出C类的父类类型的元素
print(C.__mro__) # 类的层次结构
print(A.__subclasses__()) # 子类的列表'''输出:
{'name': 'jack', 'age': 20}
{'__module__': '__main__', '__init__': <function C.__init__ at 0x000001D9042EBDC0>, '__doc__': None}
--------
<class '__main__.C'>
(<class '__main__.A'>, <class '__main__.B'>)
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
[<class '__main__.C'>]
'''
特殊方法
class Student:def __init__(self, name):self.name = namedef __add__(self, other):return self.name + other.namedef __len__(self):return len(self.name)stu1 = Student('张三')
stu2 = Student('李四')s = stu1 + stu2 # 实现了两个对象的加法运算(因为在Student类中编写_add__()特殊的方法)
print(s)
print(len(s))
class Person(object):def __new__(cls, *args, **kwargs):print('__new__被调用执行了,cls的id值为{0}'.format(id(cls)))obj = super().__new__(cls)print('创建对象的id值为{0}'.format(id(obj)))return objdef __init__(self, name, age):print('__init__被调用了,self的id值为{0}'.format(id(self)))self.name = nameself.age = ageprint('object这个类对象的id为{0}'.format(id(object)))
print('Person这个类对象的id为{0}'.format(id(Person)))# 创建Person类的实例对象
p1 = Person('张三', 20)
print('p1这个Person类的实例对象的id:{0}'.format(id(p1)))'''输出:
object这个类对象的id为140707984993104
Person这个类对象的id为1427494206928
__new__被调用执行了,cls的id值为1427494206928
创建对象的id值为1427495955328
__init__被调用了,self的id值为1427495955328
p1这个Person类的实例对象的id:1427495955328
'''
类的浅拷贝与深拷贝
class CPU:passclass Disk:passclass Computer:def __init__(self, cpu, disk):self.cpu = cpuself.disk = disk# (1)变量的赋值
cpu1 = CPU()
cpu2 = cpu1
print(cpu1, id(cpu1))
print(cpu2, id(cpu2))
# (2)类的浅拷贝
print('------------')
disk = Disk() # 创建一个Disk类对象
computer = Computer(cpu1, disk) # 创建一个Computer类对象
# 浅拷贝
import copyprint(disk)
computer2 = copy.copy(computer)
print(computer, computer.cpu, computer.disk)
print(computer2, computer2.cpu, computer2.disk)#深拷贝
print('------------')
computer3=copy.deepcopy(computer)
print(computer, computer.cpu, computer.disk)
print(computer3, computer3.cpu, computer3.disk)'''输出:
<__main__.CPU object at 0x0000020638BF65E0> 2225745126880
<__main__.CPU object at 0x0000020638BF65E0> 2225745126880
------------
<__main__.Disk object at 0x0000020638BC86D0>
<__main__.Computer object at 0x0000020638C0D430> <__main__.CPU object at 0x0000020638BF65E0> <__main__.Disk object at 0x0000020638BC86D0>
<__main__.Computer object at 0x0000020638C0DC70> <__main__.CPU object at 0x0000020638BF65E0> <__main__.Disk object at 0x0000020638BC86D0>
------------
<__main__.Computer object at 0x000001F78328D430> <__main__.CPU object at 0x000001F7832765E0> <__main__.Disk object at 0x000001F7832486D0>
<__main__.Computer object at 0x000001F784ED7310> <__main__.CPU object at 0x000001F784ED7370> <__main__.Disk object at 0x000001F784ED76A0>
'''
十四章 模块
什么叫模块、模块化编程的好处
模块的导入
导入自定义的模块需要 右键当前目录,选择Mark Directory as,再选择Sources Root
以主程序方式运行
if __name__=='__main__': # 只有运行当前程序时,才会执行pass代码pass
python中的包
使用import方式进行导入时,只能跟包名或模块名
使用from …import可以导入包,模块,函数,变量
python中常用的内置模块
第三方模块的安装与使用
十五章 文件操作
编码格式
文件读写原理
常用的文件打开模式
文件对象的常用方法
With语句
with open(' logo.png','rb') as src_file:with open('copy2logo.png','wb') as target_file:target_file.write(src_file.read ())
以上代码实现文件的复制
文件操作推荐使用with语句,这样不用手动去写关闭操作
目录操作
#OS 模块是与操作系统相关的一个模块
import os
os.system('notepad.exe') #打开记事本
os.system('calc.exe') #打开计算器# 接调用可执行文件
os.startfile('C:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')
实操案例——学生信息管理系统
import osfilename = 'student.txt'def main():while True:menu()choice = int(input('请选择'))if choice in range(0, 8):if choice == 0:answer = input('您确定要退出系统吗? y/n')if answer == 'y' or answer == 'Y':print('感谢您使用本系统!!')break # 退出系统else:continueelif choice == 1:insert() # 录入学生信息elif choice == 2:search() # 查找学生信息elif choice == 3:delete() # 删除学生信息elif choice == 4:modify() # 修改学生信息elif choice == 5:sort() # 排序elif choice == 6:total() # 统计学生总人数elif choice == 7:show() # 显示所有学生信息def menu():print("====================学生信息管理系统====================\n")print('--------------------功能菜单---------------------------')print('\t\t\t\t\t1.录入学生信息')print('\t\t\t\t\t2.查找学生信息')print('\t\t\t\t\t3.删除学生信息')print('\t\t\t\t\t4.修改学生信息')print('\t\t\t\t\t5.排序')print('\t\t\t\t\t6.统计学生总人数')print('\t\t\t\t\t7.显示所有学生信息')print('\t\t\t\t\t0.退出')print('-----------------------------------------------------')def insert(): # 录入学生信息student_list = []while True:id = input('请输入ID(如1001):')if not id:breakname = input('请输入姓名:')if not name:breaktry:english = int(input('请输入英语成绩:'))python = int(input('请输入Python成绩:'))java = int(input('请输入java成绩:'))except:print('输入无效,不是整数类型,请重新输入')continue# 将录入的学生信息保存到字典中student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java}# 将学生信息添加到列表中student_list.append(student)answer = input('是否继续添加? y/n')if answer == 'y':print()continueelse:print()break# 调用save()函数save(student_list)print('学生信息录入完毕!!')def save(lst): # 将学生信息录入文件中try:stu_txt = open(filename, 'a', encoding='utf-8')except:stu_txt = open(filename, 'w', encoding='utf-8')for item in lst:stu_txt.write(str(item) + '\n')stu_txt.close()def search(): # 查找学生信息student_query = []while True:id = ''name = ''if os.path.exists(filename):mode = input('按ID查找请输入1,按姓名查找请输入2:')if mode == '1':id = input('请输入学生ID:')elif mode == '2':name = input('请输入学生姓名:')else:print('您的输入有误,请重新输入!')search()with open(filename, 'r', encoding='utf-8') as rfile:student = rfile.readlines()for item in student:d = dict(eval(item))if id != '': # 按ID查if d['id'] == id:student_query.append(d)elif name != '': # 按姓名查if d['name'] == name:student_query.append(d)# 显示查询结果show_student(student_query)# 清空列表student_query.clear()answer = input('是否继续查询? y/n')if answer == 'y' or answer == 'Y':continueelse:breakelse:print('暂未保存学生信息')returndef show_student(lst):if len(lst) == 0:print('没有查找到学生信息,无数据显示!!!')return# 定义标题显示格式format_title = "{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}"print(format_title.format('ID', '姓名', '英语成绩', 'Python成绩', 'Java成绩', '总成绩'))# 定义内容显示格式format_data = "{:^6}\t{:^12}\t{:^8}\t{:^8}\t{:^8}\t{:^8}"for item in lst:print(format_data.format(item.get('id'),item.get('name'),item.get('english'),item.get('python'),item.get('java'),int(item.get('english')) + int(item.get('python')) + int(item.get('java'))))def delete(): # 删除学生信息while True:student_id = input('请输入要删除的学生的ID:')if student_id != '':if os.path.exists(filename): # 文件存在with open(filename, 'r', encoding='utf_8')as file:student_old = file.readlines()else: # 文件不存在student_old = []flag = False # 标记是否删除if student_old:with open(filename, 'w', encoding='utf_8') as wfile:d = {}for item in student_old:d = dict(eval(item)) # 将字符串转成字典if d['id'] != student_id:wfile.write(str(d) + '\n') # 将不需要删除的学生信息再次写入else:flag = Trueif flag:print(f'id为{student_id}的学生信息已被删除')else:print(f'没有找到ID为{student_id}的学生信息')else:print('无学生信息')breakshow() # 删除之后重新显示所有学生信息answer = input('是否继续删除? y/n')if answer == 'y' or answer == 'Y':continueelse:breakdef modify(): # 修改学生信息show()if os.path.exists(filename): # 文件存在with open(filename, 'r', encoding='utf-8')as rfile:student_old = rfile.readlines() # 原来的学生信息放入列表中else:returnstudent_id = input('请输入要修改的学生的ID:')with open(filename, 'w', encoding='utf-8') as wfile:for item in student_old:d = dict(eval(item))if d['id'] == student_id:print('找到学生信息,可以进行修改了!')while True:try:d['name'] = input('请输入姓名:')d['english'] = input('请输入英语成绩:')d['python'] = input('请输入Python成绩:')d['java'] = input('请输入java成绩:')except:print('您的输入有误,请重新输入!!!')else:breakwfile.write(str(d) + '\n') # 将修改后的信息写入文件print('修改成功!!!')else:wfile.write(str(d) + '\n') # 将未修改的信息也写入原文件answer = input('是否继续修改其他学生信息? y/n')if answer == 'y' or answer == 'Y':modify()def sort(): # 排序show()if os.path.exists(filename):with open(filename, 'r', encoding='utf-8') as rfile:student_list = rfile.readlines()student_new = []for item in student_list:d = dict(eval(item))student_new.append(d)else:returnasc_or_desc = input('请选择:(0.升序 1.降序)')if asc_or_desc == '0':asc_or_desc_bool = Falseelif asc_or_desc == '1':asc_or_desc_bool = Trueelse:print('您的输入有误,请重新输入')sort()mode = input('请选择排序方式(1.按英语成绩排序 2.按Python成绩排序 3.按Java成绩排序 0.按总成绩排序):')if mode == '1':student_new.sort(key=lambda x: int(x['english']), reverse=asc_or_desc_bool)elif mode == '2':student_new.sort(key=lambda x: int(x['python']), reverse=asc_or_desc_bool)elif mode == '3':student_new.sort(key=lambda x: int(x['java']), reverse=asc_or_desc_bool)elif mode == '0':student_new.sort(key=lambda x: int(x['english']) + int(x['python']) + int(x['java']), reverse=asc_or_desc_bool)else:print('您的输入有误,请重新输入!!!')sort()show_student(student_new)def total(): # 统计学生总人数if os.path.exists(filename):with open(filename, 'r', encoding='utf-8') as rfile:students = rfile.readlines()if students:print(f'一共有{len(students)}名学生')else:print('暂未保存学生的信息!')def show(): # 显示所有学生信息student_list = []if os.path.exists(filename):with open(filename, 'r', encoding='utf-8') as rfile:students = rfile.readlines()for item in students:student_list.append(eval(item))if student_list:show_student(student_list)else:print('暂未保存数据信息!!!')if __name__ == '__main__':main()
python马士兵学习笔记相关推荐
- Hibernate 马士兵 学习笔记
1. HelloWorld a) Xml b) Annotction 2. Hibernate原理模拟-什么是O/RMapping以及为什么要有O/RMapping 3 ...
- 马士兵学习笔记-Java基础网络编程
TCP:可靠的 建立连接:三次握手 第一次:客户端向服务端发送小 第二次:服务端向客户端确认收到消息 第三次:客户端向服务端发送消息确定知道服务端收到客户端发送的消息 释放连接:四次挥手 第一次挥手: ...
- python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)
[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...
- Python基础语法学习笔记
Python基础语法学习笔记 想淘宝省钱看我简介,博客www.liangxin.name (一) 一.Print()函数 1.数字可以直接输出,无需加引号 只能理解数字,却读不懂文字.因为数字和数学运 ...
- python基础入门学习笔记 (2)
python基础入门学习笔记 2021年2月8日 1 编译器和解释器的区别 编译器/解释器:高级语言与机器之间的翻译官 2 值传递: print "a = ",a print &q ...
- 关于Python的一些学习笔记(小白式笔记,持续更新)
关于Python的一些学习笔记 瞎bb: 作为一个计算机专业的学生,Python应该是一门很有必要掌握的语言,但是由于鄙人太懒,一直对Python没有太多了解,但是随着知识的积累以及学业难度的增加,我 ...
- Python 基础知识学习笔记——NumPy
Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...
- Python 基础知识学习笔记——OpenCV(1)
Python 基础知识学习笔记--OpenCV(1) OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,它轻量而且高效,被广泛的使用. 整理一下OpenCV学习笔记,以防忘记. 文章目录 Py ...
- Python基础知识学习笔记——Matplotlib绘图
Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...
最新文章
- ISME:基于大数据准确预测土壤的枯萎病发生
- 【双100%解法】LeetCode 141 【剑指Offer 23】链表中环的入口节点
- 发布HTML 7-3
- 基于.NetCore3.1搭建项目系列 —— 认证授权方案之Swagger加锁
- P1494 [国家集训队]小Z的袜子
- 不相交集的求并算法(按集合大小求并+按高度求并)
- 面向对象技术第一讲 多态性
- 终于把英文版操作系统中文乱码问题解决了
- 【元胞自动机】基于matlab元胞自动机城市规划【含Matlab源码 125期】
- 亚马逊Alexa Connect Kit(ACK)
- android 字体修改颜色代码,Android SearchView 修改字体颜色
- 传统图像特征提取方法列表
- dataframe两个表合并_DataFrame踩坑整理(一)
- Android R- CarAudioService之registerAudioPolicy动态注册(一)
- 锐捷睿易:扩大DHCP掩码导致AP不上线问题
- python整形怎么切片_遥感影像切分切片
- Matlab 元胞自动机(模拟传染病传播)
- Xcon北京黑客大会明天开幕
- 【博文】:甲骨文收购AMD的缘由
- function name should be lowercase
热门文章
- 三菱FX1N PLC 485与三菱变频器modbus通讯 对变频器进行频率设定,加减速时间设置,正反转,启停控制
- 解决电脑能上QQ,却打不开网页的问题
- Flash/Flex学习笔记(8):ActionScript3.0中的面对对象
- 计算机专业英语单词mp3,[听单词] 计算机专业英语词汇音频62,计算机英语单词MP3...
- 小白的《CSS权威指南》笔记(下部分)
- python从入门到实践练习9-6:冰淇淋小店
- AE2017免安装版使用粒子插件红巨星套装插件经验分享
- 激光雷达中的激光对人眼有危害吗?正确答案是.....
- Firefox插件导航
- Go圣经-学习笔记目录