python 习题
使用蒙特-卡羅方法計(jì)算圓周率近似值
蒙特-卡羅方法是一種通過(guò)概率來(lái)得到問(wèn)題近似解的方法。假設(shè)又一塊邊長(zhǎng)為2的正方形木板,上面畫(huà)一個(gè)單位圓,然后隨意往木板上扔飛鏢,落點(diǎn)坐標(biāo)(x,y)必然在木板上(更多的是落在單位圓內(nèi)),如果扔的次數(shù)足夠多,那么落在單位圓內(nèi)的次數(shù)除以總次數(shù)再乘以4,這個(gè)次數(shù)會(huì)無(wú)限接近圓周率的值。
from random import random times = int(input('請(qǐng)輸入擲飛鏢次數(shù):')) hits = 0 for i in range(times):x = random()y = random()if x*x+y*y<=1 :hits += 1 print(4.0*hits/times)求素?cái)?shù)
1.使用列表實(shí)現(xiàn)篩選法
maxNumber = int(input('請(qǐng)輸入一個(gè)大于2的自然數(shù):')) lst = list(range(2,maxNumber)) # 最大整數(shù)的平方根 m = int(maxNumber**0.5) for index,value in enumerate(lst):# 如果當(dāng)前數(shù)字已大于最大整數(shù)的平方根,結(jié)束判斷if value > m:break# 對(duì)該位置之后的元素進(jìn)行過(guò)濾lst[index+1:] = filter(lambda x: x%value != 0,lst[index+1:]) print(lst)2.使用集合實(shí)現(xiàn)篩選法
maxNumber = int(input('請(qǐng)輸入一個(gè)大于2的自然數(shù):')) numbers = set(range(2,maxNumber)) # 最大整數(shù)的平方根,以及小于該數(shù)字的所有素?cái)?shù) 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)]] # 遍歷最大整數(shù)平方根之內(nèi)的自然數(shù) for p in primesLessThanM:for i in range(2,maxNumber//p+1):# 在集合中刪除數(shù)字所有的倍數(shù)numbers.discard(i*p) print(numbers)小明爬樓梯
假設(shè)一段樓梯共15個(gè)臺(tái)階,小明一步最多能上3個(gè)臺(tái)階。遞推法,遞歸法。
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))蒙蒂霍爾
假設(shè)你正參加一個(gè)有獎(jiǎng)游戲節(jié)目,并且有3道門(mén)可選:其中一個(gè)后面是汽車(chē),另外兩個(gè)后面是山羊。你選擇一個(gè)門(mén),比如說(shuō)1號(hào)門(mén),主持人當(dāng)然知道每個(gè)門(mén)后面是什么并且打開(kāi)了一個(gè)門(mén),比如說(shuō)3號(hào)門(mén),后面是一只山羊。這時(shí),主持人會(huì)問(wèn)你“你想改選2號(hào)門(mén)嗎?”,然后根據(jù)你的選擇確定最終要打開(kāi)的門(mén),并確定你獲得山羊(輸)或者汽車(chē)(贏)。
from random import randrangedef init():# 返回一個(gè)字典,鍵為3個(gè)門(mén)號(hào),值為門(mén)后的物品result = {i: 'goat' for i in range(3)}r = randrange(3)result[r] = 'car'return resultdef startGame():# 獲取本次游戲中每個(gè)門(mén)的情況doors = init()# 獲取玩家選擇的門(mén)號(hào)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))# 主持人查看另外兩個(gè)門(mén)后的物品情況for door in doors.keys()-{firstDoorNum}:# 打開(kāi)其中一個(gè)后面為山羊的門(mén)if doors[door] == 'goat':print('"goat" behind the door', door)# 獲取第三個(gè)門(mén)號(hào),讓玩家糾結(jié)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猜數(shù)游戲
程序運(yùn)行時(shí),系統(tǒng)生成一個(gè)隨機(jī)數(shù),然后提示用戶(hù)進(jìn)行猜測(cè),并根據(jù)用戶(hù)輸入進(jìn)行必要的提示(猜對(duì)了、太大了、太小了),如果猜對(duì)則提前結(jié)束程序,如果次數(shù)用完仍沒(méi)有猜對(duì),提前游戲結(jié)束并給出正確答案。
from random import randint def guessNumber(maxValue=10,maxTimes=3):# 隨機(jī)生成一個(gè)整數(shù)value = randint(1,maxValue)for i in range(maxTimes):prompt = 'Start to GUESS:(1-10)' if i==0 else 'Guess again:'# 使用異常處理結(jié)構(gòu),防止輸入不是數(shù)字的情況try:x = int(input(prompt))except:print('Must input an integer between 1 and ',maxValue)else:if x == value:# 猜對(duì)了print('Congratulations!')breakelif x > value:print('Too big')else:print('Too little')else:# 次數(shù)用完還沒(méi)猜對(duì),游戲結(jié)束,提示正確答案print('Game ouer.FAIL.')print('The value is ',value) guessNumber()抓狐貍游戲
假設(shè)一共有一排5個(gè)洞口,小狐貍最開(kāi)始的時(shí)候在其中一個(gè)洞口,然后玩家隨機(jī)打開(kāi)一個(gè)洞口,如果里面有狐貍就抓到了。如果洞口里沒(méi)有狐貍就第二天再來(lái)抓,但是第二天狐貍會(huì)在玩家來(lái)抓之前跳到隔壁洞口里。
from random import choice,randrange def catchMe(n=5,maxStep=10):'''模擬抓小狐貍,一共n個(gè)洞口,允許抓maxStep次如果失敗,小狐貍就會(huì)跳到隔壁洞口'''# n個(gè)洞口,有狐貍為1,沒(méi)有狐貍為0positions = [0] * n# 狐貍的隨機(jī)位置oldPos = randrange(0,n)positions[oldPos] = 1# 抓maxStep次while maxStep >= 0:maxStep -= 1# 這個(gè)循環(huán)保證用戶(hù)輸入的是有效洞口編號(hào)while True:try:x = input('今天打算打開(kāi)哪個(gè)洞口(0-{0}):'.format(n-1))# 如果輸入的不是數(shù)字,就會(huì)跳轉(zhuǎn)到except部分x = int(x)# 如果輸入的洞口有效,結(jié)束這個(gè)循環(huán),否則就繼續(xù)輸入assert 0 <= x < n,'要按套路來(lái)啊,再給你一次機(jī)會(huì)。'breakexcept:# 如果輸入的不是數(shù)字,就執(zhí)行這里的代碼print('要按套路來(lái)啊,再給你一次機(jī)會(huì)。')if positions[x] == 1:print('成功,我抓到小狐貍啦。')breakelse:print('今天又沒(méi)抓到。')# 如果這次沒(méi)抓到,狐貍就跳到隔壁洞口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('放棄吧,你這樣亂試是沒(méi)有希望的。') # 啟動(dòng)游戲,開(kāi)始抓狐貍吧 catchMe()漢諾塔問(wèn)題
據(jù)說(shuō)古代有一個(gè)梵塔,塔內(nèi)有三個(gè)底座A、B、C,A座上有64個(gè)盤(pán)子,盤(pán)子大小不等,大的在下,小的在上。有一個(gè)和尚想把這64個(gè)盤(pán)子從A座移到C座,但每次只能允許移動(dòng)一個(gè)盤(pán)子。在移動(dòng)盤(pán)子的過(guò)程中可以利用B座,但任何時(shí)候3個(gè)座上的盤(pán)子都必須始終保持大盤(pán)在下、小盤(pán)在上額順序。如果只有一個(gè)盤(pán)子,則不需要利用B座,直接將盤(pán)子從A移動(dòng)到C即可。
def hannoi(num,src,dst,temp=None):if num < 1:returnglobal times # 聲明用來(lái)記錄移動(dòng)次數(shù)的變量為全局變量# 遞歸調(diào)用函數(shù)本身,先把除最后一個(gè)盤(pán)子之外的所有盤(pán)子移動(dòng)到臨時(shí)柱子上hannoi(num-1,src,temp,dst)# 移動(dòng)最后一個(gè)盤(pán)子print('The {0} Times move:{1}-->{2}'.format(times,src,dst))towers[dst].append(towers[src].pop())for tower in 'ABC': # 輸出3根柱子上的盤(pán)子print(tower,':',towers[tower])times += 1# 把除最后一個(gè)盤(pán)子之外的其他盤(pán)子從臨時(shí)柱子上移動(dòng)到目標(biāo)柱子上hannoi(num-1,temp,dst,src) times = 1 # 用來(lái)記錄移動(dòng)次數(shù)的變量 n = 3 # 盤(pán)子的數(shù)量 towers = {'A':list(range(n,0,-1)),'B':[],'C':[]} # A 表示最初放置盤(pán)子的柱子,C是目標(biāo)柱子,B是臨時(shí)柱子 hannoi(n,'A','C','B')凱撒加密
輸入一個(gè)字符串,然后輸入一個(gè)整數(shù)作為凱撒加密算法的密鑰,然后輸出該字符串加密后的結(jié)果。
import string def kaisa():s = input('請(qǐng)輸入一個(gè)字符串:')k = int(input('請(qǐng)輸入一個(gè)整數(shù)密鑰:'))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()自定義類(lèi)模擬三維向量及運(yùn)算
定義一個(gè)三維向量類(lèi),并定義相應(yīng)的特殊方法實(shí)現(xiàn)兩個(gè)該類(lèi)對(duì)象之間的加、減運(yùn)算(要求支持運(yùn)算符+、-),實(shí)現(xiàn)該類(lèi)對(duì)象與標(biāo)量的乘、除運(yùn)算(要求支持運(yùn)算符*、/),以及向量長(zhǎng)度的計(jì)算(要求使用屬性實(shí)現(xiàn))。
class Vector3:# 構(gòu)造方法,初始化,定義向量坐標(biāo)def __init__(self,x,y,z):self.__x = xself.__y = yself.__z = z# 與一個(gè)向量相加,對(duì)應(yīng)分量相加,返回新向量def __add__(self, anotherPoint):x = self.__x + anotherPoint.__xy = self.__y + anotherPoint.__yz = self.__z + anotherPoint.__zreturn Vector3(x,y,z)# 減去另一個(gè)向量,對(duì)應(yīng)分量相減,返回新向量def __sub__(self, anotherPoint):x = self.__x - anotherPoint.__xy = self.__y - anotherPoint.__yz = self.__z - anotherPoint.__zreturn Vector3(x, y, z)# 向量與一個(gè)數(shù)字相乘,各分量乘以同一個(gè)數(shù)字,返回新向量def __mul__(self, n):x, y, z = self.__x*n, self.__y*n, self.__z*nreturn Vector3(x,y,z)# 向量除以一個(gè)數(shù)字,各分量除以同一個(gè)數(shù)字,返回新向量def __truediv__(self, n):x, y, z = self.__x/n, self.__y/n, self.__z/nreturn Vector3(x, y, z)# 查看向量長(zhǎng)度,所有分量平方和的平方根@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)文本文件操作
編寫(xiě)一個(gè)程序demo.py,要求運(yùn)行該程序后,生成demo_new.py文件,其中內(nèi)容與demo.py一樣,只是在每一行的后面加上行號(hào)以#開(kāi)始,并且所有行的#符號(hào)垂直對(duì)齊。
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)磁盤(pán)垃圾文件清理器
要求程序運(yùn)行時(shí),通過(guò)命令行參數(shù)指定要清理的文件夾,然后刪除該文件夾及其子文件夾中所有擴(kuò)展名為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')總結(jié)
- 上一篇: 雷军:希望100年后小米也能像徕卡一样成
- 下一篇: 《Python编程:从入门到实践》速查表