国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python秒算24點,行還是不行?

saucxs / 1630人閱讀

摘要:周末閑來無事,看到隔壁家的老王在和隔壁家的媳婦玩點,就進屋看了看。發現老王是真不行啊,那不行,這也不行。什么是點我們先來約定下老王和他媳婦玩的點規則給定個任意數字,然后通過,將這個數字計算出。

周末閑來無事,看到隔壁家的老王在和隔壁家的媳婦玩24點,就進屋看了看。發現老王是真不行啊,那不行,這也不行。

就連個24點都玩不過他媳婦,給他媳婦氣的,啥都不能滿足,這不能,那也不能。

我坐下來和他媳婦玩了兩把,那都是無出其右,把把贏!

我要走的時候,他媳婦還挽留我多玩幾把,有意思。

為了能讓老王在他媳婦面前抬起頭來,我決定幫他一把……就用python寫了個算24點的玩意,老王對我感激涕零。

什么是24點

我們先來約定下老王和他媳婦玩的24點規則:給定4個任意數字(0-9),然后通過+,-,*,/,將這4個數字計算出24。

小時候玩的都是這個規則,長大了才有根號,才有各種莫名其妙的高級算法,不好玩了,因為我不會。

可能有人會覺得很簡單,但是真的簡單嗎?

比如:

8,3,3,3

7,3,3,3

你能一眼看出來答案嗎?好像真的可以……

大致思路

這樣想,將四個數字進行全排列,在他們之間添加運算符號。

運算符我們需要進行排列組合,因為只有四個數字,所以只需要三個運算符,而且算法符可能會重復,比如三個都是+

再遍歷四個數字的全排列,對每一組數字而言,遍歷所有組合的操作符。最后將數字和操作符進行拼接運算,就可以得到最終結果了。

演示環境

操作系統:windows10

python版本:python 3.7

代碼編輯器:pycharm 2018.2

使用模塊:math,itertools, collections.abc

具體代碼

1、首先我們對所有數字進行去全排列,這里我們使用 itertools.permutations 來幫助我們完成。

iertools.permutations 用法演示

from itertools import permutations

data_list = permutations([1,2,3,4],2)
for data in data_list:
print(data)

結果顯示

(1, 2)
(1, 3)
(1, 4)
(2, 1)
(2, 3)
(2, 4)
(3, 1)
(3, 2)
(3, 4)
(4, 1)
(4, 2)
(4, 3)

permutations 第一個參數是接收一個課迭代的對象,第二個參數指定每次排列時從課迭代對象中選著幾個字符進行排列。也可以不傳入第二個參數,那么默認就是可迭代對象的長度。并且返回一個生成器。

所以我們需要對所有數字進行全排列,就可以像下面這樣寫:

def get_all_data_sequence(data_iter):
    return permutations(data_iter)

2、然后我們需要拿到所有的操作運算符的所有組合方式。這里我們就會使用 itertools.product 函數了。

itertools.product 用法演示

from itertools import product

sequence1 = product("ABCD","xy")
sequence2 = product([0,1],repeat=3)

for sequence in sequence1:
    print(sequence)

print("-"*30)

for sequence in sequence2:
    print(sequence)

結果顯示

("A","x")
("A","y")
("B","x")
("B","y")
("C","x")
("C","y")
("D","x")
("D","y")
------------------------------
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

itertools.product,返回傳入所有序列中笛卡爾積的元祖,repeat參數表示傳入序列的重復次數。返回的是一個生成器。

那么獲取所有的操作運算符就可以通過這個函數來獲取了

def get_all_operations_sequence():
    operations = ["+","-","*","/"]
    return product(operations,repeat=3)

3、現在我們已經拿到了所有可能組合的操作符和數字了,接下來就需要對他們進行拼接了。然后執行運算。

這一步操作我們會用到 itertools.zip_longest()itertools.chain.form_iterable() 函數。

itertools.zip_longest() 用法演示

data = zip_longest([1,2,3,4],["*","-","+"],fillvalue="")
for value in data:
    print(value)

結果顯示

(1, "*")
(2, "-")
(3, "+")
(4, "")

zip_longest() 其實和 python 內置的 zip() 函數用法差不多,只是 zip_longest 是以最長的一個序列為基準,缺失值就使用 fillvalue 參數的值進行填充

itertools.chain.form_iterable() 用法演示

data = zip_longest([1,2,3,4],["*","-","+"],fillvalue="")
data_chain = chain.from_iterable(data)
for value in data_chain:    
    print(value)

結果顯示

1
*
2
-
3
+
4

這里的data是什么樣的大家知道了吧,然后我們將data傳入 chain.form_iterable() 中,它就能將里面的值依次拿出來。

了解了這兩個函數之后,那么我們就可以開始拼接數字和操作運算符了。

def calculate(self):
    """
    計算值,返回對應的表達式和值
    :return:    
    """    
    for data_sequence in get_all_data_sequence():       
        operation_sequences = get_all_operation_sequence()       
        for operation_sequence in operation_sequences:            
            value = zip_longest(data_sequence, operation_sequence, 
        fillvalue="")            
            value_chain = chain.from_iterable(value)           
            calculate_str = ""           
            # 對得到的字符進行拼接成為表達式 calculate_str
            for _ in value_chain:                
                calculate_str += _          
            try:
                result = eval(calculate_str
            # 處理被除數可能為零的情況,然后就直接跳過這次循環
            except ZeroDivisionError:
                continue
            if math.isclose(result, 24):                    
               return calculate_str,result
    return None,None
代碼分析

1、eval() 函數,接受一個字符串,能讓這個字符串當成 python 代碼運行,返回運行的結果。

2、math.isclose():為什么這里需要使用 math.isclose() ,而不是直接使用==運算符呢?這是因為最后算出來的表達式可能有精度問題,例如23.9...或者24.0...等數字,所以我們就需要使用math.isclose()函數來幫助我們判斷兩個數字是否相等了,這個函數就有一個精度范圍。這樣出現上面情況的時候,我們也能匹配得到條件了。

我們運行代碼,然后測試代碼是否能達到我們的需求。

首先我們測試1,2,3,4四個數字,

程序出來了結果 1*2*3*4 24

看來好像我們寫的代碼是正確的

我們再來測試一組數據8,8,3,3.

嗯?我們并沒有得到結果?這四個數字不能運算出24嗎?

8 / ( 3 - 8 / 3 ) 這樣組合可以吧,為什么沒有算出來這種結果呢?

這是因為我們沒有考慮括號的原因。括號是可以改變運算優先級的。所以我們得把括號考慮進去。

那么想一下括號最多可以有幾個呢?怎樣給我們的表達式添加括號呢?

在4個數字的運算中,括號最多只能有三個。

并且,在這里,我們使用一種簡單的方法添加括號,我們把所有可能出現括號的情況全部羅列出來,然后在將得到的運算表達式拼接進去。

可能大家會覺得羅列出所有括號出現的情況不現實,因為有很多情況

其實不然,當我們去羅列的時候,你就會發現,只有11種情況。

FORM_STRS = [
    # 數字 運算符 數字 運算符 數字 運算符 數字
    # 一個括號 的情況
    "(%s %s %s) %s %s %s %s",
    "(%s %s %s %s %s) %s %s",
    "(%s %s %s %s %s %s %s)",
    "%s %s (%s %s %s) %s %s",
    "%s %s (%s %s %s %s %s)",
    "%s %s %s %s (%s %s %s)",
    # 兩個括號 的情況
    "(%s %s %s) %s (%s %s %s)",
    "( (%s %s %s) %s %s) %s %s",
    "( %s %s (%s %s %s)) %s %s",
    "%s %s ((%s %s %s) %s %s)",
    "%s %s (%s %s (%s %s %s))",
    # 三個括號是重復的,就不用羅列出來了
]

然后我們對得到的表達式在進行遍歷拼接,然后我們再運算表達式。

這樣我們就能得出正確的結果了

代碼寫完了,終于可以開始和媳婦,哦不,老王家的媳婦玩起來了

代碼已全部上傳至Github:https://github.com/MiracleYou...

關注公眾號「Python專欄」,更多好玩有趣的Python等著你

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45256.html

相關文章

  • 假裝Python高手,把類這樣改,真刺激!

    摘要:今天我們來說一個非常實用的例子,小菜接到組長老王的一個任務,安排一個新的活,這個活是這樣的老王小菜啊,你幫我寫一個登入腳本,跑十幾條命令到服務器上,然后存一下日志。這個時候,小菜偷偷的瞄了一眼組長老王,常舒一口氣,總于寫完了。 Python學了好幾年,發現功力還是那樣,很多同學經常這樣抱...

    dance 評論0 收藏0
  • 八皇后,回溯與遞歸(Python實現)

    摘要:八皇后問題是十九世紀著名的數學家高斯年提出。同時可以擴展為九皇后,十皇后問題。解決方案回溯與遞歸。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只占用一個棧幀,不會出現棧溢出的情況。 八皇后問題是十九世紀著名的數學家高斯1850年提出 。以下為python語言的八皇后代碼,摘自《Python基礎教程》,代碼相對于其他語言,來得短小且一次性可以打印出92種結果。...

    TZLLOG 評論0 收藏0
  • 30歲零基礎自學編程,先學哪種語言最好?

    摘要:大學,光學工程研究生畢業,和程序猿完全不搭邊。那怎么辦,試著學一學唄,學習才是程序猿的天性。所以我在想程序猿是不是都需要新知識刺激一下,才能保持興奮的頭腦。有句話說的很對程序猿就像好奇的貓,追著毛球的線頭玩,最后一個毛球在腦袋里攪漿糊。 說說我自己的經歷。211大學,光學工程研究生畢業,和程序猿完全不搭邊。 畢業后進了成都某國字頭研究所,在行業里摸爬滾打了四年,2018年機緣巧合在家養...

    xietao3 評論0 收藏0
  • 從SHAttered事件談安全

    摘要:從事件談安全大新聞在剛剛過去的年月日,和的研究人員公開了個文件,我也第一時間下載并按提示檢查了的校驗值。這個簡單的事實轟動了安全界,因為這說明世界上首次實際意義上公開的的碰撞試驗取得了成功。 從SHAttered事件談安全 大新聞? 在剛剛過去的2017年2月23日,Cryptology Group at Centrum Wiskunde & Informatica (CWI)和Goo...

    zhangke3016 評論0 收藏0

發表評論

0條評論

saucxs

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<