目录
01-匿名函数
'''
01-匿名函数
lambda 参数列表:表达式
1.参数可有可无 函数的参数在中间完全使用
2.可以接收N参数,但是返回的表达式只能是一个
*个人理解
偷懒函数
1.不用声明,少去def过程
2.因为只返回一个表达式,所以只要关注返回值就行了
'''
#1.匿名函数的语法
def ni():
return 200
num = lambda :200
#num得到的匿名函数内存地址
#num() 得到的匿名函数的返回值
print("匿名函数的内存地址:",num)
print("匿名函数的返回值:",num())
#2.计算a+b
def addNum(a,b):
return a+b
# 关键字 参数列表
add = lambda a,b :a+b
# 使用匿名函数时,接受的变量相当于函数名
print("匿名函数加法运算:",add(1,2))
#无参数
add1 = lambda : 200
#一个参数
add2 = lambda a:a
#默认参数(缺省值参数)
add3 = lambda a,b,c=100:a+b+c
#可变参数(不定长参数)
#位置传参-不定长参数
add4 = lambda *args:args
#缺省值传参-不定长参数
add5 = lambda **kwargs : kwargs
print(add5(name="lili",age=19))
#3.lambda 应用——判断两个数字大小
#匿名函数+三目运算符
judgeNum = lambda a,b:b if a<b else a
print("判断大小:",judgeNum(1,2))
#列表按照字典的key排序
stus = [
{'name':'lili','age':18,'sex':'girl'},
{ 'name':'张无忌','age':18,'sex':'男'},
{ 'name':'张三', 'age':22, 'sex':'女'},
{ 'name':'李四', 'age':33, 'sex':'男'},
{ 'name':'王五', 'age':44, 'sex':'女'},
]
#按照name进行排序
stus.sort(key= lambda x:x['name'] ,reverse=True)
print("按照name进行排序:",stus)
#按照age进行排序
stus.sort(key=lambda x : x['age'],reverse=True)
print("按照age进行排序:",stus)
02-高级函数
'''
02-高阶函数
1.abs(数据) 绝对值
2.round(数据,位数) 四舍五入
3.map(func操作,list被操作对象)
*列表中的每个元素组成新的列表返回
*返回的结果是map object
4.reduce(func操作,list被操作对象)
*当前元素和下一个序列的元素累计
注意:reduce()传入的参数func必须接受2个参数
* import functools
result = functools.reduce(func2,list2)
5.filter(func操作,list被操作对象)
*过滤到不合适的列表元素
*返回的是filter object
'''
# 1.abs() 数字的绝对值
print("abs函数:",abs(-1))
# 2.round(数据,位数)函数 四舍五入
print("round()函数:",round(2.345,2))
# abs应用
def absNum(a,b,f):
return f(a)+f(b)
# abs ==>f
num = absNum(-10,-20,abs)
print("abs应用:",num)
# 3.map()函数 内置高阶函数 列表中的每个元素组成新的列表返回
# 返回的结果是map object
List1=[1,2,3,4]
def func1(a):
return a+1
result=map(func1,List1)
print("map函数的使用:",result)
print("map函数的使用2:",list(result))
# 4.reduce(func,lst)函数当前元素和下一个序列的元素累计
# 注意:reduce()传入的参数func必须接受2个参数
import functools
def func2(a,b):
return a+b
result=functools.reduce(func2,List1)
print("reduce()函数:",result)
# 5.filter() 过滤到不合适的列表元素
# 返回的是filter object
def func3(x):
return x%2==0
result = filter(func3,List1)
print("filter()函数:",result)
print("filter()函数的列表:",list(result))
03-文件操作
'''
03-文件操作
1.文件作用
将数据写入文档用作储存,方便下一次使用
2.操作过程 open(name,mode)
name-->文件名
mode-->操作方式
*若文件不存在,则先自动创建
*4种方式
2.1 r===>read
r 只读模式打开,文件指针在开头,默认模式
rb 以二进制打开文件,只读,文件指针在开头,默认模式
r+ 文件用于读写,文件指针在开头
rb+ 以二进制打开文件读写,文件指针在开头
2.2 w===>write
w 文件写入,若存在则在开头编辑,原有文件内容则覆盖
若文件不存在,则新建空白文件
wb 以二进制格式写入,若存在则在开头编辑,原有文件内容则覆盖
若文件不存在,则新建空白文件
w+ 文件读写,若存在则在开头编辑,原有文件内容则覆盖
若文件不存在,则新建空白文件
wb+ 以二进制格式读写,若存在则在开头编辑,原有文件内容则覆盖
若文件不存在,则新建空白文件
2.3 a===>append
a 打开文件追加编辑,若文件存在则文件指针在末尾
若文件不存在,则新建文件,文件指针在开头
ab 以二进制格式进行追加,若文件存在则文件指针在末尾
若文件不存在,则新建文件,文件指针在开头
a+ 以追加模式进行读写,若文件存在则是追加模式
若文件不存在,则新建文件
ab+ 以二进制格式进行追加读写,若文件存在则文件指针在末尾
若文件不存在,则新建文件
2.4 b===>byte 二进制
3.文件的指针操作
* tell() 获取指针当前的位置
* seek(偏移量,起始位置)
0:文件开头
1:当前位置
2:文件末尾
注意:
若指针为负数则往前偏移
若指针为正数则往后偏移
文件内容若读取结束则指针是-1
'''
#2.1文件内打开
# file=open("test.txt","w")
# file.write("python is nice\nonono")
# file.close()
#2.2写模式
# file=open("test.txt",'w',encoding='utf-8')
# file.write("python is bad\n nono")
# file.close()
#2.3读模式
# 1) read(n)读取内容 n:指针的位置
# file=open("test.txt",'r',encoding='utf-8')
# str=file.read()#可空
# print("2.3.1 read(n):",str)
# file.close()
# 2) readlines() 按照行读取文件内容并返回列表
# file=open("test.txt",'r',encoding='utf-8')
# strlines=file.readlines()
# print("2.3.2 readlines():",strlines)
# file.close()
# 3) readline() 按照行进行一行一行的读取
# file=open("test.txt",'r',encoding='utf-8')
# strline1=file.readline()
# print("2.3.3 readline()-strline1:",strline1)
# strline2=file.readline()
# print("2.3.3 readline()-strline2:",strline2)
# file.close()
# 2.4 追加模式
# file=open("test.txt",'a',encoding='utf-8')
# file.write('\n干饭人干饭人干饭都是人上人!\n烤鸭!烤鸭!')
# file.write('\n')
# file.write('===over===')
# file.close()
# 3.文件操作指针
# r读 b二进制 +写
file = open("test.txt",'rb+')
# 3.1 文件开头 0
# file.seek(3,0)
# line=file.readline()
# print("文件开头:",line)
# 3.2 获取当前位置
#print("文件当前位置:",file.tell())
# 3.3 当前指针 1文件当前位置
# line2=file.read(5)
# print("读取5个字符:",line2)
# print("当前指针位置:",file.tell())
# 指针的模式设置 当前位置偏移5
file.seek(5,1)
line3=file.read(3)
print("读取3个字符:",line3)
print("当前指针位置:",file.tell())
# 指针为负数 则往前偏移
file.seek(-5,1)
line4 = file.read(5)
print("读取5个字符:",line4)
print("当前指针位置:",file.tell())
# 3.4 末尾位置 2 文件末尾位置
file.seek(-5,2)
line5 = file.read(5)
print("读取5个字符:",line5)
print("当前指针位置:",file.tell())
file.close()
是gdk不是jdk
04-文件备份
'''
04-文件备份
课堂练习
1.用户输入需要备份的文件名称 test.txt
2.根据用户输入的文件名称进行判断
2.1 判断是否为合法的格式 字符串是否有 . 后缀是否txt格式
2.2 判断用户输入的文件是否在该目录中
3.根据用户的输入名称进行备份操作
test-[备份].txt
4.将原有文件test.txt文件中的内容写入到 test-[备份].txt中
'''
#stu
oldfile=input("输入需要备份的文件名称:")
if oldfile[0:(len(oldfile)-4)].isalnum() and oldfile.endswith(".txt"):
pointIndex=oldfile.find('.')
filename=oldfile[:pointIndex]
if len(filename)>0:
file=open(oldfile,'br+')
#返回的是列表
readLines=file.readlines()
file.close()
newfile=open(filename+"-[备份].txt",'bw+')
#读入每一行
for lines in readLines:
newfile.write(lines)
newfile.close()
else:
print("您输入的格式有误!")
#tea
import os
# 1.用户输入文件名称
userName = input("请输入需要备份的文件名称")
# 2.判断文件是否有效
if "." not in userName and userName not in os.listdir():
print("您输入的文件名称格式不对,请重新输入")
else:
# 3.获取点的下标位置
pointIndex = userName.find(".")
# 4.进行前缀和后缀的分割
# test
prefixName = userName[:pointIndex]
# .txt
suffixName = userName[pointIndex:]
# 5.判断是否是有效文件
if len(prefixName) > 0 and len(suffixName) > 1:
# 6.拼接新文件名 test-[备份].txt
newFileName = prefixName+"-[备份]"+suffixName
# 7.获取原文件的内容
oldFile = open(userName,'r')
# 读取原文件所有的行
oldLines = oldFile.readlines()
oldFile.close()
# 8.打开新文件
newFile = open(newFileName,'w')
# 循环遍历写入新文件
for line in oldLines:
newFile.write(line)
newFile.close()
这里我的输入必须为br+和bw+
不然会报错,就是之前说的gdk问题
05-文件夹操作
'''
05-文件夹操作
1.文件
*默认当前文件夹下的路径
1.rename(src,str) 重命名文件
src 原文件名
str 新文件名
*找不到源文件则报错 FileNotFoundError
2.remove(src) 删除文件
src 文件名
2.文件夹
*默认path当前目录下
3.mkdir(dirname) 创建文件夹
4.rmdir(dirname) 删除文件夹
5.getcwd() 获取当前文件夹下目录
6.chdir() 改变默认目录
.. 上一层目录
7.listdir(path) 获取目录的文件列表
path 目录的位置
'''
import os
#1
#os.rename('test-[备份].txt',"renametest.txt")
#2
#os.remove("renametest.txt")
#print("remove")
#3
#os.mkdir("mkdir")
#4
#os.rmdir("mkdir")
#5
print("getcwd():",os.getcwd())
#6
# os.chdir("../")
# print("chdir():",os.getcwd())
#6
# os.chdir("mkdir")
# print("changedir:",os.getcwd())
#7
list=os.listdir("../../")
print("day04-1文件夹的目录列表:",list)
06-批量备份文件
'''
06-批量备份文件
课堂练习:
1.新建文件夹<江苏师范大学>
2.在江苏师范大学添加10个备份文件
师范-[智慧]-01.txt
师范-[智慧]-02.txt
....
3.用户输入需要备份的文件名
test.txt
4.判断文件名是否存在是否有效
5.将test.txt修改名称为<师范.txt>
6.备份test.txt中所有的内容到备份文件中
7.在<师范.txt>中追加一句 <软件工程,好牛啊!>
8.使用函数的方式
'''
import os
def main():
userfilename=input("请输入需要备份的文件名:")
if judgeName(userfilename):
#这里返回的是文本内容,也是我没有注意的
contents=changeName(userfilename)
#这里的判断是我没想到的
if "江苏师范大学" in os.listdir():
os.rmdir("江苏师范大学")
os.mkdir("江苏师范大学")
os.chdir("江苏师范大学")
return addFile(contents)
else:
print("你输入的文件名不正确")
def judgeName(userfilename):
if userfilename.endswith(".txt") and userfilename[:(len(userfilename)-4)].isalnum():
return True
else :
return False
#这里的问题比较多
'''
1.newname的类型没有注意,写成元组了
2.rename过后,使用的oldfilename
3.a的操作不熟悉
'''
def changeName(oldfilename):
newname="师范"+oldfilename[oldfilename.find("."):]
os.rename(oldfilename,newname)
newfile=open(newname,'a',encoding='utf-8')
newfile.write("\n好累啊")
newfile.close()
file=open(newname,'r',encoding='utf-8')
contents=file.readlines()
file.close()
return contents
def addFile(contents):
for i in range(1,11):
newfileName="师范-[智慧]-%d.txt"%i
newfile =open(newfileName,'w',encoding='utf-8')
for line in contents:
newfile.write(line)
print("已经备份了%d个文件"%i)
newfile.close()
return "备份操纵完成"
if __name__ == '__main__':
main()
07-面向对象
'''
07-面向对象
*类:学生(一个有着某种共同特征的群体)
对象:我(一个属于学生这个群体的具体实例)
面向对象是一种编程思想,一切皆对象
笔记本电脑===>对象====>抽象成类
open
close....
面向对象的编程中
类 : 相当于设计的图纸
对象 : 创建好的实例化存在
什么是抽象?
将实物数据化到类中设计
'''
class bzh():
sex = "男"
height = 180
weight = 140
name = "包子涵"
money = 1000
def eat(self):
print("吃的是带血馒头")
def drink(self):
print("喝白开水")
def jieqian(self):
self.money -= 100
def daifan(self):
pass
class mzqr():
# 1.属性 ====>特征
sex = '女'
height = 175
weight = 100
name = "小丽"
# 2.函数 ====>行为动作
def eat(self):
print("吃玉米,减肥")
def drink(self):
print("多喝热水")
# 电脑
class computer():
# 1.属性
name = '联想拯救者Y7000'
size = 15.6
cpu = "i7"
number = 4
nc = 32
# 2.函数
def open(self):
pass
def net(self):
pass
def usb(self):
pass
def music(self):
pass
08-类和对象
'''
08-类和对象
创建对象的过程叫实例化对象
对象=类()
对象.类中方法()
对象.类中属性
'''
# 经典类的语法
class Student(object):
# 1.类属性===>特征
age = 18
sex = '女'
# 2.类函数===>动作
def eat(self):
pass
def drink(self):
pass
# 拓展类
class Zpp:
pass
if __name__ == '__main__':
# 类实例化对象
person = Student()
person.drink()
person.eat()
09-self
'''
09-self
1.self:存储的是当前类对象内存地址值 java中this一样
2.类中函数互相调用需要添加self
3.每个对象都拥有自己的地址值(一张图纸 生产2个洗衣机 编号不一样)
'''
class Student:
age = 10
def eat(self):
# <__main__.Student object at 0x00000252E3377820>
print("输出self",self)
print("self的id值:",id(self))
def drink(self):
print("我要喝牛奶")
def sleep(self):
#***
self.drink()
print("我要睡觉了")
if __name__ == '__main__':
# 实例化对象
person = Student()
person.eat()
print("person的id值:",id(person))
person.sleep()
# 二次实例化对象
person1 = Student()
person1.eat()
print("person1的id值:",id(person1))
10-添加和获取对象的属性
'''
10-添加和获取对象的属性
1.类的外面设置属性(set不建议使用)
2.类的外面获取属性(get不太建议使用 数据不安全 设置公共的函数)
3.类的内部获取属性(get)
4.类的内部设置属性(set)
'''
class Student:
# 4.类的内部设置属性
name = "张无忌"
age = 19
def getMsg(self):
# 3.类的内部获取属性 self.变量名
self.age = 50
print(f"姓名是:{self.name},年龄是:{self.age},地址是:{self.address}")
if __name__ == '__main__':
person = Student()
# 1.外部设置类对象的属性
person.address = "江苏师范大学"
print("外部设置类对象的属性:",person.address)
# 2.外部获取类对象的属性
print("外部获取类对象的属性:",person.age)
person.name = "张翠山"
person.getMsg()
11-魔法函数
'''
11-魔法函数
python 使用__XX__ 魔法方法
1.__init__函数
1.1 init函数相当于是构造方法
1.2 init函数创建对象的时候会自动进行调用
1.3 init函数只会被调用一次
1.4 若创建对象时候,不写则系统会自动创建
1.5 init中的self不需要手动传参,python解释器会自动将对象
地址值传递给init函数中的self
1.6 一般属性值的初始化操作
2.__str__
2.1 __str__若不写则打印独享的内存地址
若写则调用该__str__函数
2.2 该函数实际应用中需要返回当前类的基本信息
2.3 输出对象的字符串信息则会自动调用该函数
3.__del__
3.1 __del__删除对象时,会自动调用该函数
3.2 一般实际应用中,是作为提示以及属性值等清空操作
'''
class Student:
# 1.无参的init方法
def __init__(self):
# 1.1 init函数中添加类属性
print("调用Student的__init__:")
self.name='lili'
self.age=20
# 1.2 init函数中初始化序列
self.nums=[i for i in range(0,10)]
# 1.3 init函数中调用其他函数
self.getNums()
def getNums(self):
return [i for i in range(5,15)]
class Person:
# 2.有参数的init函数
def __init__(self,height,weight):
self.height=height
self.weight=weight
def getMsg(self):
print(f"我的身高{self.height},我的体重{self.weight}")
def __str__(self):
return "<Person类 %d>"%id(self)
def __del__(self):
print("删除了该对象<Person类 %d>"%id(self))
if __name__ == '__main__':
# 创建一个Student对象 名称是stu
stu = Student()
stu1 = Student()
print("stu中的属性:",stu.age)
print("stu中的属性:", stu.name)
print("stu中的属性:", stu.nums)
print("stu中的属性:", stu.getNums())
# 创建一个Person对象 person
person = Person(188,135)
person.getMsg()
# 调用魔法函数 __str__
# <__main__.Student object at 0x00000255F2977820>
print("魔法函数 stu ",stu)
# <Person类 2566312747504>
print("魔法函数__str__",person)
print("魔法函数__str__",person.__str__())
# 测试__del__函数
del stu
del person
12-继承
'''
12-继承
继承:父类的继承编程中是方便调用更多的函数以及属性等
知识点:
1.子类继承父类可以调用父类的函数以及属性值使用
2.子类继承父类可以重写父类的函数以及属性值改变
3.class 类名(父类类名):
4.python中所有的类默认继承object
object是基类
其他的类都是派生类
[实例]
class 王健林(object):
money = 1000
def money(self):
房地产 影视 商业....
class 王思聪(王健林):
money = 1100
def money(self):
电竞、游戏、直播...
'''
class People(object):
# 1.属性
name='name'
age=80
# 2.函数
def eat(self):
print("eat food")
def drink(self):
print("drink water")
class Student(People):
name='lili'
def study(self):
print("reading")
def drink(self):
print("tea")
# 创建学生对象
stu = Student()
# 调用子类的函数
stu.study()
# 调用父类的函数
stu.drink()
stu.eat()
print(stu.name)
print(stu.age)
13-单继承
'''
13-单继承
知识点:
1.单继承是子类只能继承一个父类
2.继承的时候,子类会默认调用父类的初始化函数
3.但继承可以调用父类的属性以及父类的函数
'''
#stu
class shifu(object):
def __init__(self):
self.mijue='mifang'
def make(self):
print(f'{self.mijue}是秘方')
class tudi(shifu):
pass
tu=tudi()
tu.make()
print(tu.mijue)
#tea
# 1.师父类
class Master(object):
# 1.1 初始化函数
def __init__(self):
print("进入到父类的init函数中")
self.kongfu = '[古法煎饼果子配方]'
# 1.2 制作煎饼果子方法
def make_cake(self):
print(f"使用{self.kongfu}制作煎饼果子")
# 2.徒弟类
class Prentice(Master):
pass
# 3.创建对象
tudi = Prentice()
# 调用父类的函数
tudi.make_cake()
# 调用父类的属性
print(tudi.kongfu)
14-学生信息管理系统(文件版)
'''
14-学生信息管理系统(文件版)
课堂作业:
1.用户添加学生保存到List===>dict
2.当退出系统的时候 将列表中的字典按行进行存储
student.txt ===>id:name:sex:age
1230:张无忌:男:18
1231:张三丰:男:20
....
系统退出的时候需要判断是否存在student.txt文件
3.退出系统后再打开
3.1 查找当前目录中是否存在student.txt文件
3.2 如果有student.txt文件则提取所有的数据
3.3 将读取的数据解析后存储到 students列表中
1230:张无忌:男:18====>分割后存储到dict中
完成以上3个功能模块
'''
import os
import sys
class Student:
studentList = []
def menu(self):
print("="*15)
print("1.添加学生\n2.删除学生\n3.修改学生\n4.查询学生\n5.退出程序")
print("=" * 15)
def mainSystem(self):
while True:
self.menu()
usernum=int(input("请选择操作的选项:"))
if usernum==1:
self.addStudent()
elif usernum==2:
self.delStudent()
elif usernum==3:
self.updateStudent()
elif usernum==4:
self.queryStudent()
elif usernum==5:
self.saveFile()
print("exit")
sys.exit(0)
else:
print("输入的操作选项有误!")
def addStudent(self):
dt={}
dt['id']=input("id:")
dt['name']=input("name:")
dt['sex']=input("sex:")
dt['age']=input("age:")
self.studentList.append(dt)
def delStudent(self):
for dt in self.studentList:
print(f"id:{dt['id']},name:{dt['name']},sex:{dt['sex']},age:{dt['age']}")
index=int(input("input number that you want delete:"))
del self.studentList[index]
def updateStudent(self):
for dt in self.studentList:
print(f"id:{dt['id']},name:{dt['name']},sex:{dt['sex']},age:{dt['age']}")
index = int(input("input number that you want update:"))
print("input student that you want update")
dt = {}
dt['id'] = input("id:")
dt['name'] = input("name:")
dt['sex'] = input("sex:")
dt['age'] = input("age:")
self.studentList[index]=dt
def queryStudent(self):
for dt in self.studentList:
print(f"id:{dt['id']},name:{dt['name']},sex:{dt['sex']},age:{dt['age']}")
def saveFile(self):
file = open("student.txt",'w',encoding='utf-8')
for dt in self.studentList:
#join连接类型相同的数据
dtStr=":".join(list(dt.values()))
file.write(dtStr)
file.write('\n')
file.close()
def __init__(self):
if "student.txt" in os.listdir():
file=open("student.txt",'r',encoding='utf-8')
contents=file.readlines()
file.close()
for line in contents:
lt = line.split(":")
dt = {}
dt['id']=lt[0]
dt['name']=lt[1]
dt['sex']=lt[2]
dt['age']=lt[3]
self.studentList.append(dt)
if __name__=='__main__':
stu=Student()
stu.mainSystem()