惠州網(wǎng)站建設(shè) 翻譯6旅游搜索量環(huán)比增188%
目錄
- 前言
- 1.進(jìn)制轉(zhuǎn)換
- 2.字符串加密的實(shí)現(xiàn)
- 3.猜拳游戲
- 4.多種方法計(jì)算π
- 尾語(yǔ) 💝
前言
嗨嘍~大家好呀,這里是魔王吶 ? ~!
1.進(jìn)制轉(zhuǎn)換
功能:
獲取十進(jìn)制整數(shù)的二進(jìn)制串,相當(dāng)于內(nèi)置函數(shù)bin。
算法分析:
-
對(duì)2輾轉(zhuǎn)相除,直到商為0
-
每次所得余數(shù)逆序即可
流程圖繪制
測(cè)試驅(qū)動(dòng),書(shū)寫(xiě)測(cè)試用例:
>>> convert(13)
'1101'
>>> convert(1)
'1'
>>> convert(0)
'0'
>>> convert(67)
'1000011'
>>> convert(15)
'1111'
代碼實(shí)現(xiàn):
def convert(n):"""添加上述測(cè)試用例"""s = ""while n != 0:r = n % 2s = str(r) + sn //= 2return sif __name__ == "__main__":import doctestdoctest.testmod(verbose=True)
運(yùn)行上述測(cè)試,可以看到0的二進(jìn)制串沒(méi)通過(guò)測(cè)試,
原因是s默認(rèn)為空串,因而傳入0時(shí)得到的將是空串。
我們可以在返回值時(shí),使用三元運(yùn)算符處理即可,return s if s != “” else “0”
。
擴(kuò)展:十進(jìn)制轉(zhuǎn)任意進(jìn)制
-
進(jìn)制:變化的是數(shù)碼和基數(shù)
-
基數(shù)我們可以通過(guò)參數(shù)傳入來(lái)解決
-
數(shù)碼我們可以通過(guò)定義碼元串來(lái)完成,然后通過(guò)索引訪問(wèn)即可
代碼實(shí)現(xiàn):
def convert(num, base):""">>> convert(13, 2)'1101'>>> convert(23, 16)'17'>>> convert(23, 8)'27'>>> convert(30, 16)'1E'"""codes = "0123456789ABCDEF"s = ""while num != 0:r = num % bases = codes[r] + snum //= basereturn s if s != "" else "0"if __name__ == "__main__":import doctestdoctest.testmod(verbose=True)
2.字符串加密的實(shí)現(xiàn)
功能:
對(duì)英文串進(jìn)行加密,規(guī)則英文字母循環(huán)右移n位,不失一般性,此處n設(shè)為3
算法分析:
-
chr,根據(jù)ASCII碼獲取字符;
-
ord,獲取字母的ASCII碼
循環(huán)右移,即越界翻轉(zhuǎn),z完后再到a,即(ord(ch) + 3 - 0x61) % 26 + 0x61
。
流程圖繪制
測(cè)試先行:
>>> encrypt("abc")
'def'
>>> encrypt("xyz")
'abc'
>>> encrypt("Abc")
'Def'
>>> encrypt("a1b2c3")
'd1e2f3'
>>> encrypt("abc ABC")
'def DEF'
代碼實(shí)現(xiàn):
def encrypt(p):"""添加上述測(cè)試用例"""s = ""for ch in p:code = (ord(ch) - 0x61 + 3) % 26 + 0x61s += chr(code)return sif __name__ == "__main__":import doctestdoctest.testmod(verbose=True)
運(yùn)行上述測(cè)試,前2個(gè)通過(guò),后面3個(gè)失敗。
原因分析:
大寫(xiě)字母處理不對(duì),代碼默認(rèn)基礎(chǔ)字母是‘a(chǎn)’。
只需要增加base變量,根據(jù)字母是大寫(xiě)還是小寫(xiě)來(lái)初始化,即base = 0x41 if ch.isupper() else 0x61
,將該行插入到第7行前,然后把后面行中出現(xiàn)的0x61修改為base即可。
再運(yùn)行測(cè)試,前3個(gè)通過(guò)。
根據(jù)題意,對(duì)英文字母進(jìn)行加密,非英文字母我們保持不變即可。
利用字符串對(duì)象提供的isalpha方法進(jìn)行分支處理,
加密方法的完整代碼如下:
def encrypt(p):"""添加上述測(cè)試用例"""s = ""for ch in p:if not ch.isalpha():s += chcontinuebase = 0x41 if ch.isupper() else 0x61code = (ord(ch) - 0x61 + 3) % 26 + 0x61s += chr(code)return s
注意:Python字符串的isalpha方法,支持unicode字符,因而中文也是字符,
這將導(dǎo)致上述代碼無(wú)法正確處理中文。
我們可以通過(guò)自己定義is_letter函數(shù)來(lái)實(shí)現(xiàn)英文字母的判斷。
3.猜拳游戲
功能:
玩家與計(jì)算機(jī)“剪刀石頭布”,三局兩勝(平局不算),最后輸出獲勝方。
計(jì)算機(jī)出拳,使用random庫(kù)隨機(jī)產(chǎn)生;玩家由鍵盤(pán)輸入。
random庫(kù):
randrange函數(shù)
:和range函數(shù)的參數(shù)一樣,在該范圍產(chǎn)生一個(gè)隨機(jī)數(shù)
choice函數(shù)
:抽取一個(gè)
choices函數(shù)
:有放回抽樣
sample函數(shù)
:無(wú)放回抽樣
seed函數(shù)
:默認(rèn)系統(tǒng)時(shí)間作為種子。種子相同,則產(chǎn)生相同隨機(jī)數(shù)列。
邏輯判斷優(yōu)化:
建立映射:0表示scissor,1表示stone,2表示cloth
觀察可得,(x+1)%3 == y,表示y勝;否則,x!=y,表示x勝
代碼實(shí)現(xiàn)
import randomdef compare(computer, player):choices = ["scissor", "stone", "paper"]infos = ["it is a draw.", "computer win!", "player win!"] wid = 0if computer == (player + 1) % 3:wid = 1elif computer != player:wid = 2return wid, infos[wid] + f"{choices[computer]} VS {choices[player]}"def run(): result = [0, 0, 0]while True:computer = random.choice([0, 1, 2])player = int(input("please input your choice:"))wid, info = compare(computer, player)print(info) result[wid] += 1 if max(result[1], result[2]) == 2: breakprint(f"game over!{result[1]}:{result[2]}")if __name__ == "__main__":run()
程序運(yùn)行情況如下:
please input your choice:0
computer win!stone VS scissor
please input your choice:0
computer win!stone VS scissor
game over!2:0
>>> please input your choice:0
player win!paper VS scissor
please input your choice:1
player win!scissor VS stone
game over!0:2
>>> please input your choice:0
it is a draw.scissor VS scissor
please input your choice:0
computer win!stone VS scissor
please input your choice:0
player win!paper VS scissor
please input your choice:0
player win!paper VS scissor
game over!1:2
4.多種方法計(jì)算π
功能:
數(shù)列方式求π:π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9......
通項(xiàng)分析:
-
分子為1,分母為奇數(shù)2n-1,正負(fù)交替
-
計(jì)算項(xiàng)數(shù)越多,精度越高
代碼實(shí)現(xiàn)
def calc(n):s, sign = 0, 1for i in range(1, n+1):item = sign / (2*i - 1)s += item sign *= -1 #正負(fù)交替return 4 * sif __name__ == "__main__":s = calc(1000000)print(f"{s}")
運(yùn)行該程序,可以得到π值為:3.1415916535897743。
增加循環(huán)次數(shù),可以提升精度,但運(yùn)行時(shí)間會(huì)增加,請(qǐng)大家自行測(cè)試。
擴(kuò)展練習(xí):
已知數(shù)列,π2/6=1+1/4+1/9+1/16……,編程實(shí)現(xiàn)π的計(jì)算。
劉徽割圓術(shù)求π
割之彌細(xì),所失彌少,計(jì)算正多邊形的面積,就是圓的面積(單位圓的話,就是π的值)
正多邊形就是n個(gè)相同大小的三角形,只需計(jì)算1個(gè)三角形的面積即可
三角形三邊長(zhǎng)容易獲得,再利用海倫-秦九韶公式可以計(jì)算面積: p ( p ? a ) ( p ? b ) ? ( p ? c ) \sqrt{p(p-a)(p-b)*(p-c)} p(p?a)(p?b)?(p?c)?,其中p為周長(zhǎng)的一半。
代碼實(shí)現(xiàn)
import mathdef calc_area(n):angle = 2*math.pi / nx1, y1 = 1, 0x2, y2 = math.cos(angle), math.sin(angle)a = math.sqrt((x1-x2)**2 + (y1-y2)**2) #求兩點(diǎn)距離p = (a+1+1) / 2 #周長(zhǎng)的一半s = math.sqrt(p * (p-a) * (p-1) * (p-1)) #海倫-秦九韶公式return s#學(xué)習(xí)中沒(méi)有資料?可以加我VX:qian97378免費(fèi)領(lǐng)
def run():n = 20000s = calc_area(n)print(n * s)if __name__ == "__main__":run()
運(yùn)行該程序,可得π \piπ的值:3.141592601914085。
擴(kuò)展練習(xí):
利用已知兩邊長(zhǎng)及其夾角求面積公式,完成π \piπ的計(jì)算。
蒙特卡羅投針實(shí)驗(yàn)求π
概率可以用面積之比來(lái)表示
模擬投針實(shí)驗(yàn):
-
單位圓和其外接正方形
-
隨機(jī)投針
-
圓內(nèi)針數(shù)與總針數(shù)的比例等于圓和方形的面積之比
代碼實(shí)現(xiàn)
import random, mathdef calc_area(n):count = 0for i in range(n):x = random.random()y = random.random()d = math.sqrt(x*x + y*y) #到圓心的距離if d < 1: #落入圓內(nèi),則計(jì)數(shù)加1count += 1return count * 4 / ndef run():n = 1000000s = calc_area(n)print(s)if __name__ == "__main__":run()
運(yùn)行程序,1百萬(wàn)次投針得到的π \piπ值為:3.140648,精度不算太高。
尾語(yǔ) 💝
要成功,先發(fā)瘋,下定決心往前沖!
學(xué)習(xí)是需要長(zhǎng)期堅(jiān)持的,一步一個(gè)腳印地走向未來(lái)!
未來(lái)的你一定會(huì)感謝今天學(xué)習(xí)的你。
—— 心靈雞湯
本文章到這里就結(jié)束啦~感興趣的小伙伴可以復(fù)制代碼去試試哦 😝