假設你要去瑞士玩, 朋友請你帶三個東西, 你查到瑞士法郎的價格是
[3000, 2500, 100]
Google 一下, 發現今天滙率為
1法郎 = 31.4862596台幣
試著把這三個物品的價格換成台幣, 再存起來。
price = [3000, 2500, 100]
c = 31.4862596
price_tw = []
for p in price:
ptw = p*c
price_tw.append(ptw)
print(price_tw)
[94458.7788, 78715.649, 3148.62596]
st = '23,68,99'
st.split(',')
['23', '68', '99']
s1 = st.split(',')
s2 = []
for x in s1:
k = int(x)
s2.append(k)
s2
[23, 68, 99]
當然, 如果對程式熟悉, 我們也可能很多變數不設就直接用。
s2 = []
for x in st.split(','):
s2.append(int(x))
s2
[23, 68, 99]
繼然我們換成數字了, 不如來試著求 [23, 68, 99] 之和。
s = 0
for k in s2:
s = s + k
print('總和為', s)
總和為 190
其實求一個串列中所有數字的和, Python 有快速指令...
sum(s2)
190
不論要看一個串列, 還是一個字串的長度, 我們都可以用 len
指令。
len(s2)
3
mylist = list('ABCD')
mylist
['A', 'B', 'C', 'D']
想好策略, 就是由索引 -1, -2, ..., -n 取出 mylist
裡的元素, 一一放入新的 newlist
。
n = len(mylist)
newlist = []
# 需要產生 1, 2, 3, ..., n 的 list -> range(1, n+1)
for i in range(1, n+1):
newlist.append(mylist[-i])
newlist
['D', 'C', 'B', 'A']
成功了!
有時我們看到一個問題, 不要馬上開始寫程式, 先想想中間的邏輯, 然後想想我們的策略, 再把程式寫出來!
接著我們來挑戰很類似的問題, 這字把字串倒過來!
mystr = 'ABCD'
n = len(mystr)
newstr = ''
for i in range(1, n+1):
newstr = newstr + mystr[-i]
newstr
'DCBA'
所以整個架構基本上是一樣的。
在 Python 中, 要把一個串列或字串倒過來, 其實不用這麼麻煩...
mylist[::-1]
['D', 'C', 'B', 'A']
mystr[::-1]
'DCBA'
我們現在要進入 Python 基礎篇最後一個、也是相當重要的主題, 就是函式的寫法。
假設我們要做一個簡單的函數, 輸入 $x$, 輸出 $x^2$。
def square(x):
return x**2
square(3)
9
寫成函式的好處是可以一直重覆使用! 剛開始大家的疑問可能是 return
是什麼意思, 我們再用另一個幾乎一樣的函式來說明。
def 平方(x):
print(x**2)
平方(3)
9
耶, 這看起來一模一樣! 有什麼差別呢? 答案是有 return
函式會回傳一個值回來, 沒有的話, 函式不會回傳任何東西。我們看個例子就更明白。
a = square(87)
b = 平方(87)
7569
看來 a 和 b 應該是一樣?
a
7569
b
結果是 a 真的會變成 87 的平方, 但 b 沒有任何值! 因為 "平方" 這個函數沒有任何值...
接著我們用新學會的反轉字串 (串列), 做成一個函數。
def reverse(s):
return s[::-1]
reverse('apple')
'elppa'
reverse(['a', 'b', 'c', 'd'])
['d', 'c', 'b', 'a']
很神奇的是, 這個函數不管是對串列或是對字串都是一體適用的!
接著我們想做一個猜數字遊戲, 並且把它設計成一個函數。為了這個, 我們介紹從 random
套件庫來的 randint
指令。
電腦從 1-100 之間「想」一個數字。玩家開始猜電腦的數字, 電腦回饋「太大」或「太小」, 直到猜對為止。
from random import randint
def game():
ans = randint(1, 100)
guess = -1
while guess != ans:
guess = int(input("請輸入一個數字: "))
if guess>ans:
print("太大了!")
elif guess<ans:
print("太小了!")
else:
print("太神了!")
game()
請輸入一個數字: 50 太大了! 請輸入一個數字: 30 太大了! 請輸入一個數字: 15 太小了! 請輸入一個數字: 20 太小了! 請輸入一個數字: 25 太大了! 請輸入一個數字: 23 太小了! 請輸入一個數字: 24 太神了!
現在我們想要玩了一盤之後, 能問要不要再玩一次。這時可以發現, 我們把遊戲寫成一個函數就很方便!
play = True
while play:
game()
print("ヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )ノ")
again = input("再玩一次?")
if again == 'no':
play = False
請輸入一個數字: 80 太大了! 請輸入一個數字: 40 太大了! 請輸入一個數字: 20 太大了! 請輸入一個數字: 10 太大了! 請輸入一個數字: 5 太小了! 請輸入一個數字: 7 太神了! ヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )ノ 再玩一次?yes 請輸入一個數字: 50 太小了! 請輸入一個數字: 70 太小了! 請輸入一個數字: 80 太小了! 請輸入一個數字: 90 太小了! 請輸入一個數字: 99 太小了! 請輸入一個數字: 100 太神了! ヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )ノ 再玩一次?no
我們現在準備存成一個 Python 檔案。Python 檔一般以 .py
結尾, 要執行在終端機 (Anaconda Prompt) 打入
python 檔名.py
就可以!
看了一下, 我們這次需要存的輸入格有 35, 36, 39 三行。可以用魔術指令 %save
來儲存。
%save "guessing_game.py" 35-36 39
The following commands were written to file `guessing_game.py`: from random import randint def game(): ans = randint(1, 100) guess = -1 while guess != ans: guess = int(input("請輸入一個數字: ")) if guess>ans: print("太大了!") elif guess<ans: print("太小了!") else: print("太神了!") play = True while play: game() print("ヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )ノ") again = input("再玩一次?") if again == 'no': play = False
於是我們就可以在終端機 (或 Windows 下的 Anaconda Prompt), 確定是在這個 `guessing_game.py' 這個資料夾下, 打入
python guessing_game.py
就可以執行了!