Python简单程序的练习

1、Python编写一个输出小于N的所有素数的程序

编程要求

  • 程序运行时,提示“N=”,用户输入一个正整数后(要对输入的数进行校验,不是一个大于2的正整数,则提示’error!input again:’,并重新提示输入:’N=’,直到输入了满足要求的数);
  • 把小于N的所有素数存储在一个列表data;
  • 输出data中的全部元素,按每行8个数,每两个数之间用1个空格隔开的格式输出。
  • 根据列表求所有素数之和及平均值(保留小数点后面3位有效数字);

定义一个空列表存放素数

import numpy as np
data = [] 
while True:
    s = input('N=')
    if s.isdigit():
        N = int(s)
        if(int(s)<=2):
            print('error!input again:')
            continue
        break
    else:
        print('error!input again:')
        continue
for i in range(2,N+1):
    for j in range(2,i):
        if i % j == 0:
            break
    else:
        data.append(i)
for a in range(len(data)):
    print(data[a],end=' ')
    if (a+1)%8 == 0:
        print('')
print('\nsum=%.0f,average=%.2f'%(sum(data), np.mean(data)))

2、Python输出小于任意给定的正整数N(N>20)的所有完美数

任务:本关任务:输出小于任意给定的正整数N(N>20)的所有完美数所谓完美数是:若大于0且小于正整数M的所有能整除M的因子的和等于M,则M为完美数,例如:6=1+2+3,因此,6是完美数

编程要求

  • 此程序对运行时间有要求,必须尽可能减小算法时间复杂度。
  • 本程序最佳的代码不会超过15行,如果你的代码超过15行,你得考虑是不是要优化一下(参考代码只有9行)
  • 本题不需要像第1题那样进行合法性检查,假设你的输入都是合法的,即N>20
  • 完美数的输出格式为:a=fact1+fact2+…,fact1,fact2,…因子按升序排序
N=int(input('N='))
for num in range(6,N):
    factors=[m for m in range(2,int(num**0.5)+1) if num%m==0]
    factors+=[num//n for n in factors]
    factors.append(1)
    if sum(factors)==num:
        factors.sort()
        s='+'.join(map(str,factors))
        print(f'{num}={s}')

3、Python编写评委评分

任务:学校举行校园歌手大赛,请了N个评委给选手打分,你负责设计一个程序:依次输入N个评委的评分,去掉1个最高分和1个最低分,以其余平均分作为选手最终得分。

编程要求

编程要求

  • 分数为连续输入的方式,相邻两个数之间用逗号(中文,英文逗号均可)或空格作为分隔符都可以识别。只要输入不合法,就提示重新输入。
    输入合法的条件是:(A)输入的数据都是数值(B)位于区间(0,10]上的数值个数大于或等于5。
  • 将最终输入的有效数值显示出来,基于最终的有效评分进行计算:去掉1个最高、1个最低分,求剩下的平均分作为最终得分。
  • 最终得分保留小数点后3位有效数字。
  • 尽量以最简洁的代码完成任务。
while True:
    s=input('input score:')
    seps=',锛 '
    for sep in seps:
        s=s.replace(sep,' ')
    s=s.split()
    try:
        data=list(map(float,s))
        data=[num for num in data if 0<num<=10]
        if len(data)>=5:
            break
    except:
        continue
print('valid scores:'+str(data))
max_score=max(data)
min_score=min(data)
avg_score=(sum(data)-max_score-min_score)/(len(data)-2)
print('max={0},min={1},score={2:.3f}'.format(max_score,min_score,avg_score))

4、Python函数的应用: 输出斐波那契数列

任务:给定一个整数N(N>=10),从1开始,输出元素个数为N的斐波那契数列

编程要求

(1)本程序的主程序代码已经给出,如下:

data=fibdata()
outputdata(data)
N = getint()
M = getint()
data = fibdata(N)
outputdata(data,M)

上面的fibdata用于生成一个斐波那契数列,getint用于获取用户从键盘输入的整数(必须为正整数,内部要进行校验,不合法就要求重新输入),outputdata用于根据每行多少个数据输出该数列
(2)请在读懂上述主程序代码的基础上,完成各个函数的定义(你只需要完成定义的代码,上面的调用代码不要求你输入(不过你可以把这段代码复制到你的本机开发环境进行测试)

#-*- coding: utf-8 -*-
def fibdata(n=10):
    a, b = 0, 1
    data=[1]
    while n > 1:
        a, b = b, a + b
        n -= 1
        data.append(b)
    return data
def getint(): 
    while True:
        a=input('input a positive int:')
        if a.isdigit():
            break
        else:
            continue
    return int(a)
def outputdata(data,M=5):
    for i in range(len(data)):
        print(data[i],end=' ')
        if (i+1)%M == 0:
            print('') 

5、Python类的定义与使用:一元二次方程求解

编程要求

(1)以下是主程序文件(test.py)中的完整代码:
from myclass import *
if __name__=='__main__':
    while True:
        try:
            a,b,c=eval(input('please input three float number:'))
            equation=QuadraticEquation(a,b,c)
        except:
            equation=QuadraticEquation()  #使用默认参数a=1,b=1,c=1初始化
        #注意,这个返回结果必须是一个字典对象{'x1':1,'x2':2,'state':1},其项目依次对应根
        #x1,x2,根的状态(0表示相等实根,1表示不等实根,2表示复数根
        result=equation.getroot()  
        equation.outputresult(result) #调用对象的方法更友好地显示结果
        print(result.keys(),',state={}'.format(result['state'])) #显示字典对象的键和根的状态
        if input('continue(y/n)?').lower()!='y':
            break
(2)在读懂主程序的基础上,在右侧代码区中完成myclass.py文件中的代码,从而使主程序文件能够执行,并输出期望的结果。
#-*- coding:utf-8 -
class QuadraticEquation():
    def __init__(self,a=1,b=1,c=1):
        self.a=a
        self.b=b
        self.c=c
    def getroot(self):
        dirt={}
        x1=(-self.b+(self.b*self.b-4*self.a*self.c)**0.5)/(2*self.a)
        x2=(-self.b-(self.b*self.b-4*self.a*self.c)**0.5)/(2*self.a)
        dirt['x1']=x1
        dirt['x2']=x2
        if isinstance(x1,complex):
            state=2
        elif x1==x2:
            state=0
        else:
            state=1
        dirt['state']=state
        return dirt
    def outputresult(self , result):
        if(result['state']==2):
            print("{0}x+{1}x**2+{2}=0 has two complex roots x1={3:.3f},x2={4:.3f}"
            .format(self.a,self.b,self.c,result['x1'],result['x2']))
        elif result['state']==1:
            print("{0}x+{1}x**2+{2}=0 has two inequal real roots:x1={3:.3f},x2={4:.3f}"
            .format(self.a,self.b,self.c,result['x1'],result['x2']))
        else:
            print("{0}x+{1}x**2+{2}=0 has two equal roots x1=x2={3:.3f}"
            .format(self.a,self.b,self.c,result['x1']))

6、字符串、正则表达式与文件操作:字符串加密与解密

任务描述

加密:给定一串原始的文本和一个编码字符串(例如utf-8),加密算法为:把原始内容转换为字节串,然后把字节串中的每一个元素对应的10进制整数转换为对应的字符串,各个字符串用1个小写字母作为分隔符连接起来,最终构成的字符串为加密后的字符串。分隔符的确定规则如下:
当前的分割字母在字母表中的顺序与它前面的那个数字对应,若那个数字为0,则为字母a,为1,则为字母b,…,。
例如,“china 中国”用编码’utf-8’加密后为“99j104e105f110a97h32c228i184e173d229j155f189j”
解密:给定上述加密后的字符串,反向解码为原始的字符串。

编程要求

(1)编写一个可复用的类Encryptionlock,实现上述功能。
(2)主程序通过使用Encryptionlock,实现对一个输入的字符串进行加密,及对一个输入的加密后的字符串进行解密,代码如下:

if name == ‘main‘:
    s=input(‘输入待加密的字符串:’)
    coding=input(‘输入编码字符串:)
    s_encrpt=Encryptionlock.encrypt(s,coding)
    print(‘加密后为:’+s_encrpt)
    s_decrpt=Encryptionlock.decrypt(s_encrpt,coding)
    print(‘解密后为:’+s_decrpt)
#-*- coding: utf-8 -*-
import string
class Encryptionlock():
    '''使用常用编码进行文本的加密和解密
    '''
    @staticmethod
    def encrypt(originstr: str, coding: str = 'utf-8'):
        '''对一个字符串进行加密,返回加密后的字符串
        '''
        result = originstr.encode(coding)
        result = bytearray(result)
        seq = string.ascii_lowercase
        result = ''.join([str(s) + seq[s%10] for s in result])
        return result
    @staticmethod
    def decrypt(encrypedstr: str, coding: str = 'utf-8'):
        '''对一个字符串进行解密,返回解密后的字符串
        '''
        result= encrypedstr
        seq = string.ascii_letters
        for s in seq:
            result = result.replace(s, ' ')
        result = result.split(' ')
        result.pop()
        result = bytes(map(int,result))
        return result.decode(coding)

7、数学库numpy的使用

任务描述

编写一个程序:输入任意一个矩阵,求它的转置矩阵,并判断其是否为奇异矩阵,若不是,则输出其行列式和逆矩阵。
相关知识

程序的运行结果画面类似如下:

请输入一个N×N矩阵:[[1,6],[3,9]]
该矩阵的转置矩阵为:
[[1 3]
[6 9]]
该矩阵的行列式为:-9.00
该矩阵的逆矩阵为:
[[-1. 0.66666667]
[ 0.33333333 -0.11111111]]

import numpy as np
c=eval(input("请输入一个N×N矩阵:"))
a=np.asarray(c)
print("该矩阵的转置矩阵为:")
print(a.T)

if(a.shape[0]==a.shape[1] and abs(np.linalg.det(a))!=0):
    print("该矩阵的行列式为:{0:.2f}".format(np.linalg.det(a)))
    print("该矩阵的逆矩阵为:\n{0}".format(np.linalg.inv(a)))
else:
    print("这是奇异矩阵")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值