百木园-与人分享,
就是让自己快乐。

Python程序语言学习——实验作业04——函数的应用

目录

  • 实验1
    • 1. 题目描述
    • 2.代码实现:
  • 实验2
    • 1. 题目描述
    • 2.代码实现:
  • 实验3
    • 1. 题目描述
    • 2.代码实现:
  • 实验4
    • 1. 题目描述
    • 2.代码实现:
  • 总结
    • 1、自定义函数实现输出所有水仙花数。
    • 2、自定义函数实现回文数的判断
    • 3、自定义函数实现判断三个数是否能构成三角形三条边
    • 4、使用turtle模块和time模块实现七段数码管绘制当前日期。

简要记录下本次实验作业的内容和总结。

实验1

1. 题目描述

实验1. 利用自定义函数求所有水仙花数,并用逗号隔开输出。
所谓水仙花数是一个三位数,其每位上的数字的立方和等于其本身,
如153=13+53+3^3 故153是水仙花数。

2.代码实现:

def flowerNumer(n):
    n1 = sum(int(i) ** 3 for i in list(n))
    return n if (int(n) == n1) else 0


if __name__ == \'__main__\':
    num_list = [str(i) for i in range(100, 1000) if flowerNumer(str(i))]
    print(\"所有的水仙花数有:\" + \',\'.join(num_list))

实验2

1. 题目描述

实验2. 回文数判断。
设n是一任意自然数,如果n的各位数字反向排列所得自然数与n相等,则n被称为回文数。
从键盘输入一个5位数字,请编写程序判断这个数是不是回文数。
如:123454321和9889就是回文数。

2.代码实现:

import sys


def palindrome_num(n):
    # reversed()返回的是一个对象,需转换成序列
    n1 = \'\'.join(reversed(n))
    s = \"是回文数\" if str(n) == n1 else \"不是回文数\"
    # n1 = list(reversed(n))
    # s = \"是回文数\" if list(n) == n1 else \"不是回文数\"
    # n1 = tuple(reversed(n))
    # s = \"是回文数\" if tuple(n)==n1 else \"不是回文数\"
    print(n + s)


def isValid(msg):
    # 若输入的不是整数或者不是5位数  # 输出:“输入不合法!”,并不返回任何值
    # 法二:
    # return 1 if msg.isnumeric() and len(msg) == 5 else \"输入不合法!\"
    if msg.isnumeric() and len(msg) == 5:
        return 1
    else:  # 若输入的不是整数或者不是5位数
        print(\"输入不合法!\")  # 输出:“输入不合法!”,并不返回任何值


if __name__ == \'__main__\':
    while True:
        num = input(\"请输入一个5位数:\")
        if num == \'0\':
            sys.exit()
        if isValid(num) is None: # 若返回值为None,即输入不合法,重新输入
            continue
        else:  # 否则调用palindrome_num()判断num是否是回文数
            palindrome_num(num)
        #  法二:
        # if isValid(num) == 1:
        #     palindrome_num(num)
        # else:
        #     print(isValid(num))
        #     continue

实验3

1. 题目描述

实验3. 三角形判断。
编写函数判断输入的3个数字是否能构成三角形的3条边。

2.代码实现:

import sys


def isTriangle(num_t):
    a, b, c = num_t
    if ((a + b) > c) and ((a + c) > b) and ((b + c) > a):
        print(\"{},{},{} 可以构成一个三角形\".format(a, b, c))
    else:
        print(\"{},{},{} 不可以构成一个三角形\".format(a, b, c))


def isValid(n):
    try:
        a, b, c = n.split()
        a = float(a)
        b = float(b)
        c = float(c)
        if a > 0 and b > 0 and c > 0:
            return a, b, c  # 以元组的形式返回三边的值
        else:
            # 若a,b,c任意一个值小于零,不返回任何值
            print(\"输入不合法!\")
    except ValueError:
        # 若a,b,c任意一个值不是整数或小数,不返回任何值
        print(\"输入不合法!\")


if __name__ == \'__main__\':
    while True:
        num = input(\"请输入三个数,以空格分隔:\")
        if num == \'\':
            # 当不输入任何字符时,退出程序
            sys.exit(\'\\n退出程序\')
        if isValid(num) is None:
            # isValid()无返回值,即输入不合法,继续执行
            continue
        else:
            # 否则 将返回值传入isTriangle()
            isTriangle(isValid(num))

实验4

1. 题目描述

实验4. 七段数码管绘制:通过绘制七段数码管理解使用函数及其封装的价值。

2.代码实现:

import time
from turtle import *


def drawGap():  # 绘制数码管间隔
    penup()  # 提起笔移动,不绘制图形,用于另起一个地方绘制
    fd(5)  # 向当前画笔方向移动 5 像素长度


def drawLine(draw):  # 绘制单段数码管
    drawGap()  # 调用drawGap() ,绘制间隔
    # turtle.pendown() 移动时绘制图形,缺省时也为绘制
    pendown() if draw else penup() # draw不为0绘制图形,否则另起一个地方
    fd(40)  # 画笔向当前方向绘制40像素长的线条
    drawGap()  # 调用drawGap(),绘制间隔
    right(90)  # 顺时针移动90°


def drawDigit(d):  # 根据数字规制七段数码管
    drawLine(True) if d in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if d in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if d in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if d in [0, 2, 6, 8] else drawLine(False)
    left(90)  # 逆时针移动90°
    drawLine(True) if d in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if d in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if d in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    left(180)  # 逆时针移动180°
    penup()  # 画笔另起一个新的点
    fd(20)  # 沿当前方向移动20像素


def drawDate(date):
    pencolor(\'light coral\')  # 设置画笔的颜色为淡珊瑚色,默认初始值为黑色
    for i in date:
        if not i.isnumeric():
            sety(-50)
            pencolor(\'wheat\')
            if i == \'-\':
                write(\'年\', font = (\'微软雅黑\', 24, \'normal\'))
                pencolor(\'lightblue\')  # 设置画笔的颜色为“lightblue”
                fd(45)
            elif i == \'=\':
                write(\'月\', font = (\'微软雅黑\', 24, \'normal\'))
                pencolor(\'lightpink\')  # 设置画笔的颜色为“lightpink”
            elif i == \'+\':
                write(\'日\', font = (\'微软雅黑\', 24, \'normal\'))
        else:
            drawDigit(eval(i))
        sety(0)


if __name__ == \'__main__\':
    # 坐标位置(200,200)处绘制一个大小为 800*350像素的画布
    setup(800, 350, 200, 200) 
    screensize(bg = \'lightyellow\')
    penup()  # 开始绘制
    hideturtle()  # 绘制完日期,隐藏画笔的turtle形状
    speed(\'fastest\')
    fd(-350)
    pensize(5)  # 定义画笔的大小为 5
    # 使用strftime 方法将 gmtime() 获取的当前的日期以“%Y-%m=%d+”的格式赋值给变量a
    a = time.strftime(\"%Y-%m=%d+\", time.gmtime())
    drawDate(a)  # 调用自定义函数 drawDate()
    done()  # 必须是图形绘制程序的最后一个语句

总结

1、自定义函数实现输出所有水仙花数。

自定义函数floweNumber(),传入参数为n,用sum()中嵌套元组生成式求各个位数上的数字立方和n1。当满足原数n == n1时,返回n,否则返回0。

在主函数中,调用自定义函数floweNumber(),传入参数i的范围在[100,1000)内。若返回值不为0,将数字i添加到列表num_list中。最后用’,’jion(num_list)将所有水仙花数以英文逗号分隔输出。

注意:传入参数i需转换成字符串,以便在floweNumber() 中可以使用sum()中嵌套元组生成式的方式逐个计算每位数的立方和,最后添加到列表时也需要将i转换成字符串,因为join()的参数必须是Iterable的,数字不是Iterable的。

2、自定义函数实现回文数的判断

因为需要输入,所以自定义一个对输入值合法的判断的函数 isValid()。根据题目要求,必须是5位数的数字,那么输入值不能是非整数,且长度为5。

定义一个用于判断是否是回文数的函数palindrome_num(),用reversed()反转传入参数n,并赋值给新的变量n1。由于reversed()返回的是一个对象,需转换成序列,我用join()将其转换成字符串。然后比较str(n) == n1,若相等,字符型s = \"是回文数\",否则s = \"不是回文数\",最终输出 n+s的结果。即传入值是否是回文数。

在主函数中调用isValid()将输入值num作为参数传入,若满足要求,即是5长度为5的整数,返回1,否则输出“输入不合法!”并且不返回任何值。若判断调用isValid()的值若为None,结束当前循环,重新执行;否则调用自定义函数palindrome_num(),传入num。

3、自定义函数实现判断三个数是否能构成三角形三条边

变量num获取控制台输入的三个数,以空格间隔。定义一个判断输入值合法的函数isValid(),num作为参数传入,变量a,b,c分别对应输入的三个数,并将三个数转换成float类型,(input()获取的是一个字符串)。判断a,b,c是否都大于0,是则以元组形式返回三个数,否则输出“输入不合法!”并不返回值。在进行前面的操作时,可能会出现因为a,b,c任意一个值不是整数或小数,或者控制台输入的数据不是3个的情况,需要获取try: except获取ValueError异常,输出提示“输入不合法!”并不返回任何值。

在主函数中,首先要对num进行判断是否为空,若为空则退出程序。然后判断调用isValid()函数的返回值是否为None,若是,即输入不合法,终止本次循环,重新执行;否则调用isTriangle() 判断是三个数否能构成三角形。如果输入合法,isValid()返回的是三个数的元组,将返回值传入isTriangle()中,再用变量a,b,c分别获取元组中的三个数,判断是否满足任意两个数之和都大于第三个数,并输出相应的结论。

4、使用turtle模块和time模块实现七段数码管绘制当前日期。

由于源码是老师提供的,我对源码稍微进行了一点个性化的修改。主要是对其中的一些函数方法进行了学习。接下来,我就在该功能中学习到的新的知识进行一个简单的总结。

参考资料:Python绘图Turtle库详解_知行流浪的博客-CSDN博客_python turtle

属性 描述
turtle.setup(width = 0.5,height = 0.75[,startx = None,starty = None]) width,height为整数时,表示像素;为小数时,表示占据电脑屏幕的比例
(startx,starty)表示矩形窗口左上角顶点的位置,如果为空,则窗口位于屏幕中心。
turtle.penup() 提起笔移动,不绘制图形,用于另起一个地方绘制
turtle.pendown() 移动时绘制图形,缺省时也为绘制
turtle.hideturtle() 隐藏画笔的turtle形状
turtle.forward(distance) 向当前画笔方向移动distance像素长度(或写成fd)
turtle.backward(distance) 向当前画笔相反方向移动distance像素长度
turtle.right(degree) 顺时针移动degree°
turtle.left(degree) 逆时针移动degree°
turtle.sety() 将当前y轴移动到指定位置
turtle.write(s [,font=(\"font-name\",font_size,\"font_type\")]) 写文本,s为文本内容,font是字体的参数,font为可选项,font参数也是可选项
pencolor() 无参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如\"green\", \"red\",也可以是RGB 3元组。
turtle.pensize(size) 设置画笔大小为size个像素
turtle.speed(speed) 设置画笔移动速度,在整数[0,10]内,值越大速度越快
turtle.mainloop() 或
turtle.done()
启动事件循环 -调用Tkinter的mainloop函数。
必须是乌龟图形程序中的最后一个语句。

本文来自博客园,作者:{阿银呀},转载请注明原文链接:https://www.cnblogs.com/XSem/p/16154253.html


来源:https://www.cnblogs.com/XSem/p/16154253.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Python程序语言学习——实验作业04——函数的应用

相关推荐

  • 暂无文章