python小练习03

1.绘制奥运五环旗

python 复制代码
#奥运五环的绘制
import turtle as t
t.pensize(3)
t.speed(0)
def draw_circles():
    i=0
    while i <=4:
        args = [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个参数列表
        t.penup()
        t.goto(args[i][0],args[i][1])
        t.pendown()
        t.color(args[i][2])
        t.circle(40)
        i+=1
    t.hideturtle()
    t.done()
draw_circles()

结果及分析:

由于绘制五个不同颜色的环,且存在先后顺序问题,加之这些环的圆心坐标和颜色是可变参数。因此采用定义二维数组的形式来给定参数(这样做的好处是避免代码行数太长,而且很直观)具体做法是:定义i作为二维数组的索引,给定初始值为0,设定while循环,当画完最后一个圆环时结束程序。

2.双弧外摆线的绘制

python 复制代码
import turtle as t
import math as m
t.speed(0)
i = 0
while i <=2*m.pi:#描点法绘制双弧外摆线
    t.penup()
    x = 3 * 25 * m.cos(i) + 25 * m.cos(3 * i)
    y = 3 * 25 * m.sin(i) + 25 * m.sin(3 * i)
    t.goto(x,y)
    t.pendown()
    t.dot(5,"black")
    i+=0.01
t.done()

结果及分析:

引入turtle和math库,并利用while循环,选定2*pi作为循环控制条件,再基于"描点法"绘制函数图像,将点和点之间的间隔设置为0.01,通过对点的绘制进行参数控制进而绘制出双弧外摆线。

3.编写程序绘制下图,使用while 循环的结构程序设计完成。

python 复制代码
ch,i= '*',0
args=[5,3,1,3,5]
while i <=4:
    print("{0: ^5}".format(ch*args[i]))
    i+=1

结果分析:基本元素为'*',解决这个问题的关键在于每行'*'的个数不一样。定义一个列表储存每行对应基本元素的个数,并使用while循环控制。

**4.**回数

回数是一种特殊的数,其正向与反向所表示的数值相等。如果数abcd=dcba,则称数abcd为回数,这里a,b,c,d表示0-9之间的数字符号,如1111,1221,2002等。请编写程序,找出并显示1000到9999之间的回数,分行显示,每行显示10个数字。

python 复制代码
result = []
for a in range(1,10):
    for b in range(0,10):
        for c in range(0,10):
            for d in range(1,10):
                if a*1000 + b*100 + c*10 + d == d*1000 + c*100 + b*10 + a:
                    result.append(str(a)+str(b)+str(c)+str(d))
i = 0
while i<len(result): #输出控制函数
    print("{} ".format(result[i]),end = '')
    if (i+1)%10 == 0:
        print()
        i+=1
    else:
        i+=1

结果及分析:

千位和个位除 0 之外任取,百位和十位并没有约束。代码由两部分组成,第一部分,通过三个嵌套的 for 循环进行回文数判断并逐个放入 result 列表中。

第二部分是对列表元素有控制条件的输出。首先加上一个 while 循环对索引 i 控制阈值上限,在输出元素后,利用 if-else 判断是第几个元素,若是第十个,使用 print() 进行换行操作。最后 i+=1 进行变量更新。

**5.**杨辉三角

实现杨辉三角前10行的输出

python 复制代码
def yh_triangle(n):#n为需要输出的行数,n=实际行数-1
    ls=[]
    if n == 0:
        ls = [1]
    elif n == 1:
        ls = [[1],[1,1]]
    else:
        j = 2
        ls = [[1], [1, 1]]
        for i in range(0, n - 1):
            ls.append([])# 创建[[],[],[],[]],个数取决于n
        while j <= n:
            ls[j] = [1]
            for k in range(1, j):
                ls[j].append(ls[j - 1][k - 1] + ls[j - 1][k ])
            ls[j].append(1)
            j += 1
    p_out(ls)
def p_out(ls): #输出函数
    for i in range(0,len(ls)):
        for j in range(0,len(ls[i])):
            print("{} ".format(ls[i][j]),end='') #嵌套循环输出
        print()
yh_triangle(9)

结果及分析:

本代码分为两部分:

第一部分是 yh_triangle(n)

n 为实际需要输出的行数减去 1 。创建空列表,此列表为 2 维列表,维数取决于行数。举个例子:若需要输出前 3 行,此列表为: [[1],[1,1],[1,2,1]], 以此类推。由于前两行并不存在特殊的杨辉三角规律,故放在 if-elif 结构里。倘若行数大于或等于 3 ,创建 [[1],[1,1],[]]. 最后子列表的元素运用杨辉三角规律。

第二部分是 p_out(ls) 函数

ls 在第一个函数结尾调用,其执行逻辑是:通过两个嵌套循环进行二维列表元素的遍历输出。在第二个循环结束时换行。

**6.**编写函数myfunc(x,n)

求多项式s=x+xx+xxx+xxxx+......+xx...x的和,并返回求出的和。其中x是1-9的数字,最后一项是n位都是x的数字。例如 x=2,n=6时输出 246912.

python 复制代码
def myfunc(x,n):
    x = str(x)
    if n==0:
        return 0
    else:
        return int(x*n) + int(myfunc(x, n - 1))
result = myfunc(2,6)
print(result)

结果及分析:

本代码使用了函数递归完成该题目,以x=2,n=6来说明。当调用此函数时,先将x转化为字符形式。进入if判断,当n == 0时,返回0,当n不为0时,int(x*n)=22222,并再次调用myfunc()函数。int(x,n)=2222,依次类推,最后结果为:0+2+22+222+2222+22222=246912。

7.编写函数求余弦函数的近似值

用下列公式求cos(x)的近似值,精确到最后一项绝对值小于0.01.

例如cos(-3.14)=-9.999899

python 复制代码
import math as m
def cos(x):
    cos,j,a,i= 0,0,1,0
    while abs(a)>0.01:
        a = (pow(x,i)/m.factorial(i))
        i =i+ 2
        b = (-1)**(j)
        j = j+1
        c = a * b
        cos = cos + c
    else:
        return cos
m = cos(-3.14)
print("{:.6f}".format(m))

结果及分析:

本代码根据要求将cosx的公式进行了数学表达,总共拆分成了两个部分,一部分是"±",一部分是数的阶乘。通过引入math库实现阶乘的简单实现。实际上,本题也可以利用函数递归完成,但我考虑到第一问已经用了,所以这里换了一种方法。

8.亲密数

如果有两个自然数a和b,a的所有因子(比a小且能整除a的自然数)之和恰好等于b,并且b的所有因子之和恰好等于a,则称a和b是一对亲密数。例如220和284,因为220的全部因子(除去本身)相加是1+2+4+5+10+11+20+22+44+55+110=284,284的全部因子(除去本身)相加是1+2+4+71+142=220.请用户输入一个整数m,输出比m小的所有亲密数。

python 复制代码
def s_num(n):#找出比n小的所有数,不包含n
    for i in range(1,n):
        factor(i)#将找到的小于n的数传递给factor函数
        if i == n-1:
            search(result)#当完成小于n的所有数的对应因数相加时,调用search函数进行亲密数寻找
def factor(m):#factor函数,找出m的因数并相加,在此基础上创建一个字典,键(数m)-值(对应因数之和)
    i= 1
    while i < m:#寻找因数并求和
        sum = 0
        if m % i == 0:
            result[m] = result.get(m,0)+i
            i += 1
        else:
            i += 1
def search(result):
    res = []
    for key, value in result.items():#依据亲密数的性质进行选择
        if value in result and result[value] == key and value != key:
            res.append((key, value))
    for item in res:#去除冗余
        if item[0]>item[1]:
            res.remove(item)
    print(res)
result = {}
s_num(100000)

结果及分析:

代码分为三个模块,第一个s_num(n),找出所有比n小的数且不包含n。第二个factor(m),寻找数m的所有因数,并将每个小于n的数作为键,把其因数之和作为值储存在result字典中。第三个search(result)函数,以字典result作为输入量,并用for循环遍历键值对。其中if结构的第一个条件判断当前value是否在字典result的键中(找出因数之和相等的数是否存在),第二个条件判断当前value对应的键的值是否等于key,第三个条件判断value是否等于key,这三个条件都满足则将当前的键值对添加到res中。

=====================================

欢迎指正!

相关推荐
轻口味11 分钟前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学1 小时前
QT-简单视觉框架代码
开发语言·qt
威桑1 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans1 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
算法小白(真小白)2 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭2 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python