python題目總結2
實驗四 Python組合資料型別
- 建立列表以列表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)
- 編寫程式,將列表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)
- 分別使用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,
- 編寫程式,刪除一個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)
-
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))
-
編寫程式,輸入字串,將其每個字元的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)
- (選做)建立列表,內容為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)
- 使用列表實現篩選法求素數。
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的數字')
- 編寫程式,求列表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)
- 建立一個空字典 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)
- 已知一個字典包含若干員工資訊(姓名和性別),請編寫一個程式,刪除性別為男的員工資訊。
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)
- (選做)請編寫一個程式,使用字典儲存學生資訊,學生資訊包括學號和姓名,請根據學生學號從小到大輸出學生的資訊。提示:使用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))
- (選做)請編寫一個程式,用於統計字串中每個字母的出現次數(字母忽略大小寫,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)
-
實驗五 函式設計
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))
- 設計一個函式,實現輸入一個五位數的正整數(程式要對輸入資料的合法性進行檢查),對輸入的資料加密後再返回,加密規則:每位數字都加上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))
- 請編寫一個程式,使用字典儲存學生資訊(自己編寫至少十個學生的資訊),學生資訊包括學號和姓名,請根據學生學號從小到大輸出學生的資訊。提示:使用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、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))
- 編寫程式,定義一個求 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次反彈多高。定義全域性變數Sn和Hn分別儲存小球經過的路程和第n次的高度。主函式輸入n的值,並呼叫cal函式計算輸出Sn和Hn的值。
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))
實驗六 面向物件的程式設計
- 設計一個圓類,包括圓心位置、半徑、顏色等屬性。編寫構造方法,計算周長和麵積。
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()))
- 設計一個課程類,包括課程編號、課程名稱、任課教師、上課地點等屬性,把上課地點變數設為私有的,增加構造方法和顯示課程資訊的方法。
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()
- 設計一個描述自由落體運動的類,要求能獲得任意時刻的速度及位移,並進行測試。已知重力加速度為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()))
- 設計一個二維向量類,實現向量的加法、減法及向量與標量的乘法和除法運算。
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的類,這個類包括:
- 一個引數為a、b、c的構造方法;
- 一個名為 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 設計一個整形陣列的封裝類,要求實現下列功能:
- 顯示全部陣列資料
- 顯示從某位置開始的一段連續陣列資料
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())
實驗七 異常處理
- 從鍵盤輸入一個整數,求100除以它的商,並顯示輸出。要求對從鍵盤輸入的數值進行異常處理。
try: num=int(input("請輸入一個整數")) x=100/num print(x) except ValueError: print("輸入有誤,請重新輸入")
-
程式設計實現索引超出範圍異常 Index Error型別。例如:chars=["a","b",100,-37,2]
try: chars=["a","b",100,-37,2] chars[5]='k' except IndexError: print("索引超出範圍")
-
錄入一個學生的成績,把該學生的成績轉換為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失敗,請注意範圍")
-
.(選做)定義一個 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)
- 假設成年人的體重和身高存在此種關係:身高(釐米)-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)
-
.(選做)設計一個一元二次方程類,併為這個類新增異常處理。
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)
實驗八 檔案處理
實驗要求:新建一個資料夾命名為“學號+姓名”格式命名,以下所有實驗程式碼均儲存在此此資料夾。
- 建立檔案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)