好程式設計師Python培訓分享Python系列之分支和迴圈結構的應用

好程式設計師發表於2020-06-23

  好程式設計師 Python培訓分享 Python系列之 分支和迴圈結構的應用 透過上兩節課的學習,大家對Python中的分支和迴圈結構已經有了感性的認識。 分支和迴圈結構 的重要性不言而喻,它 是構造程式邏輯的基礎 ,對於初學者來說也是相對困難的部分。大部分初學者在學習了分支和迴圈結構後都能理解它們的用途和用法,但是遇到實際問題的時候又無法下手; 看懂別人的程式碼很容易,但是要自己寫出同樣的程式碼卻又很難 。如果你也有同樣的問題和困惑,千萬不要沮喪,這只是因為你才剛剛開始程式設計之旅, 你的練習量還沒有達到讓你可以隨心所欲的寫出程式碼的程度 ,只要加強程式設計練習,這個問題遲早都會解決的。下面我們就為大家講解一些經典的案例。

   經典的例子

   尋找水仙花數

  說明 :水仙花數也被稱為超完全數字不變數、自戀數、自冪數、阿姆斯特朗數,它是一個3位數,該數字每個位上數字的立方之和正好等於它本身,例如:

   """

   找出所有水仙花數

   Version: 0.1

   Author: 駱昊

   """

   for num in range(100, 1000):

   low = num % 10

   mid = num // 10 % 10

   high = num // 100

   if num == low ** 3 + mid ** 3 + high ** 3:

   print(num)

   在上面的程式碼中,我們透過整除和求模運算分別找出了一個三位數的個位、十位和百位,這種小技巧在實際開發中還是常用的。用類似的方法,我們還可以實現將一個正整數反轉,例如:將12345變成54321,程式碼如下所示。

   """

   正整數的反轉

   Version: 0.1

   Author: 駱昊

   """

   num = int(input('num = '))

   reversed_num = 0

   while num > 0:

   reversed_num = reversed_num * 10 + num % 10

   num //= 10

   print(reversed_num)

   百錢百雞問題

  說明 :百錢百雞是我國古代數學家 張丘建 在《算經》一書中提出的數學問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?翻譯成現代文是:公雞5元一隻,母-雞3元一隻,小雞1元三隻,用100塊錢買一百隻雞,問公雞、母-雞、小雞各有多少隻?

   """

   《百錢百雞》問題

   Version: 0.1

   Author: 駱昊

   """

   # 假設公雞的數量為x,x的取值範圍是0到20

   for x in range(0, 21):

   # 假設母-雞的數量為y,y的取值範圍是0到33

   for y in range(0, 34):

   z = 100 - x - y

   if 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:

   print(f'公雞: {x}只, 母-雞: {y}只, 小雞: {z}只')

   上面使用的方法叫做 窮舉法 ,也稱為 暴力搜尋法 ,這種方法透過一項一項的列舉備選解決方案中所有可能的候選項並檢查每個候選項是否符合問題的描述,最終得到問題的解。這種方法看起來比較笨拙,但對於運算能力非常強大的計算機來說,通常都是一個可行的甚至是不錯的選擇,只要問題的解存在就能夠找到它。

   CRAPS賭-博遊戲

  說明 CRAPS又稱花旗骰,是美國拉斯維加斯非常受歡迎的一種的桌上賭-博遊戲。該遊戲使用兩粒骰-子,玩家透過搖兩粒骰-子獲得點數進行遊戲。簡化後的規則是:玩家第一次搖骰-子如果搖出了7點或11點,玩家勝;玩家第一次如果搖出2點、3點或12點,莊家勝;玩家如果搖出其他點數則玩家繼續搖骰-子,如果玩家搖出了7點,莊家勝;如果玩家搖出了第一次搖的點數,玩家勝;其他點數玩家繼續搖骰-子,直到分出勝負。

   """

   Craps賭-博遊戲

   我們設定遊戲開始時玩家有1000元的賭注

   遊戲結束的條件是玩家破產(輸光所有的賭注)

   Version: 0.1

   Author: 駱昊

   """

   from random import randint

   money = 1000

   while money > 0:

   print(f'你的總資產為: {money}元')

   needs_go_on = False

   # 下注金額必須大於0小於等於玩家總資產

   while True:

   debt = int(input('請下注: '))

   if 0 < debt <= money:

   break

   # 第一次搖色-子

   first_point = randint(1, 6) + randint(1, 6)

   print(f'玩家搖出了{first_point}點')

   if first_point == 7 or first_point == 11:

   print('玩家勝!')

   money += debt

   elif first_point == 2 or first_point == 3 or first_point == 12:

   print('莊家勝!')

   money -= debt

   else:

   needs_go_on = True

   # 第一次搖色-子沒有分出勝負遊戲繼續

   while needs_go_on:

   needs_go_on = False

   current_point = randint(1, 6) + randint(1, 6)

   print(f'玩家搖出了{current_point}點')

   if current == 7:

   print('莊家勝')

   money -= debt

   elif current == first:

   print('玩家勝')

   money += debt

   else:

   needs_go_on = True

   print('你破產了, 遊戲結束!')

   斐波那契數列

  說明 :斐波那契數列(Fibonacci sequence),通常也被稱作黃金分割數列,是義大利數學家萊昂納多·斐波那契(Leonardoda Fibonacci)在《計算之書》中研究在理想假設條件下兔子成長率問題而引入的數列,因此這個數列也常被戲稱為“兔子數列”。斐波那契數列的特點是數列的前兩個數都是1,從第三個數開始,每個數都是它前面兩個數的和,按照這個規律,斐波那契數列的前10個數是: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 。斐波那契數列在現代物理、準晶體結構、化學等領域都有直接的應用。

   """

   輸出斐波那契數列前20個數

   Version: 0.1

   Author: 駱昊

   """

   # 前兩個數都是1

   a, b = 1, 1

   print(a, b, end=' ')

   # 透過遞推公式算出後面的18個數

   for _ in range(18):

   a, b = b, a + b

   print(b, end=' ')

   列印素數

  說明 :素數指的是隻能被1和自身整除的正整數(不包括1)。

   """

   輸出100以內的素數

   Version: 0.1

   Author: 駱昊

   """

   for num in range(2, 100):

   # 假設num是素數

   is_prime = True

   # 在2到num-1之間找num的因子

   for factor in range(2, num):

   # 如果找到了num的因子,num就不是素數

   if num % factor == 0:

   is_prime = False

   break

   # 如果布林值為True在num是素數

   if is_prime:

   print(num)

   簡單的總結

   還是那句話: 分支結構和迴圈結構非常重要 ,是構造程式邏輯的基礎, 一定要透過大量的練習來達到融會貫通 。剛才講到的CRAPS賭-博遊戲那個例子可以作為一個標準,如果你能很順利的完成這段程式碼,那麼分支和迴圈結構的知識你就已經掌握了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2700352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章