实验四  Python 组合数据类型

  1. 创建列表以列表list1 = ["lift", "is", "short"]和list2 = ["You", "need", "python"],并完成以下任务:
    (1)输出listl中的第一个元素lift及其索引(下标)。
    (2)在short后面增加一个!
    list1 = ["lift", "is", "short"]
    list2 = ["You", "need", "python"]
    print(list1[0],list1.index('lift'))
    list1.append('!')
    print(list1)

     

  2. 编写程序,将列表s=[9,7,8,3,2,1,5,6]中的偶数变成它的平方,奇数保持不变。其运行效果如下图所示。
    提示:可以利用“if(s[i]%2==0”的语句形式判断列表中的第i个元素是否为偶数。
    s=[9,7,8,3,2,1,5,6]
    for i in range( len(s)):
        if s[i]%2==0:
            s[i]=s[i]*s[i]
    print(s)

     

  3. 分别使用if和while语句删除将列表x = [1,2,1,2,1,1,1]中的元素“1”全部删除。
    x = [1,2,1,2,1,1,1]
    y=x[:]
    for i in y:
        if i==1:
            x.remove(i)
    print(x)

    x = [1,2,1,

  4. 编写程序,删除一个list里面的重复元素,即所有元素不重复。
    提示:可以利用s. append(x)方法把对象x追加到列表s的尾部。
    list1=[1,2,3,4,5,1,2,3]
    list2=[]
    for i in list1:
        if i not in list2:
            list2.append(i)
    print(list2)

     

  5. 2(选做)统计所输入字符串中单词的个数,单词之间用空格分隔。其运行效果如下 请输入字符串: The qu1ck brown fox jumps over the lazy dog.

    sum=1
    s=input("请输入字符串:")
    for i in s:
        if i==' ':
            sum+=1
    print(sum)
    
    s=input("请输入字符串:")
    list=s.split(' ')
    print(len(list))

     

  6. 编写程序,输入字符串,将其每个字符的ASCI码形成列表并输出,运行效果如下图所示。

    请输入一个字符串:ABCDE123

    [65,66,67,68,68,49,50,51]

    s=input("请输入字符串:")
    list=[]
    for i in s:
        a=ord(i)
        list.append(a)
    print(list)

     

  7. (选做)创建列表,内容为a-z、A~Z和0-9,从中随机抽出6个字符作为验证码。提示:使用ASCII值和chr函数(chr()主要用来表示ascii码对应的字符他的输入时数字,可以用十进制,也可以用十六进制)生成大小写字母或string库。
    import random
    lists=[]
    list1=[chr(i) for i in range(97,123) ]
    lists.extend(list1)
    list2=[chr(i) for i in range(65,91)]
    lists.extend(list2)
    list3=list(range(10))
    lists.extend(list3)
    code=[]
    l=len(lists)
    for i in range(6):
        r=random.randint(0,l-1)
        code.append(lists[r])
    print(code)
    

     

  8. 使用列表实现筛选法求素数。
    prinmNumber=[]
    x = eval(input('请输入一个大于 2 的自然数: '))
    if x>2:
        for i in range(2,x):
            flag = True
            for j in range(2, int(i/2)+1):
                if i % j == 0:
                    flag = False
                    break
            if flag:
                prinmNumber.append(i)
        print(prinmNumber)
    else:
        print('数请输入大于2的数字')

     

  9. 编写程序,求列表s=[9,7,8,3,2,1,55,6]中的元素个数、最大值、最小值,以及元素之和、平均值。请思考有哪几种实现方法?
    提示:可以分别利用for循环、 while循环、直接访问列表元素( for i in s…)、间接访间列表元素( for i in range(O,len(s))…)、正序访问(i=0; while i<len(s)…)、反序访问(i=len(s)-1;while i>=0…)以及while True:… break等方法。
    num=0
    sum=0
    s=[9,7,8,3,2,1,55,6]
    for i in s:
        num=num+1
        sum=sum+i
    ave=sum/num
    print("元素个数",num)
    print("最大值",max(s))
    print("最小值",min(s))
    print("总和",sum)
    print("平均值",ave)

     

  10. 创建一个空字典 student,录入学生姓名和成绩,并一一对应,当所有学生的信息录入完之后,输入1退出。需要注意的是(学生成绩范围为0~150)超出范围重新输入。
    student={}
    alist=[]
    blist=[]
    prime=0
    while prime==0:
        a=input("请输入学生姓名:")
        alist.append(a)
        b=eval(input("请输入学生个成绩:"))
        if b>0 and b<150:
            blist.append(b)
        else:
            print("输入错误,请重新输入")
        prime=int(input("是否需要继续?是请输入0,否请输入1"))
    student=dict(zip(alist,blist))
    print('学生姓名及对应成绩为:',student)

     

  11. 已知一个字典包含若干员工信息(姓名和性别),请编写一个程序,删除性别为男的员工信息。
    a={'liming':'男','lihua':'女','zhangsan':'男','lili':'女'}
    list1=[]
    list2=[]
    v=a.values()
    k=a.keys()
    for i in k:
        list1.append(i)
    for j in v:
        list2.append(j)
    for n in list2:
        if(n=='男'):
            x=list2.index('男')#显示‘男’的下标(因为值与键的下标是一致的)
            list2.remove('男')
            list1.remove(list1[x])
    dic=dict(zip(list1,list2))#形成新的字典
    print(dic)

     

  12. (选做)请编写一个程序,使用字典存储学生信息,学生信息包括学号和姓名,请根据学生学号从小到大输出学生的信息。提示:使用sorted函数并指定其对应的参数key的值。
    ##1
    list1=[]
    a={'1001':'张三','1009':'李四','1002':'李三','1007':'王五','1006':'王六'}
    b=sorted(a)
    for i in b:
        list1.append(a[i])  #a[i]是指i键对应的值,从而使值也形成一个列表
    c=dict(zip(b,list1))
    print(c)
    ##2
    prime = 0
    blist = []
    alist = []
    def get_key(dict, value):
       return [k for k, v in dict.items() if v == value]
    
    while prime == 0:
       a = input('请输入学生姓名:')
       alist.append(a)
       b = int(input('请输入学生学号:'))
       blist.append(b)
       prime = int(input('是否继续?(是请输入0,否请输入1)'))
    student = dict(zip(alist, blist))
    student = sorted(student.items(), key=lambda x: x[1])
    print(dict(student))

     

  13. (选做)请编写一个程序,用于统计字符串中每个字母的出现次数(字母忽略大小写,a和A看是作一个字母,统计出的结果,请按照[‘a’:3,’b’:2]的格式输出。
    alist=[]
    blist=[]
    s=input("请输入字符串:")
    for i in s:
        if i not in alist:
            alist.append(i)
            blist=1
        else:
            blist+=1
    now=dict(zip(alist,blist))
    print(now)

     

  14.                         实验五 函数设计

 

 

1.1.编写程序,利用元组作为函数的返回值,求序列类型中的最大值、最小值和元素个数,并编写测试代码,假设测试数据分别为s1=[9,7,8,3,2,1,55,6]、s2=[" apple","pear" melon","kiwi"]和s3=" TheQuickBrownFox"。运行效果参见下图。

def f(s):
    maxx=max(s)
    minn=min(s)
    num=len(s)
    return maxx,minn,num
s1=[9,7,8,3,2,1,55,6]
print("最大值,最小值,元素个数分别为:",f(s1))
s2=["apple","pear","melon","kiwi"]
print("最大值,最小值,元素个数分别为:",f(s2))
s3="TheQuickBrownFox"
print("最大值,最小值,元素个数分别为:",f(s3))
  1. 设计一个函数,实现输入一个五位数的正整数(程序要对输入数据的合法性进行检查),对输入的数据加密后再返回,加密规则:每位数字都加上7,然后用10取模,再将得到的结果交换顺序:第一位和第二位交换,第三位和第五位交换,第一位和第四位交换。
    def ff(n):
        ans=[]
        while n:
            ans.append((n%10+7)%10)
            n=n//10
        ans.reverse()
        ans[0],ans[1]=ans[1],ans[0]
        ans[2],ans[4]=ans[4],ans[2]
        ans[0],ans[3]=ans[3],ans[0]
        return int("".join(map(str, ans)))
    s=eval(input("请输入5位数的正整数"))
    print(ff(s))

     

  2. 请编写一个程序,使用字典存储学生信息(自己编写至少十个学生的信息),学生信息包括学号和姓名,请根据学生学号从小到大输出学生的信息。提示:使用sorted函数并指定其对应的参数key的值。
    def ff(s):
        x = sorted(s)
        list1 = []
        for i in x:
            list1.append(s[i])
        c = dict(zip(x, list1))
        return c
    s = {'zyf': 315, 'ztd': 564, 'tfe': 145, 'trd': 157}
    print(ff(s))

    3‘’首先,使用列表推导式和标准库 random生成一个包含50个介于1~100的随机整数的列表,然后编写函数 def isPrime(n)用来测试整数n是否为素数,接下来使用内置函数 filter(把函数 isPrime()作用到包含若干随机整数的列表lst上,最后程序输出一个列表,其中只包含列表lst中不是素数的那些整数。

    def isPrime(n):
        list2=[]
        for i in n:
            for j in range(2,int(i/2)+1):
                if i%j==0:
                    list2.append(i)
                    break
                else:
                    j=j+1
        return list2
    import random
    x = [random.randint(1, 101) for i in range(50)]
    print(x)
    print(list(isPrime(x)))
    
    def isPrime(n):
       if n == 1:
          return 1
       for i in range(2, int(n**0.5) + 1):
          if n % i == 0:
             return 1
          return 0
    import random
    x = [random.randint(1, 101) for i in range(50)]
    print(x)
    print(list(filter(isPrime, x)))

    4.编写程序,清分别使用递归和非递归方式实现。定义一个求阶乘的函数 fact(n),并编写测试代码,要求输入整数(n0)。运行效果如下图所示。

请输入整数n(n n≥0):5

S!=120

def fact(n):
    if n==0 or n==1:
        return 1
    else:
        return n*fact(n-1)
n=eval(input("请输入一个数:"))
print(fact(n))

def fact(n):
    s=1
    if n == 0 or n == 1:
        return 1
    else:
        for i in range(1,n+1):
            s=s*i
        return s
n=eval(input("请输入一个数:"))
print(fact(n))
  1. 编写程序实现斐波那契数列,斐波那契数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。
    def ff(n):
        if n==1 or n==2:
            return 1
        else:
            return ff(n-1)+ff(n-2)
    n=eval(input("请输入n:"))
    print(ff(n))

     

  2. 编写程序,定义一个求 Fibonacci(斐波那契)数列的函数fib(n),并编写测试代码,输出前20项(每项宽度5个字符位置,右对齐),每行输出10个。运行效果参见下图。请分别使用递归和非递归方式实现。
    def fib(n):
        if n==1 or n==2:
            return 1
        else:
            return fib(n-1)+fib(n-2)
    for i in range(1,21):
        if i%10==0:
            print("%5d"%fib(i),end='\n')
        else:
            print("%5d"%fib(i),end=' ')

    3,阅读并适当增加必要的代码来调试下面的代码,分析代码功能,发现并解决代码中的错误。提示:此代码计算

    def cni(n,i):

         minNI=min(i,n-i)

         result = 1

         for j in range (0,minNI):

    def cni(n, i):
        minNI = min(i, n - i)
        result = 1
        for j in range(0, minNI):
            result = result * (n - j) // (minNI - j)
        return result
    n=eval(input("n="))
    i=eval(input("i="))
    print(cni(n,i))

    4.小球从100m的高度自由落下,每次落地后反弹回原高度的一半;再落下,定义函数cal计算小球在第n次落地时,共经过多少米以及第n次反弹多高。定义全局变量SnHn分别存储小球经过的路程和第n次的高度。主函数输入n的值,并调用cal函数计算输出SnHn的值。

    def cal(n):
        global sn
        global hn
        sn=0
        hn=100
        for i in range(1,n+1):
           if i==1:
               sn=100
               hn=50
           else:
               sn=sn+hn*2
               hn=hn/2
        return sn,hn
    n=eval(input("请输入n:"))
    print(cal(n))

    5.(选做)编写程序,利用可变参数定义一个求任意个数数值的最小值的函数min_n(a,b,c),并编写测试代码。例如,对于“ print(min_n(8,2))”以及“ print(minn(16,1,7,4,15)”的测试代码,程序运行结果如图所示

    def minn(*p):
        print("最小值为",end=" ")
        return min(p)
    print(minn(8,2))
    print(minn(16,1,7,4,15))

    实验六 面向对象的程序设计

  1. 设计一个圆类,包括圆心位置、半径、颜色等属性。编写构造方法,计算周长和面积。
    import math
    class circle:
        def __init__(self,o,r,color):
            self.o=o
            self.r=r
            self.color=color
        def length(self):
            C=math.pi*2*self.r
            return C
        def area(self):
            S=math.pi*self.r**2
            return S
    ff=circle((0,0),2,'red')
    print("周长为:{:.2f}".format(ff.length()))
    print("面积为:{:.2f}".format(ff.area()))

     

  2. 设计一个课程类,包括课程编号、课程名称、任课教师、上课地点等属性,把上课地点变量设为私有的,增加构造方法和显示课程信息的方法。
    class course:
        def __init__(self,num,name,teacher,local):
            self.num=num
            self.name=name
            self.teacher=teacher
            self.__local=local
        def showmessage(self):
            print("课程编号:",self.num)
            print("课程名称:",self.name)
            print("任课教师:",self.teacher)
            print("上课地点:",self.__local)
    ff=course('n123','Python','宋云胜','N201')
    ff.showmessage()

     

  3. 设计一个描述自由落体运动的类,要求能获得任意时刻的速度及位移,并进行测试。已知重力加速度为9.8m
    class free:
        def __init__(self,t):
            self.t=t
        def getv(self):
            v=9.8*self.t
            return v
        def getx(self):
            x=1/2*9.8*self.t**2
            return x
    if __name__=='__main__':
        t = eval(input("请输入任意时间t:"))
        ff = free(t)
        print("速度为:{:.2f}".format(ff.getv()))
        print("位移为:{:.2f}".format(ff.getx()))

     

  4. 设计一个二维向量类,实现向量的加法、减法及向量与标量的乘法和除法运算。
    class vector:
        def __init__(self,a,b):
            self.a=a
            self.b=b
        def add(self):
            c1=self.a[0]+self.b[0]
            c2=self.a[1]+self.b[1]
            print("相加:",(c1,c2))
        def jian(self):
            c1 = self.a[0] - self.b[0]
            c2 = self.a[1] - self.b[1]
            print("相减:", (c1, c2))
        def cheng(self):
            c1 = self.a[0] * self.b[0]
            c2 = self.a[1] * self.b[1]
            c=c1+c2
            print("相乘", c)
        def chu(self):
            c1 = self.a[0] / self.b[0]
            c2 = self.a[1] / self.b[1]
            print("相除", (c1, c2))
    ff=vector((1,2),(3,4))
    ff.add()
    ff.jian()
    ff.cheng()
    ff.chu()

     

5.为二次方程式ax2+bx+c=0设计一个名为 Equation的类,这个类包括:

  1. 一个参数为a、b、c的构造方法;
  2. 一个名为 getDiscriminant1的方法返回判别式的值;

     3一个名为 getRoot1和 getRoo2t的方法返回等式的两个根,如果判别式为负,这些方法返回0

import math
class Equation:
    def __init__(self,a,b,c):
        self.a=a
        self.b=b
        self.c=c
    def getDiscriminant1(self):
        t=self.b**2-4*self.a*self.c
        return t
    def getRoot1(self):
        if self.getDiscriminant1()>0:
            return ((-self.b)+math.sqrt(self.getDiscriminant1()))/2*self.a
        else:
            return 0

    def getRoot2(self):
        if self.getDiscriminant1()>0:
            return ((-self.b)-math.sqrt(self.getDiscriminant1()))/2*self.a
        else:
            return 0
ff=Equation(1,2,-1)
print(ff.getDiscriminant1())
print(ff.getRoot1())
print(ff.getRoot2())

6 设计一个整形数组的封装类,要求实现下列功能:

  1. 显示全部数组数据
  2. 显示从某位置开始的一段连续数组数据
    class List:
        def __init__(self,lis):
            self.__lis=lis
            self.len=len(lis)
        def bufen(self,id):
            return self.__lis[id:]
        def quanbu(self):
            return self.__lis
    ff=List([1,2,3,4,5])
    print(ff.bufen(2))
    print(ff.quanbu())

     

                             实验七 异常处理

 

  1. 从键盘输入一个整数,求100除以它的商,并显示输出。要求对从键盘输入的数值进行异常处理。
    try:
        num=int(input("请输入一个整数"))
        x=100/num
        print(x)
    except ValueError:
        print("输入有误,请重新输入")

     

  2. 编程实现索引超出范围异常 Index Error类型。例如:chars=["a","b",100,-37,2]

    try:
        chars=["a","b",100,-37,2]
        chars[5]='k'
    except IndexError:
        print("索引超出范围")

     

  3. 录入一个学生的成绩,把该学生的成绩转换为A优秀、B良好、C合格、D不及格的形式,最后将该学生的成绩打印出来。要求使用 assert断言处理分数不合理的情况。

    try:
        score=int(input("请输入学生的成绩:"))
        assert 0 <= score <= 100
        if score>=90 and score<=100:
            print("A")
        if  score>=80 and score<90:
            print("B")
        if score >= 60 and score <80:
            print("C")
        if score<60:
            print("D")
    except ValueError:
        print("输入必须为整数,请重新输入")
    except AssertionError:
        print("断言0<=成绩<=100失败,请注意范围")
    

     

  4. .(选做)定义一个 Circle 类,其中有求面积的方法,当半径小于 0 时,抛出一个用户自定义异常

    import math
    class RangeErrorexception(Exception):
        def __init__(self, error_reason='圆的面积不能为负数!'):
            Exception.__init__(self, error_reason)
    class Circle():
        def __init__(self,r):
            self.r=r
            if self.r < 0:
                raise RangeErrorexception
        def getS(self):
            s = math.pi * self.r *self.r
            return s
    try:
        r=eval(input("请输入半径r:"))
        c1=Circle(r)
        print(c1.getS())
    except RangeErrorexception as reason:
        print(reason)
    

     

  5. 假设成年人的体重和身高存在此种关系:身高(厘米)-100=标准体重(千克)   如果一个人的体重与其标准体重的差值在正负5%之间,显示“体重正常”,其他则显示“体重超标”或者“体重不达标”。编写程序,能处理用户输入的异常并且使用自定义异常类来处理身高小于30cm、大于250cm的异常情况。
    class HighErrorexxeption(Exception):
        def __init__(self,error_reason='身高不能小于30cm或者大于250cm'):
            Exception.__init__(self,error_reason)
    class relation:
        def __init__(self,high,weight):
            self.high=high
            self.weight=weight
            if self.high<30 or self.high>250:
                raise HighErrorexxeption
        def rel(self):
            y=(self.high-100)-self.weight
            if y>=-0.05 or y<=0.05:
                print("体重正常")
            else:
                print("体重超标或者不达标")
    try:
        h=eval(input("请输入身高"))
        w=eval(input("请输入体重"))
        ff=relation(h,w)
        ff.rel()
    except HighErrorexxeption as reason:
        print(reason)

     

  6. .(选做)设计一个一元二次方程类,并为这个类添加异常处理。

    import math
    class FcErrorexception(Exception):
        def __init__(self,error_reason="dirta<0,函数不存在实数根"):
            Exception.__init__(self,error_reason)
    class panduan:
        def __init__(self, a, b, c):
            self.a=a
            self.b=b
            self.c=c
        def getDiscriminant1(self):
            t=self.b**2-4*self.a*self.c
            return t
        def getRoot1(self):
            if self.getDiscriminant1()>0:
                return ((-self.b)+math.sqrt(self.getDiscriminant1()))/2*self.a
            else:
                raise FcErrorexception
    
        def getRoot2(self):
            if self.getDiscriminant1()>0:
                return ((-self.b)-math.sqrt(self.getDiscriminant1()))/2*self.a
            else:
                raise FcErrorexception
    try:
        ff = panduan(1, 2, 1)
        print(ff.getDiscriminant1())
        print(ff.getRoot1())
        print(ff.getRoot2())
    except FcErrorexception as reason:
        print(reason)

     

                                     实验八 文件处理

实验要求:新建一个文件夹命名为“学号+姓名”格式命名,以下所有实验代码均保存在此此文件夹。

  1. 创建文件suiji.txt,文件共100000行,每行存放一个1~100之间的整数,最后将此文件保存至data文件夹.

提示:调用random. randint(1,100)方法产生随机数

import random
f=open("suiji.txt",'w+')
for i in range(1,100000):
    f.write(str(random.randint(1,100)))
    f.write('\n')
f.close()

2、统计文件(tongji.csv)中的大写字母、小写字母和数字出现的次数。

提示: 

  • 字符串.isdigit()  所有字符都是数字,为真返回 Ture,否则返回 False。
  • 字符串.islower() 所有字符都是小写,为真返回 Ture,否则返回 False。
  • 字符串.isupper()  所有字符都是大写,为真返回 Ture,否则返回 False
with open("tongji.csv",'w+') as fp:
    count1=0
    count2=0
    count3=0
    s=fp.read()
    for i in s:
        if i.isupper():
            count1+=1
        if i.islower():
            count2+=1
        if i.isdigit():
            count3+=1
print("大写字母:",count1)
print("小写字母:",count2)
print("数字:",count3)

3、计算(pingjun.csv)文件中所有数值数据的和。

with open("pingjun.csv",'w+') as fp:
    s=fp.read()
    sum=0
    for i in s:
        sum+=i
print(sum)

4、读取一个文件(test_row.txt),显示除了以#号开头的行以外的所有行。

提示:使用str. startswith()方法判定字符串是否以某个符开头。

ith open("test_row.txt",'w+') as fp:
    s=fp.readlines()
    for row in s:
        if row[0]!='#':
            print(row,'\n')

 

5、利用os模块读取data文件夹中的所有数据文件,并将其名字前面统一加上“文件操作”。

import os
oldname=os.listdir('.\data')
os.chdir('.\data')# 修改当前py文件所在位置
for name in oldname:
   os.rename(name, "文件操作-"+name)

6.打开一个英文的文本文件,将该文件中的每个英文字母加密后写入到一个新文件。加密的方法是:将A变成B,B变成C,Y变成Z,Z变成A;a变成b,b变成c,其他字符不变化

with  open("abc.txt",'w+') as fp:
    for i in fp:
        if i=='A':
            i='B'
        if i=='B':
            i='C'
        if i=='Y':
            i='Z'
        if i=='Z':
            i='A'
        if i=='a':
            i='b'
        if i=='b':
            i='c'
    print(fp)

 

 

 

 

 

 

 

 


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐