1. 程式人生 > 其它 >python題目總結2

python題目總結2

實驗四 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)