【python】day04 匿名函数,高级函数,文件操作,文件备份,文件夹操作,批量备份文件,面向对象,类和对象,self,添加和获取对象的属性,魔法函数,继承,单继承,学生信息管理系统(文件版)

目录

01-匿名函数

02-高级函数

03-文件操作

04-文件备份

05-文件夹操作

06-批量备份文件

07-面向对象

08-类和对象

09-self

10-添加和获取对象的属性

11-魔法函数

12-继承

13-单继承

14-学生信息管理系统(文件版)


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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值