pthon初学之函数模块小练习

函数实现算法思路 :
1. 编程实现 9*9 乘法表 ( 循环嵌套的复习 )
代码:(正向)
for i in range(1,10):
    for j in range (1,10):
        if j <=i:     #第几层打印几个
            result = i*j
            print(' %d*%d=%d' %(j,i,result),end ='') #控制打印完不换行
    print() #控制打印完换行

运行结果:

 代码:(逆向)

for i in range(1,10):
    for j in range (1,10):
        if i <=j:
            sum = i*j
            print(' %d*%d=%d' %(i,j,sum),end ='')
    print()

运行结果:

用函数实现求 100-200 里面所有的素数。
提示 : 素数的特征是除了 1 和其本身能被整除 , 其它数都不能被整除的数
 
代码:
#coding=utf-8
#函数用于判断某一个数是不是素数
def test(num):
    list = [] #定义列表,用于存储计算
    i = num -1#去除本身
    while i > 1:#去除1
        if num%i == 0: #判断是否有余数
            list.append(i)#将所以有的能整除它数加入列表
        i -= 1
    if len(list) == 0:#如果列表为空,就是表示除了1个它本身能整除
        print(num,end=" ")

#此函数用于判断计算出需要判断的所有数字100~200
def test2(star_num,end_num):
    j = star_num
    while j < end_num:
        test(j)
        j += 1

test2(100,200)
print("")

运行结果:

 
3. 请用函数实现一个判断用户输入的年份是否是闰年的程序。
提示 : 能被 4 整除 , 但是不能被 100 整除的年份或者能被 400 整除的年份 .
 
years = int(input("请输入查询的年份: "))
if (years % 4 == 0 and years % 100 != 0) or (years % 400 == 0):
    print(years, "是闰年")
else:
    print(years, "不是闰年")

运行结果:

 
 
4. 用函数实现输入某年某月某日 , 判断这一天是这一年的第几天 ? 闰年情况也考虑进去。
date = input('请输入某年某月某日,格式为yyyy-mm-dd: ')
y = int(date[0:4]) # 获取年份
m= int(date[5:7]) # 获取月份
d = int(date[8:]) # 获取日

ly = False
if (y%4==0 and y%100 !=0) or y%400==0:
        ly = True # 则是闰年
else:
        ly = False

if ly == True: # 若是闰年,则二月为29天
    ms = [31, 29, 31, 30, 31,30, 31, 31, 30, 31, 30, 31]
else:
    ms = [31, 28, 31, 30, 31,30, 31, 31, 30, 31, 30, 31]
days = 0

for i in range(1,13): # 从1到12判断,已确定月份
    if i == m:
        for j in range(i-1): # 确定月份i之后,则将ms列表中的前i-1项相加
           days += ms[j]
        print('%s是该年份的第%s天' % (date, (days +d)))

运行结果:

 
5. 编写“学生管理系统” , 要求如下 :
必须使用自定义函数 , 完成对程序的模块化
学生信息至少包含 : 姓名、年龄、学号 , 除此以外可以适当添加

必须完成的功能:添加、删除、修改、查询、退出

 

import re  # 导入正则表达式模块
import os  # 导入操作系统模块

filename = "students.txt"  # 定义保存学生信息的文件名


def menu():
    # 输出菜单
    print('''
                    学生信息管理系统

        =============== 功能菜单 ===============        

    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                    │
    │   6 统计学生总人数                            │
    │   7 显示所有学生信息                          │
    │   0 退出系统                                 

    ''')


def main():
    ctrl = True  # 标记是否退出系统
    while (ctrl):
        menu()  # 显示菜单
        option = input("请选择:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str)
            if option_int == 0:  # 退出系统
                print('您已退出学生成绩管理系统!')
                ctrl = False
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()


'''1 录入学生信息'''
def insert():
    stdentList = []        # 保存学生信息的列表
    mark = True  # 是否继续添加
    while mark:
        id = input("请输入ID(如 1001):")
        if not id:  # ID为空,跳出循环
            break
        name = input("请输入名字:")
        if not name:  # 名字为空,跳出循环
            break
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入Python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值....重新录入信息")
            continue
        stdent = {"id": id, "name": name, "english": english, "python": python, "c": c}  # 将输入的学生信息保存到字典
        stdentList.append(stdent)  # 将学生字典添加到列表中
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":  # 继续添加
            mark = True
        else:  # 不继续添加
            mark = False
    save(stdentList)  # 将学生信息保存到文件
    print("学生信息录入完毕!!!")


# 将学生信息保存到文件
def save(student):
    try:
        students_txt = open(filename, "a")  # 以追加模式打开
    except Exception as e:
        students_txt = open(filename, "w")  # 文件不存在,创建文件并打开
    for info in student:
        students_txt.write(str(info) + "\n")  # 按行存储,添加换行符
    students_txt.close()  # 关闭文件


'''2 查找学生成绩信息'''
def search():
    mark = True
    student_query = []  # 保存查询结果的学生列表
    while mark:
        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') as file:  # 打开文件
                student = file.readlines()  # 读取全部内容
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id is not "":  # 判断是否按ID查
                        if d['id'] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name is not "":  # 判断是否按姓名查
                        if d['name'] == name:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                show_student(student_query)  # 显示查询结果
                student_query.clear()  # 清空列表
                inputMark = input("是否继续查询?(y/n):")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息...")
            return


'''3 删除学生成绩信息'''


def delete():
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId is not "":  # 判断要删除的学生是否存在
            if os.path.exists(filename):  # 判断文件是否存在
                with open(filename, 'r') as rfile:  # 打开文件
                    student_old = rfile.readlines()  # 读取全部内容
            else:
                student_old = []
            ifdel = False  # 标记是否删除
            if student_old:  # 如果存在学生信息
                with open(filename, 'w') as wfile:  # 以写方式打开文件
                    d = {}  # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))  # 字符串转字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")  # 将一条学生信息写入文件
                        else:
                            ifdel = True  # 标记已经删除
                    if ifdel:
                        print("ID为 %s 的学生信息已经被删除..." % studentId)
                    else:
                        print("没有找到ID为 %s 的学生信息..." % studentId)
            else:  # 不存在学生信息
                print("无学生信息...")
                break  # 退出循环
            show()  # 显示全部学生信息
            inputMark = input("是否继续删除?(y/n):")
            if inputMark == "y":
                mark = True  # 继续删除
            else:
                mark = False  # 退出删除学生信息功能


'''4 修改学生成绩信息'''


def modify():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
        return
    studentid = input("请输入要修改的学生ID:")
    with open(filename, "w") as wfile:  # 以写模式打开文件
        for student in student_old:
            d = dict(eval(student))  # 字符串转字典
            if d["id"] == studentid:  # 是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:  # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名:")
                        d["english"] = int(input("请输入英语成绩:"))
                        d["python"] = int(input("请输入Python成绩:"))
                        d["c"] = int(input("请输入C语言成绩:"))
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break  # 跳出循环
                student = str(d)  # 将字典转换为字符串
                wfile.write(student + "\n")   # 将修改的信息写入到文件
                print("修改成功!")
            else:
                wfile.write(student)  # 将未修改的信息写入到文件
    mark = input("是否继续修改其他学生信息?(y/n):")
    if mark == "y":
        modify()  # 重新执行修改操作


'''5 排序'''


def sort():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as file:  # 打开文件
            student_old = file.readlines()  # 读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))  # 字符串转字典
            student_new.append(d)  # 将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择(0升序;1降序):")
    if ascORdesc == "0":  # 按升序排序
        ascORdescBool = False           # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True          # 标记变量,为True表示降序排序
    else:
        print("您的输入有误,请重新输入!")
        sort()
    mode = input("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    if mode == "1":  # 按英语成绩排序
        student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
    elif mode == "2":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
    elif mode == "0":  # 按总成绩排序
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
    else:
        print("您的输入有误,请重新输入!")
        sort()
    show_student(student_new)  # 显示排序结果


''' 6 统计学生总数'''


def total():
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
            if student_old:
                print("一共有 %d 名学生!" % len(student_old))
            else:
                print("还没有录入学生信息!")
    else:
        print("暂未保存数据信息...")


''' 7 显示所有学生信息 '''


def show():
    student_new = []
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
        for list in student_old:
            student_new.append(eval(list))  # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")



# 将保存在列表中的学生信息显示出来
def show_student(studentList):
    from prettytable import PrettyTable
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \n")
        return
    field_names = ("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩")
    table = PrettyTable(field_names=field_names)
    for info in studentList:
        sum_score = info.get('english', 0) + info.get('python', 0) + info.get('c', 0)
        row = list(info.values())
        row.append(sum_score)
        table.add_row(row)
    print(table)


if __name__ == "__main__":
    main()

运行结果示例:

                    学生信息管理系统

        =============== 功能菜单 ===============        

    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                    │
    │   6 统计学生总人数                            │
    │   7 显示所有学生信息                          │
    │   0 退出系统                                 

    
请选择:1
请输入ID(如 1001):1109
请输入名字:浅浅
请输入英语成绩:98
请输入Python成绩:99
请输入C语言成绩:80
是否继续添加?(y/n):n
学生信息录入完毕!!!

                    学生信息管理系统

        =============== 功能菜单 ===============        

    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                    │
    │   6 统计学生总人数                            │
    │   7 显示所有学生信息                          │
    │   0 退出系统                                 

    
请选择:2
按ID查输入1;按姓名查输入2:2
请输入学生姓名:浅浅
+------+------+----------+------------+-----------+--------+
|  ID  | 名字 | 英语成绩 | Python成绩 | C语言成绩 | 总成绩 |
+------+------+----------+------------+-----------+--------+
| 1109 | 浅浅 |    98    |     99     |     80    |  277   |
+------+------+----------+------------+-----------+--------+
是否继续查询?(y/n):n

                    学生信息管理系统

        =============== 功能菜单 ===============        

    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                    │
    │   6 统计学生总人数                            │
    │   7 显示所有学生信息                          │
    │   0 退出系统                                 

    
请选择:0
您已退出学生成绩管理系统!

下面两道题不会解,后面会进行补充!!!

6.题目需求 : 对于一个十进制的正整数, 定义 f(n) 为其各位数字的平方和,如 :
f(13) = 1**2 + 3**2 = 10
f(207) = 2**2 + 0**2 + 7**2 = 53
下面给出三个正整数 k a, b, 你需要计算有多少个正整数 n 满足 a<=n<=b, k*f(n)=n
输入 : 第一行包含 3 个正整数 k a, b, k>=1, a,b<=10**18, a<=b;
输出: 输出对应的答案 ;
范例 :
输入 : 51 5000 10000
输出 : 3
def func(n):
    res = 0
    while n != 0:
        res += (n % 10) ** 2
        n = n // 10
    return res

k, a, b = input().split() # 运行后,输入51 5000 10000回车运行,只能输入三个数
k, a, b = int(k), int(a), int(b)
num = 0
for n in range(a, b+1):
    if k * func(n) == n:
        num += 1
print(num)

运行结果

 
7.题目描述 : 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。
输入值小于 1000
如,输入为 10, 程序应该输出结果为 2 。(共有两对质数的和为 10, 分别为 (5,5),(3,7)
输入描述 : 输入包括一个整数 n,(3 ≤ n < 1000)
输出描述 : 输出对数
示例 1 :
输入 : 10
输出 : 2
def prime(x):
    for i in range(2, x):
        if x % i == 0:
            return False
        if i == x - 1:
            return True


inp = int(input().strip())
primes = list(filter(prime, range(2, inp)))  # 得到小于输入的所有质数,数字从小到大
low, high = 0, len(primes) - 1
count = 0
# test_list = []          # 如果要查看质数的集合结果,去掉12, 23, 24行的注释
while low <= high:  # 使用双指针从两侧开始搜索
    sum_tmp = primes[low] + primes[high]
    if sum_tmp > inp:  # 如果大于输入,说明偏大,移动high
        high -= 1
    elif sum_tmp < inp:  # 如果小于输入,说明偏小,移动low
        low += 1
    else:
        count += 1
        high -= 1
        low += 1
    # test_list.append([primes[low], primes[high]])
# print(test_list)
print(count)

运行结果:

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值