python学习-学生成绩管理+图片转字符画

基础知识

一、python与c语言的区别:

  • C语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速度快;Python是一种脚本语言,Python是直接run,执行速度较慢
  • C语言是面向过程的语言,很多时候都需要自己手动实现函数来完成某一功能;Python中引入了类和对象,是面向对象编程的语言
  • C语言中需要事先定义变量类型;Python不需要事先定义变量类型
  • 在Python中没有自加和自减运算符,在逻辑运算符上,Python中是and,or,not ,而C语言中则是&&,||,!
  • C语言如果要调用函数,该函数需要在本次调用之前就需要被实现,或者在程序开头事先声明;Python中则没有这个限制

二、python基础

数据类型:

  • Number(数字)(int、float、bool、complex(复数),+、-、*、/ 得到浮点数、//得到整数、**乘方)
  • String(字符串)(字符串用单引号 ’ 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符,字符串前面添加一个 r,表示原始字符串,让反斜杠不发生转义,字符串不能改变)
  • List(列表)([ ],可变)
  • Tuple(元组) (( ),不可变,可以包含可变的对象,比如list列表)
  • Dictionary(字典)( { } 标识,它是一个无序的 键(key) : 值(value) 的集合,字典当中的元素是通过键来存取的,而不是通过偏移存取,key须为不可变类型、且唯一)
  • Set(集合)(使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典)
列表语法 描述
list.append(obj) 在列表末尾添加新的对象
list.count(obj) 统计某个元素在列表中出现的次数
list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj) 将对象插入列表
list.pop(index) 移除列表中的index位置一个元素,并且返回该元素的值
list.remove(obj) 移除列表中某个值的第一个匹配项
list.reverse() 反向列表中元素
list.sort( key=None, reverse=False) 对原列表进行排序
list.clear() 清空列表
list.copy() 复制列表
len(list) 列表元素个数
del 删除列表中元素
sorted(iterable, key=None, reverse=False) iterable – 可迭代对象,key – 主要是用来进行比较的元素,reverse = True 降序 , reverse = False 升序

python 使用 lambda 来创建匿名函数:
lambda [arg1 [,arg2,…argn]]:expression
如 lambda x:x+1相当于

 def g(x):
     return x+1

格式化字符串的函数 str.format(),通过 {} 和 : 来代替以前的 %

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'

文件处理:
在 Windows 上,路径书写使用倒斜杠(\)作为文件夹之间的分隔符。但在 OS X 和Linux 上,使用正斜杠作为它们的路径分隔符。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
python学习-学生成绩管理+图片转字符画_第1张图片
常规方法:

file_name = 'text.txt'  # 文件名
try:
    file = open(file_name, 'r')  
    # print(file.read())  # 打印读取内容
except OSError:
    print('打开失败')
finally:
    file.close()   #文件关闭
    

使用with as 自动管理:

file_name = 'te1xt.txt'  # 文件名
 
with open(file_name, 'r') as f:  # 使用结束后  自动释放资源  不用使用close  
    print(f.read())

安装库,如PIL:

pip install pillow

if name == ‘main’: 下的代码只有在该文件作为脚本直接执行才会被执行,而 import 到其他脚本中是不会被执行的

三、学生成绩管理系统代码

"""
学生成绩管理系统:
 1=录入学生     2=显示信息
 3=排序总评     4=查找学生
 5=插入学生     6=删除学生
 7=统计人数     0=退出
"""


from itertools import groupby

# 定义一个列表,用来存储多个学生的信息
students=[]

stu_print="ID:{}\tmath:{}\tproject:{}\tsum:{}"

def Menu():
    print("          =================================================\n")
    print("          =              欢迎使用成绩管理系统             =\n")
    print("          =           1=录入学生     2=显示信息           =\n")
    print("          =           3=排序总评     4=查找学生           =\n")
    print("          =           5=修改信息     6=删除学生           =\n")
    print("          =           7=统计人数     0=退出               =\n")
    print("          =================================================\n")
    print("请选择:")

def GradeInput():
        while 1:
            ID=input("请输入学生的学号:")
            stumath=int(input("请输入学生的数学成绩:"))
            stuproject=int(input("请输入学生的程序设计成绩:"))
            stusum = stuproject + stumath
            students.append([ID,stumath,stuproject,stusum])
            str=input("继续输入学生数据 请按y:")
            if (str == 'y'):
                continue
            else:
                break


def Gradeoutput():
    print("成绩信息如下:\n")
    for info in students:
        print(stu_print.format(*info)) # 列表解包

def Order():
    temp_list=[]
    temp_list=sorted(students,key=lambda student: student[3], reverse=True) # 按总分降序排序
    for info in temp_list:
        print(stu_print.format(*info))

def Stusearch():
    while 1:
        inID=input("请输入您要查找的学号:")
        for temp in students:
            if inID in temp:
                print("查找到学生")
                print(stu_print.format(*temp))
                break
        else:
            print("没有该学生信息")
        # print("继续查找请按y:")
        str = input("继续输入学生数据 请按y:")
        if str == 'y':
            continue
        else:
            break

def StuDelete():
    while 1:
        delID=input("请输入您要删除的学生学号:")
        for temp in students:
            if delID in temp:
                str = input("是否删除?y/n")
                if str == 'y':
                    print("删除完成\n")
                    students.pop(students.index(temp))
                    break # 跳出for循环
        else:
            print("没有该学生信息")
        str = input("继续删除其他学生请按y:")
        if str == 'y':
            continue # 继续while循环
        else:
            break # 跳出while循环

def Reverse():
    index=None
    while 1:
        reID = input("请输入您要修改的学生学号:")
        for temp in students:
            if reID in temp:
                str = input("是否修改?y/n")
                if str == 'y':
                    index=students.index(temp)
                    stumath = int(input("请输入学生的数学成绩:"))
                    stuproject = int(input("请输入学生的程序设计成绩:"))
                    stusum = stuproject + stumath
                    students[index][1:]=[stumath,stuproject,stusum] # 切片 修改
                    print("修改完成\n")
                    break  # 跳出for循环
        else:
            print("没有该学生信息")
        str = input("继续修改其他学生请按y:")
        if str == 'y':
            continue  # 继续while循环
        else:
            break  # 跳出while循环

def Statis():
    k=len(students)
    num1=0
    num2=0
    num3=0
    num4=0
    num5=0
    for i in range(k):
        if students[i][3]/2<60:
            num1=num1+1
        elif students[i][3]/2>=60 and students[i][3]/2<70:
            num2=num2+1
        elif students[i][3]/2>=70 and students[i][3]/2<80:
            num3=num3+1
        elif students[i][3]/2>=80 and students[i][3]/2<90:
            num4=num4+1
        elif students[i][3]/2>=90 and students[i][3]/2<=100:
            num5=num5+1
    # print("成绩区间\t100~90\t89~80\t79~70\t69~60\t<60\n")
    print('平均成绩:<60\t%d人\t69~60\t%d人\t79~70\t%d人\t89~80\t%d人\t100~90\t%d人\n' %(num1,num2,num3,num4,num5))

def main():
    # in_data=input("选择: \n")
    Menu()
    while 1:
        a=int(input("选择: \n"))
        if a == 1:
            print("您选择了1=录入学生")
            GradeInput()
            Menu()

        elif a == 2:

            print("您选择了2=显示信息")
            Gradeoutput()
            Menu()

        elif a == 3:
            print("您选择了3=排序总评")
            Order()
            Menu()

        elif a == 4:
            print("您选择了4=查找学生")
            Stusearch()
            Menu()

        elif a == 5:
            print("您选择了5=修改信息")
            Reverse()
            Menu()

        elif a == 6:
            print("您选择了6=删除学生")
            StuDelete()
            Menu()

        elif a == 7:

            print("您选择了7=统计人数\n")

            Statis()
            Menu()

        elif a == 0:
            print("退出成功!")
            break

        else:
            print("输入非法,请重新输入!")
            Menu()

if __name__=="__main__":
    main()

四、图片转字符画代码

from PIL import Image # PIL 是一个 Python 图像处理库

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 是我们的字符画所使用的字符集,一共有 70 个字符,字符的种类与数量可以自己根据字符画的效果反复调试的

WIDTH = 60 # 字符画的宽
HEIGHT = 45 # 字符画的高


# 将256灰度映射到70个字符上,也就是RGB值转字符的函数:
def get_char(r, g, b, alpha=256):  # alpha透明度
   if alpha == 0:
       return ' '
   length = len(ascii_char)
   gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)  # 计算灰度
   unit = (256.0 + 1) / length
   return ascii_char[int(gray / unit)]  # 不同的灰度对应着不同的字符
   # 通过灰度来区分色块


if __name__ == '__main__':
   img = 'D:/python_file/test2/temp.png' # 图片所在位置
   im = Image.open(img)
   im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
   txt = ""
   for i in range(HEIGHT):
       for j in range(WIDTH):
           txt += get_char(*im.getpixel((j, i))) # im.getpixel返回给定位置的像素值(r g b)。如果图像为多通道,则返回一个元组。获得相应的字符
       txt += '\n'
   print(txt)  # 打印出字符画
   # 将字符画 写入文件中
   with open("D:/python_file/test2/output.txt", 'w') as f:
       f.write(txt)
       

你可能感兴趣的:(python学习-学生成绩管理+图片转字符画)