python 习题
使用蒙特-卡羅方法計算圓周率近似值
蒙特-卡羅方法是一種通過概率來得到問題近似解的方法。假設又一塊邊長為2的正方形木板,上面畫一個單位圓,然后隨意往木板上扔飛鏢,落點坐標(x,y)必然在木板上(更多的是落在單位圓內),如果扔的次數足夠多,那么落在單位圓內的次數除以總次數再乘以4,這個次數會無限接近圓周率的值。
from random import random times = int(input('請輸入擲飛鏢次數:')) hits = 0 for i in range(times):x = random()y = random()if x*x+y*y<=1 :hits += 1 print(4.0*hits/times)求素數
1.使用列表實現篩選法
maxNumber = int(input('請輸入一個大于2的自然數:')) lst = list(range(2,maxNumber)) # 最大整數的平方根 m = int(maxNumber**0.5) for index,value in enumerate(lst):# 如果當前數字已大于最大整數的平方根,結束判斷if value > m:break# 對該位置之后的元素進行過濾lst[index+1:] = filter(lambda x: x%value != 0,lst[index+1:]) print(lst)2.使用集合實現篩選法
maxNumber = int(input('請輸入一個大于2的自然數:')) numbers = set(range(2,maxNumber)) # 最大整數的平方根,以及小于該數字的所有素數 m = int(maxNumber**0.5)+1 primesLessThanM = [p for p in range(2,m)if 0 not in [p%d for d in range(2,int(p**0.5)+1)]] # 遍歷最大整數平方根之內的自然數 for p in primesLessThanM:for i in range(2,maxNumber//p+1):# 在集合中刪除數字所有的倍數numbers.discard(i*p) print(numbers)小明爬樓梯
假設一段樓梯共15個臺階,小明一步最多能上3個臺階。遞推法,遞歸法。
def climbStairs1(n):# 遞推法a = 1b = 2c = 4for i in range(n-3):c,b,a = a+b+c,c,breturn c def climbStairs2(n):# 遞歸法first3 = {1:1,2:2,3:4}if n in first3.keys():return first3[n]else:return climbStairs2(n-1) + \climbStairs2(n-2) + \climbStairs2(n-3) print(climbStairs1(15)) print(climbStairs2(15))蒙蒂霍爾
假設你正參加一個有獎游戲節目,并且有3道門可選:其中一個后面是汽車,另外兩個后面是山羊。你選擇一個門,比如說1號門,主持人當然知道每個門后面是什么并且打開了一個門,比如說3號門,后面是一只山羊。這時,主持人會問你“你想改選2號門嗎?”,然后根據你的選擇確定最終要打開的門,并確定你獲得山羊(輸)或者汽車(贏)。
from random import randrangedef init():# 返回一個字典,鍵為3個門號,值為門后的物品result = {i: 'goat' for i in range(3)}r = randrange(3)result[r] = 'car'return resultdef startGame():# 獲取本次游戲中每個門的情況doors = init()# 獲取玩家選擇的門號while True:try:firstDoorNum = int(input('Choose a door to open:'))assert 0 <=firstDoorNum <= 2breakexcept:print('Door number must be between {} and {}'.format(0,2))# 主持人查看另外兩個門后的物品情況for door in doors.keys()-{firstDoorNum}:# 打開其中一個后面為山羊的門if doors[door] == 'goat':print('"goat" behind the door', door)# 獲取第三個門號,讓玩家糾結thirdDoor = (doors.keys()-{door,firstDoorNum}).pop()change = input('Switch to {}?(y/n)'.format(thirdDoor))finalDoorNum = thirdDoor if change == 'y' else firstDoorNumif doors[finalDoorNum] == 'goat':return 'I win!'else:return 'You win.' while True:print('='*30)print(startGame())r = input('Do you want to try once more?(y/n)')if r == 'n':break猜數游戲
程序運行時,系統生成一個隨機數,然后提示用戶進行猜測,并根據用戶輸入進行必要的提示(猜對了、太大了、太小了),如果猜對則提前結束程序,如果次數用完仍沒有猜對,提前游戲結束并給出正確答案。
from random import randint def guessNumber(maxValue=10,maxTimes=3):# 隨機生成一個整數value = randint(1,maxValue)for i in range(maxTimes):prompt = 'Start to GUESS:(1-10)' if i==0 else 'Guess again:'# 使用異常處理結構,防止輸入不是數字的情況try:x = int(input(prompt))except:print('Must input an integer between 1 and ',maxValue)else:if x == value:# 猜對了print('Congratulations!')breakelif x > value:print('Too big')else:print('Too little')else:# 次數用完還沒猜對,游戲結束,提示正確答案print('Game ouer.FAIL.')print('The value is ',value) guessNumber()抓狐貍游戲
假設一共有一排5個洞口,小狐貍最開始的時候在其中一個洞口,然后玩家隨機打開一個洞口,如果里面有狐貍就抓到了。如果洞口里沒有狐貍就第二天再來抓,但是第二天狐貍會在玩家來抓之前跳到隔壁洞口里。
from random import choice,randrange def catchMe(n=5,maxStep=10):'''模擬抓小狐貍,一共n個洞口,允許抓maxStep次如果失敗,小狐貍就會跳到隔壁洞口'''# n個洞口,有狐貍為1,沒有狐貍為0positions = [0] * n# 狐貍的隨機位置oldPos = randrange(0,n)positions[oldPos] = 1# 抓maxStep次while maxStep >= 0:maxStep -= 1# 這個循環保證用戶輸入的是有效洞口編號while True:try:x = input('今天打算打開哪個洞口(0-{0}):'.format(n-1))# 如果輸入的不是數字,就會跳轉到except部分x = int(x)# 如果輸入的洞口有效,結束這個循環,否則就繼續輸入assert 0 <= x < n,'要按套路來啊,再給你一次機會。'breakexcept:# 如果輸入的不是數字,就執行這里的代碼print('要按套路來啊,再給你一次機會。')if positions[x] == 1:print('成功,我抓到小狐貍啦。')breakelse:print('今天又沒抓到。')# 如果這次沒抓到,狐貍就跳到隔壁洞口if oldPos == n-1:newPos = oldPos - 1elif oldPos == 0:newPos = oldPos + 1else:newPos = oldPos + choice((-1,1))positions[oldPos],positions[newPos] = 0,1oldPos = newPoselse:print('放棄吧,你這樣亂試是沒有希望的。') # 啟動游戲,開始抓狐貍吧 catchMe()漢諾塔問題
據說古代有一個梵塔,塔內有三個底座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子。在移動盤子的過程中可以利用B座,但任何時候3個座上的盤子都必須始終保持大盤在下、小盤在上額順序。如果只有一個盤子,則不需要利用B座,直接將盤子從A移動到C即可。
def hannoi(num,src,dst,temp=None):if num < 1:returnglobal times # 聲明用來記錄移動次數的變量為全局變量# 遞歸調用函數本身,先把除最后一個盤子之外的所有盤子移動到臨時柱子上hannoi(num-1,src,temp,dst)# 移動最后一個盤子print('The {0} Times move:{1}-->{2}'.format(times,src,dst))towers[dst].append(towers[src].pop())for tower in 'ABC': # 輸出3根柱子上的盤子print(tower,':',towers[tower])times += 1# 把除最后一個盤子之外的其他盤子從臨時柱子上移動到目標柱子上hannoi(num-1,temp,dst,src) times = 1 # 用來記錄移動次數的變量 n = 3 # 盤子的數量 towers = {'A':list(range(n,0,-1)),'B':[],'C':[]} # A 表示最初放置盤子的柱子,C是目標柱子,B是臨時柱子 hannoi(n,'A','C','B')凱撒加密
輸入一個字符串,然后輸入一個整數作為凱撒加密算法的密鑰,然后輸出該字符串加密后的結果。
import string def kaisa():s = input('請輸入一個字符串:')k = int(input('請輸入一個整數密鑰:'))lower = string.ascii_lowercaseupper = string.ascii_uppercasebefore = string.ascii_lettersafter = lower[k:] + lower[:k] + upper[k:] + upper[:k]table = str.maketrans(before,after)out = s.translate(table)print(out) kaisa()自定義類模擬三維向量及運算
定義一個三維向量類,并定義相應的特殊方法實現兩個該類對象之間的加、減運算(要求支持運算符+、-),實現該類對象與標量的乘、除運算(要求支持運算符*、/),以及向量長度的計算(要求使用屬性實現)。
class Vector3:# 構造方法,初始化,定義向量坐標def __init__(self,x,y,z):self.__x = xself.__y = yself.__z = z# 與一個向量相加,對應分量相加,返回新向量def __add__(self, anotherPoint):x = self.__x + anotherPoint.__xy = self.__y + anotherPoint.__yz = self.__z + anotherPoint.__zreturn Vector3(x,y,z)# 減去另一個向量,對應分量相減,返回新向量def __sub__(self, anotherPoint):x = self.__x - anotherPoint.__xy = self.__y - anotherPoint.__yz = self.__z - anotherPoint.__zreturn Vector3(x, y, z)# 向量與一個數字相乘,各分量乘以同一個數字,返回新向量def __mul__(self, n):x, y, z = self.__x*n, self.__y*n, self.__z*nreturn Vector3(x,y,z)# 向量除以一個數字,各分量除以同一個數字,返回新向量def __truediv__(self, n):x, y, z = self.__x/n, self.__y/n, self.__z/nreturn Vector3(x, y, z)# 查看向量長度,所有分量平方和的平方根@propertydef length(self):return (self.__x**2 + self.__y**2 + self.__z**2)def __str__(self):return 'Vector3({},{},{})'.format(self.__x,self.__y,self.__z)v1 = Vector3(3, 4, 5) v2 = Vector3(5, 6, 7) print(v1+v2) print(v1-v2) print(v1*3) print(v2/2) print(v1.length)文本文件操作
編寫一個程序demo.py,要求運行該程序后,生成demo_new.py文件,其中內容與demo.py一樣,只是在每一行的后面加上行號以#開始,并且所有行的#符號垂直對齊。
filename = 'demo.py' with open(filename, 'r') as fp:lines = fp.readlines() maxLength = len(max(lines, key=len))lines = [line.rstrip().ljust(maxLength)+'#'+str(index)+'\n'for index, line in enumerate(lines)] with open(filename[:-3]+'_new.py', 'w') as fp:fp.writelines(lines)磁盤垃圾文件清理器
要求程序運行時,通過命令行參數指定要清理的文件夾,然后刪除該文件夾及其子文件夾中所有擴展名為tmp、log、obj、txt以及大小為0的文件。
from os.path import isdir,join,splitext from os import remove,listdir,chmod,statfiletypes = ('.tmp','.log','.obj','.txt')def test2(directory):if not isdir(directory):returnfor filename in listdir(directory):temp = join(directory,filename)if isdir(temp):test2(temp)elif splitext(temp)[1] in filetypes or stst(temp).st_size == 0:chmod (temp,0o777)remove(temp)print(temp,'deleted...') test2(r'D:\test')總結
- 上一篇: 雷军:希望100年后小米也能像徕卡一样成
- 下一篇: 高考生质疑物理成绩只有17.5分 官方回