Python語言基礎04 構造程式邏輯

2022-02-26 21:02:35 字數 4854 閱讀 9140

本文收錄在python從入門到精通系列文章系列

學完前面的幾個章節後,博主覺得有必要在這裡帶大家做一些練習來鞏固之前所學的知識,雖然迄今為止我們學習的內容只是python的冰山一角,但是這些內容已經足夠我們來構建程式中的邏輯。對於程式語言的初學者來說,在學習了python的核心語言元素(變數、型別、運算子、表示式、分支結構、迴圈結構等)之後,必須做的一件事情就是嘗試用所學知識去解決現實中的問題,換句話說就是鍛鍊自己把用人類自然語言描述的演算法(解決問題的方法和步驟)翻譯成python**的能力,而這件事情必須通過大量的練習才能達成。

博主在本章為大家整理了一些經典的案例和習題,希望通過這些例子,一方面幫助大家鞏固之前所學的python知識,另一方面幫助大家了解如何建立程式中的邏輯以及如何運用一些簡單的演算法解決現實中的問題。

警告警告:本篇非常燒腦,建議十八歲之上**;十八歲之下,建議父母陪同**!!!(哈哈哈,開個玩笑~)

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

"""

找出所有水仙花數

version: 0.1

author: along

"""for num in range(100, 1000):

low = num % 10mid = num // 10 % 10high = num // 100

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

#print(low,mid,high)

print(num)

在上面的**中,我們通過整除和求模運算分別找出了乙個三位數的個位、十位和百位,這種小技巧在實際開發中還是常用的。

用類似的方法,我們還可以實現將乙個正整數反轉,例如:將12345變成54321,**如下所示。

"""

正整數的反轉

version: 0.1

author: along

"""num = int(input('

num = '))

reversed_num =0

while num >0:

reversed_num = reversed_num * 10 + num % 10num //= 10

#print(reversed_num,num)

print(reversed_num)

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

"""

《百錢百雞》問題

version: 0.1

author: along

"""for x in range(0,20):

for y in range(0,33):

z = 100 - x -y

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

print('

公雞: %d只, 母雞: %d只, 小雞: %d只

' % (x, y, z))

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

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

"""

craps賭博遊戲

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

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

version: 0.1

author: along

"""from random import

randint

money = 1000

while money >0:

print('

你的總資產為:

', money)

needs_go_on =false

while

true:

debt = int(input('

請下注: '))

if 0 < debt <=money:

break

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

print('

玩家搖出了%d點

' %first)

if first == 7 or first == 11:

print('

玩家勝!')

money +=debt

elif first == 2 or first == 3 or first == 12:

print('

莊家勝!')

money -=debt

else

: needs_go_on =true

while

needs_go_on:

needs_go_on =false

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

print('

玩家搖出了%d點

' %current)

if current == 7:

print('

莊家勝'

) money -=debt

elif current ==first:

print('

玩家勝'

) money +=debt

else

: needs_go_on =true

print('

你破產了, 遊戲結束!

')

注:這個太燒腦了,博主已經破產了(笑哭~)

2.1 生成斐波那契數列的前20個數。
說明:斐波那契數列(fibonacci sequence),又稱**分割數列,是義大利數學家萊昂納多·斐波那契(leonardoda fibonacci)在《計算之書》中提出乙個在理想假設條件下兔子成長率的問題而引入的數列,所以這個數列也被戲稱為"兔子數列"。斐波那契數列的特點是數列的前兩個數都是1,從第三個數開始,每個數都是它前面兩個數的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...。斐波那契數列在現代物理、準晶體結構、化學等領域都有直接的應用。

"""

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

1 1 2 3 5 8 13 21 ...

version: 0.1

author: along

"""a =0

b = 1

for _ in range(20):

a, b = b, a +b

print(a, end='

')

說明:完美數又稱為完全數或完備數,它的所有的真因子(即除了自身以外的因子)的和(即因子函式)恰好等於它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美數。完美數有很多神奇的特性,有興趣的可以自行了解。

"""

找出1~9999之間的所有完美數

完美數是除自身外其他所有因子的和正好等於這個數本身的數

例如: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14

version: 0.1

author: along

"""import

math

for num in range(1, 10000):

result =0

for factor in range(1, int(math.sqrt(num)) + 1):

if num % factor ==0:

result +=factor

if factor > 1 and num // factor !=factor:

result += num //factor

if result ==num:

print(num)

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

"""

輸出2~99之間的素數

version: 0.1

author: along

"""import

math

for num in range(2, 100):

is_prime =true

for factor in range(2, int(math.sqrt(num)) + 1):

if num % factor ==0:

is_prime =false

break

ifis_prime:

print(num, end='

')

python 多程序 04 協程

協程是程式設計師創造出來的 單純的協程沒有作用 需要io操作時候進行切換 才有意義 原理 greenlet import greenlet def f1 print 11 gr2.switch print 33 gr2.switch def f2 print 22 gr1.switch print ...

C語言基礎04

複習 1 資料型別 signed char 1 hhd 128 127 signed short 2 hd 32768 32767 signed int 4 d 正負20億 signed long 4 ld signed long long 8 lld 9天開頭的19位數 unsigned char...

Python基礎 協程

協程是一種使用者態的輕量級執行緒,本質上是單執行緒 協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。使用greenlet實現協程操作,greenlet需要手動進行切換 首先需要使用greenlet建立類似與堆疊空間,然...