【Python程序设计】函数与模块

Problem 1:

编写以下两个函数:

  1. 检查一个整数是否是一个质数:isPrime(number)
  2. 输出前 N 个质数:printPrimeNumbers(N) ,将输出结果写入文件,命名
    为 FirstN_Prime_Numbers.txt,N 应为相应的数字。

1.定义素数判断函数
从2到number - 1,判断是否可以整除

1.def isPrime(number):  
2. x = number  
3. for i in range(2, number):  
4.     if x % i == 0:  
5.         return False  
6. return True 

2.文件读写
为数据集创建文件夹,首先判断文件夹是否存在,如果不存在则调用os.makedirs创建文件夹。

1.if os.path.exists('./problem1_data') == False:  
2.    os.makedirs('./problem1_data')   

打开文件,为写入做准备(如果文件不存在,会自动创建)

1.f = open("./problem1_data/First"+str(N)+"_Prime_Numbers.txt", mode="w")   
利用循环语句判断质数,直到输出满N个数字。
1.while True:  
2.  if cnt >= N:  
3.     break  
4. if isPrime(i):  
5.     f.write(str(i)+' ')  
6.     cnt += 1  
7. i += 1  

其中文件写入函数为

1.f.write(str(i)+' ')  

代码:

import os

def isPrime(number):
    x = number
    for i in range(2, number):
        if x % i == 0:
            return False
    return True
def printPrimeNumbers(N):
    cnt = 0
    i = 2
    if os.path.exists('./problem1_data') == False:
        os.makedirs('./problem1_data')
    f = open("./problem1_data/First"+str(N)+"_Prime_Numbers.txt", mode="w")
    while True:
        if cnt >= N:
            break
        if isPrime(i):
            f.write(str(i)+' ')
            cnt += 1
        i += 1
    f.write('\n')
    f.close()
if __name__ == '__main__':
    N = int(input("请输入一个整数:"))
    if isPrime(N):
        print("这是一个质数")
    else:
        print("这是一个合数")
    N = int(input("打印前N个质数:"))
    printPrimeNumbers(N)

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

Problem 2:

emirp数是一种特殊的质数,它反向书写时也是一个质数。例如,17和71都是质数,所以17和71都是emirp数。编写一个函数emirp(N),输出前N个emirp数到文件中,每行最多显示10个数字,如下所示。文件命名为FirstN_Emirp_Numbers.txt,N应为相应的数字。

  1. 素数判断判断函数与文件创建与Problem1相同,不再展示

  2. 差别在于文件写入的判断。
    其中将数字以字符串形式储存,反转可以利用切片并以-1为间隔。
    在判断时,将字符串转换为int类型,进行素数判断。
    数字10个换行的方法时根据输出计数器是否是10的倍数进行判断。

1. while True:  
2.    num = str(i)  
3.    if cnt >= N:  
4.        break  
5.    if isPrime(num) and isPrime(num[::-1]):  
6.        f.write(num + ' ')  
7.        cnt += 1  
8.        if cnt % 10 == 0:  
9.            f.write('\n')  
10.    i += 1  
11.f.close() 

代码:

import os

def isPrime(number):
    x = int(number)
    for i in range(2, int(number)):
        if x % i == 0:
            return False
return True

def printEmirpNumbers(N):
    cnt = 0
    i = 10
    if os.path.exists('./problem2_data') == False:
        os.makedirs('./problem2_data')
    f = open("./problem2_data/First"+str(N)+"_Emirp_Numbers.txt", mode="w")
    while True:
        num = str(i)
        if cnt >= N:
            break
        if isPrime(num) and isPrime(num[::-1]):
            f.write(num + ' ')
            cnt += 1
            if cnt % 10 == 0:
                f.write('\n')
        i += 1
f.close()

if __name__ == '__main__':
    N = int(input("打印前N个emirp数:"))
    printEmirpNumbers(N)

在这里插入图片描述

Problem 3:

近似平方根:有几种方法可以实现 Python math 模块中的 sqrt 函数,其中一种方法被称为巴比伦函数法。它使用以下公式,不断逼近一个数 n 的平方根nextGuess=(lastGuess+(n/lastGuess))/2当 nextGuess 和 lastGuess 几乎相同时,nextGuess 就是近似平方根。初始猜测,即 lastGuess 的起始值,可以是任何正值(例如 1)。如果 nextGuess 和 lastGuess小于一个非常小的数字,例如 0.0001,那么可以说 nextGuess 是 n 的近似平方根, 如果不是,则 nextGuess 变为 lastGuess,近似过程继续。根据以上方法,实现返
回 n 的平方根的函数 my_sqrt(n)。

  1. 编写my_sqrt(n)函数
    利用迭代法,判断nextGuess与lastGuess是否相等(二者差值小于0.0001),否则套用公式更新nextGuess与lastGuess的值
1.def my_sqrt(n):  
2. nextGuess, lastGuess = n, 1  
3. while math.fabs(nextGuess-lastGuess) > 0.0001:  
4.     lastGuess = nextGuess  
5.     nextGuess = (lastGuess+n/lastGuess)/2  
6. return nextGuess  

代码:

import math

def my_sqrt(n):
    nextGuess, lastGuess = n, 1
    while math.fabs(nextGuess-lastGuess) > 0.0001:
        lastGuess = nextGuess
        nextGuess = (lastGuess+n/lastGuess)/2
return nextGuess

if __name__ == '__main__':
    n = int(input("请输入一个整数:"))
    print("平方根为:" + str(my_sqrt(n)))

在这里插入图片描述

Problem 4:

自定义 Triangle 模块:编写一个模块 Triangle,包含以下三个函数:

  1. isValid(side1, side2, side3): 输入三条边长度,判断是否组成三角形;
  2. perimeter(side1, side2, side3): 输入三条边长度,求三角形周长
  3. area(side1, side2, side3): 输入三条边长度,求三角形面积。

1.首先定义Triangle模块,创建Triangle.py

1.1 定义isValid(side1, side2, side3)函数
判断条件是“两边之和大于第三边”,所以首先调用sorted函数将三条边进行排序,然后判断最短的两边是否大于最长边。
Sorted函数的用法是传入一个list,返回从小到大的已排序list。

1.def isValid(side1, side2, side3):  
2. sides = [side1, side2, side3]  
3. if sorted(sides)[0]+sorted(sides)[1] > sorted(sides)[2]:  
4.     print("可以组成三角形。")  
5.     return True  
6. else:  
7.     print("不可以组成三角形。")  
8.     return False  

1.2 定义perimeter(side1, side2, side3)函数
周长即返回三边之和

1.def perimeter(side1, side2, side3):  
2. print("三角形周长是:", side1+side2+side3)  

1.3 定义area(side1, side2, side3)函数
已知三边求三角形面积,利用海伦公式即可。

1.def area(side1, side2, side3):  
2. p = (side1+side2+side3)/2  
3. print("三角形面积是:", math.sqrt(p*(p-side1)*(p-side2)*(p-side3)))  

2.使用Triangle.py模块
首先import所需要的模块(注意必须在同一路径下)

1.import Triangle  

多组数据输入的方式是如下格式

1.map(eval, input("").split())  

Problem 5:

海龟绘图:自学 Python 自带的 turtle 模块,完成以下两个任务:

  1. 仔细阅读代码 exp2.5_example.py 并运行,回答以下问题:
    A. 运行代码后,你看到了什么?
    如图所示:
    在这里插入图片描述
    B. 解释以下函数的含义:
    up(), down(), goto(), circle(), forward(), right(), left(), speed()
    up():移动时不绘制图形
    down():移动时绘制图形,缺省时也为绘制
    goto(x, y):将画笔移动到坐标为x,y的位置
    circle®:以当前位置为圆心,半径为r,画圆
    forward(degree):向前移动距离degree代表距离
    right(degree):向右移动多少度
    left(degree):向左移动多少度
    speed(speed):画笔绘制的速度范围[0,10]整数

  2. 用 turtle 模块作出一幅你满意的画。
    最终图:
    在这里插入图片描述
    步骤:

  1. 首先定义画布大小、画笔速度、粗细等,等一些属性
1.t.setup(700, 500)  
2.t.screensize(800, 800, "black")  
3.t.pencolor("red")  
4.t.speed(10)  
5.t.pensize(5)  
6.t.goto(-300, 200)  
7.t.clear()  
8.t.hideturtle()  
  1. 绘制国旗四周边框,并以红色填充
1.   t.fillcolor("red")  
2.t.begin_fill()  
3.for _ in range(2):  
4.    t.forward(600)  
5.    t.right(90)  
6.    t.forward(400)  
7.    t.right(90)  
8.t.end_fill()  
9.t.penup()

在这里插入图片描述
3. 绘制大五角星,以黄色填充(五角星绘制方法会旋转五次144°并绘制登场直线)

1.   t.pensize(1)  
2.t.goto(-250, 74)  
3.t.pendown()  
4.t.setheading()(72)  
5.t.fillcolor("yellow")  
6.t.begin_fill()  
7.for _ in range(5):  
8.    t.forward(90)  
9.    t.right(144)  
10.t.end_fill()  

在这里插入图片描述
4. 绘制4个小五角星

1.for _ in range(4):  
2.   T.setheading(D[q])  
3.   t.begin_fill()  
4.   t.penup()  
5.   t.goto(X[q], Y[q])  
6.   t.pendown()  
7.   for _ in range(5):  
8.       t.forward(long)  
9.       t.right(144)  
10.   t.end_fill()  
11.   q += 1  

在这里插入图片描述
代码:

import turtle as t
x = 1
y = 1
d = 1
long = 33

X = [-169, -171, -128, -139]
Y = [158, 33, 110, 65]
D = [53, 53, 106, 74]
q = 0

t.setup(700, 500)
t.screensize(800, 800, "black")
t.pencolor("red")
t.speed(10)
t.pensize(5)
t.goto(-300, 200)
t.clear()
t.hideturtle()

t.fillcolor("red")
t.begin_fill()
for _ in range(2):
    t.forward(600)
    t.right(90)
    t.forward(400)
    t.right(90)
t.end_fill()
t.penup()
t.pencolor("yellow")
t.pensize(1)
t.goto(-250, 74)
t.pendown()
t.setheading(72)
t.fillcolor("yellow")
t.begin_fill()
for _ in range(5):
    t.forward(90)
    t.right(144)
t.end_fill()

for _ in range(4):
    t.setheading(D[q])
    t.begin_fill()
    t.penup()
    t.goto(X[q], Y[q])
    t.pendown()
    for _ in range(5):
        t.forward(long)
        t.right(144)
    t.end_fill()
q += 1

t.done()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_SCY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值