Python入门(二)

发布于:2022-11-02 ⋅ 阅读:(602) ⋅ 点赞:(0)

十二、Python特殊方法和特殊属性

12.1 特殊方法

在这里插入图片描述

# yifan  Python
class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age
#创建C类的对象
x=C('Jack',20)  #x是C类型的一个实例对象
print(x.__dict__)   #实例对象的属性字典
#{'name': 'Jack', 'age': 20}
print(C.__dict__) #C类型的属性
#{'__module__': '__main__', '__init__': <function C.__init__ at 0x00000186B2BC5000>, '__doc__': None}
print('----------------------------')
print(x.__class__)#输出对象所属类
#<class '__main__.C'>
##############查看继承那个类及哪些类##########################
print(C.__bases__)#C类的父类类型的元素
#(<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__)#继承类
<class '__main__.A'>
print(C.__mro__)    #类的层次结构
#(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
# yifan  Python
#特殊方法
a=20
b=100
c=a+b #两个类型的相加操作
d=a.__add__(b) #__add__()相加函数的操作

print(c)
print(d)
#120
#120
class Student:
    def __init__(self,name):
        self.name=name

    def __add__(self, other):##################  实现字符串加法运算的方法
        return self.name+other.name

    def __len__(self):
        return len(self.name)
stu1=Student('Jack')############################
stu2=Student('李四')#################################

s=stu1.__add__(stu2)
print(s)


print('------------------------------')
lst=[11,22,33,44]
print(len(lst))#len是内容函数 计算长度
print(lst.__len__()) #需要编写__len函数__

s=stu1+stu2
print(s)
 #   def __add__(self, other):

调用
在这里插入图片描述
传参
在这里插入图片描述

12.2 类的浅拷贝与深拷贝

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.3 模块

在这里插入图片描述
在这里插入图片描述

# yifan  Python
############################模块的使用
import math #关于数学运算math模块
print(id(math))
print(type(math))
#2074877932336
#<class 'module'>
print(math)
print(math.pi)  #
#<module 'math' (built-in)>
#3.141592653589793
print('-------------------------------------------')
print(dir(math))#查看math模块的变量
print(math)
#['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
#<module 'math' (built-in)>

print(math.pow(2,3),type(math.pow(2,3)))  #math.pow()函数  次方函数
print(math.ceil(9.001))#
print(math.floor(9.999))
#8.0 <class 'float'>
#10
#9

在这里插入图片描述
在这里插入图片描述

12.4 以主程序运行

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

12.5 Python中的包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.6 Python中常用的内置模块

在这里插入图片描述

# yifan  Python
#Python 常用标准库
import sys
import time
import urllib.request
print(sys.getsizeof(24))
print(sys.getsizeof(45))
print(sys.getsizeof(True))
print(sys.getsizeof(False))
print(time.time())
#28
#28
#28
#24
#1666708043.7710903
print('---------------------------------')
print(time.localtime(time.time()))
#time.struct_time(tm_year=2022, tm_mon=10, tm_mday=25, tm_hour=22, tm_min=27, tm_sec=58, tm_wday=1, tm_yday=298, tm_isdst=0)

#爬虫库
print(urllib.request.urlopen('http://www.baidu.com').read())

12.7 第三方模块的安装及使用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

十三、系统文件

13.1 编码格式

在这里插入图片描述
在这里插入图片描述

13.2 文件的读写原理

在这里插入图片描述
在这里插入图片描述

#encoding=gbk
file=open('a.txt','r')
print(file.readlines())
file.close()

13.3 常用文件的打开模式

在这里插入图片描述

# yifan  Python
# ‘w’
file=open('a.txt','w')#如果有a.txt文件则覆盖文本,如果没有a.txt文件则创建
file.write('中国11')
file.close()


# yifan  Python
'a'
file=open('a.txt','a') #在原有文本后面追加
file.write('中国11追加')
file.close()
#中国11中国11追加

#'rb'
src_file =open('logo.png','rb')#必须有这个png文件
target_file=open('copylogo.png','wb')

target_file.write(src_file.read())#边读边写操作

target_file.close()
src_file.close()

在这里插入图片描述


#file=open('a.txt','r')
#file=open('c.txt','a')#追加
file=open('d.txt','a')#flush 把缓冲区内容文本文件

#读
#print(file.read(2))
#print(file.readline())
#print(file.readlines())

#写
#file.write('hello')
#lst=['java','go','python']
#file.writelines(lst)
#file.close()

#指针
file=open('a.txt','r')  #a.txt 中内容中国/n  魅力。两个字节指向第二个字
file.seek(2)
print(file.read())
print(file.tell())#tell() 返回指针的当前位置
file.close()
#国#汉字一个字两个字节
#魅力
#29

#缓冲区文件写入文件
file=open('d.txt','a')
file.write('1111111111hello')
file.flush() #
file.write('world')
file.close()
#
#helloworldhelloworld1111111111helloworld

13.4 没懂with语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.5 OS模块

在这里插入图片描述

# yifan  Python

#OS模块与操作系统相关的一个模块
import os
#os.system('notepad.exe')#打开记事本
os.system('calc.exe')#打开计算器

#直接调用可执行文件
os.startfile('D:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')

13.6 OS模块操作的相关函数

在这里插入图片描述

# yifan  Python
import os
#print(os.getcwd())#获取当前工作路径
#F:\PycharmProjects\pythonTest

lst=os.listdir('./venv')
#print(lst)#获取指定路径下的文件和目录信息
#['.gitignore', 'demo3.py', 'Lib', 'pyvenv.cfg', 'Scripts']

#os.mkdir('newdir11111111')#创建目录
#os.makedirs('A/B/C')#连续创建多级目录A-B--C

#os.rmdir('newdir11111111')#删除目录
#os.removedirs('A/B/C')#删除多级目录
os.chdir('F:\PycharmProjects\pythonTest')#将path设置为当前目录

13.7 OS.path模块

在这里插入图片描述

# yifan  Python
import os.path
print(os.path.abspath('OS模块.py'))
print(os.path.exists('多态的实现.py'),os.path.exists('ss'))
print(os.path.join('F:\PycharmProjects','OS模块.py'))
print(os.path.split('F:\PycharmProjects\pythonTest\OS模块.py'))#分割目录与文件名
print(os.path.splitext('OS模块.py')) #分割文件名与后缀
print('----------------------------------------')
print(os.path.basename('F:\PycharmProjects\pythonTest\OS模块.py'))#提取文件名
print(os.path.dirname('F:\PycharmProjects\pythonTest\OS模块.py'))#提取路径
print(os.path.isdir('F:\PycharmProjects\pythonTest\OS模块.py'))#判断是否为路径

#F:\PycharmProjects\pythonTest\OS模块.py
#F:\PycharmProjects\OS模块.py
#('F:\\PycharmProjects\\pythonTest', 'OS模块.py')
#('OS模块', '.py')
#----------------------------------------
#OS模块.py
#F:\PycharmProjects\pythonTest
#False
# yifan  Python
#列出指定目录下的所有py文件
import os
path=os.getcwd()
print(path)
print('------------------')
lst=os.listdir(path)
for filename in lst:
    if filename.endswith('.py'):#emdswith()  以py结尾的文件
        print(filename)
# yifan  Python
import os
path=os.getcwd()
lst_files=os.walk(path)
print(lst_files)
#<generator object _walk at 0x00000251626F9930>
print('---------------------')
for dirpath,dirname,filename in lst_files:
    print(dirpath)
    print(dirname)
    print(filename)

在这里插入图片描述

在这里插入图片描述

十四、Python程序的打包

14.1 打包程序

win10系统
运行cmd
如果报错 不是内部程序

解决方法

此电脑->属性->高级系统设置->环境变量;添加下面两条路径;
一条python安装路径 一条PIP文件路径
在这里插入图片描述

14.2 win10 CMD打包指令

找到要打包程序的文件路径
在这里插入图片描述
在CMD中执行
pyinstaller -F F:\PycharmProjects\Studentsys\Student\Student.py

在这里插入图片描述

14.3 学生信息管理系统实战案例

# yifan  Python
import os
filename='student.txt'

def main():
    while True:
        menum()
        choice=int(input('请选择:'))
        if choice in [0,1,2,3,4,5,6,7]:
            if choice==0:
                answer=input('你确定要退出系统吗?y/n')
                if answer=='y' or answer=='Y':
                    print('谢谢你的使用')
                    break
                else:
                    continue
            elif 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 menum():
    print('=====================学生管理系统=======================')
    print('----------------------功能菜单-------------------------')
    print('\t\t\t\t\t\t1.录入学生信息')
    print('\t\t\t\t\t\t2.查找学生信息')
    print('\t\t\t\t\t\t3.删除学生信息')
    print('\t\t\t\t\t\t4.修改学生信息')
    print('\t\t\t\t\t\t5.排序学生信息')
    print('\t\t\t\t\t\t6.统计学生总人数')
    print('\t\t\t\t\t\t7.显示所有学生信息')
    print('\t\t\t\t\t\t0.退出系统')
    print('-------------------------------------------------------')


def insert():
    student_list=[]#要存储录入的学生
    while True:
        id=input('请输入ID(如1001):')
        if not id:
            break
        name=input('请输入你的名字:')
        if not name:
            break
        try:
            englist=int(input('请输入你的english成绩:'))
            python=int(input('请输入Python成绩:'))
            java=int(input('请输入Java成绩:'))
        except:#异常捕获
            print('输入无效,不是整数类型,请重新输入')
            continue  #跳出本次循环
        #将录入的学生信心保存到字典中
        student={'id':id,'name':name,'englist':englist,'Python':python,'Java':java}
        #将学生信息添加到列表中
        student_list.append(student)#把字典student信息,添加到列表student_list

        answer=input('请问是否添加?y/Y')
        if answer=='y' or answer=='Y':
            continue
        else:
            break

        #保存学生信息,调用save()函数
    save(student_list)
    print('学生信息录入完毕!!!')
def save(lst):
    try: #有文件的情况下
        stu_txt=open(filename,'a',encoding='utf-8')#打开文件filename并'a',追加,使用utf8编码格式
    except:#没有的情况下
        stu_txt=open(filename,'w',encoding='utd-8')
    for item in lst:#遍历字符串并写入stu_txt文件
        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!='':
                        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\n')
            if answer=='y':
                continue
            else:
                break
        else:
            print('没有这个学生信息')
            return

def 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{:^10}\t{:^10}\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('englist'))+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()#把ID存在的这个学生信息写入student_old
            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))#将字符串转换成字典,并赋给d
                        if d['id']!=student_id:#ID与遍历的列表不相等
                            wfile.write(str(d)+'\n')#将一条学生信息写入文件
                        else:
                            flag=True#否则标记删除
                    if flag:
                        print(f'id为{student_id}的学生信息已经被删除')
                    else:
                        print(f'没有找到ID为{student_id}的学生信息')
            else:
                print('无学生信息')
                break
            show()  #删除之后要重新显示所有学生信息
            answer=input('是否继续删除?y/n\n')
            if answer=='y':
                continue
            else:
                break

def modify():#修改学生信息
    show()#读取所有学生信息
    if os.path.exists(filename):#判断要修改该的文件信息是否存在
        with open(filename,'r',encoding='utf-8') as rfile:
            student_old=rfile.readlines()#文件信息整行写入student_old
    else:
        return
    student_id=input('请输入要修改学院的ID:')
    with open(filename,'w',encoding='utf-8') as wfile:
        for item in student_old:#遍历文件信息
            d=dict(eval(item))#以字典的形式输出#evel()返回字符串表达式
            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:
                        break
                wfile.write(str(d)+'\n')
                print('修改成功!!!')
            else:
                wfile.write(str(d)+'\n')#否则写入源文件

        answer=input('是否继续修改其他学生信息?y/n\n')#修改完成后是否继续修改其他
        if 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:
        return
    asc_or_desc=input('请选择(0.升序 1.降序):')
    if asc_or_desc=='0':#判断降序升序
        asc_or_desc_bool=False
    elif asc_or_desc=='1':
        asc_or_desc_bool=True
    else:
        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)
    if mode=='2':
        student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)
    if mode=='3':
        student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)
    if 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('还没有录入学生信息')
    else:
        print('没有录入信息')

def show():#显示所有学生信息
    student_lst=[]
    if os.path.exists(filename):
        with open(filename,'r',encoding='utf-8') as rfile:
            students=rfile.readlines()
            for item in students:
                student_lst.append(eval(item))
            if student_lst:
                show_student(student_lst)
    else:
        print('暂未保存数据')

if __name__=='__main__':
    main()

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到