會議記錄
時間:2021年2月15日 20:00~20:30
與會人員:@sky @廖玉米 @筑筑_廖 (依筆劃順序)
旁聽人員:@DotTw erickhchow @fengyu_wu @speedthunder Tim(依字母順序)
半導讀:Sky(前一天確認與會人員時,以為沒有初學者,所以沒有特別準備導讀資料)
7-66. How to break a Complex Problem
resource: flow chart image
衍生QA1:流程圖是需要的嗎?
玉米:建議使用
Dot: 流程圖真的蠻好的 公司的流程圖都是描述大模組
其實看到一些新手用心智圖來描述寫法 感覺有點不太好 缺少了順序
Sky:我不會畫細節,一樣只用大模組
衍生QA2:不會看流程圖?
玉米分享:流程圖說明
http://www2.lssh.tp.edu.tw/~hlf/class-1/lang-c/flow/flow-chat.htm
衍生QA3:繪製流程圖工具
衍生QA4:將複雜的問題簡化
先「簡化問題」,找出解決的方向或答案後,再還原問題。
Dot:簡化就只能多看多寫 有些東西也是我刷了一些leetcode才學會
Sky:例如 Day5 的問題,先提供3個字串,等程式告一段落後,再導入全部的字串。
這個例子可能不是很好,但這類小技巧,其實經常會用到。
Sky:以機器人走迷宮那一章為例,我看到這個問題的簡化方式是:
- 機器人在每一格,判斷下一步怎麼走,然後走一步。
- 一個 while loop,還沒到終點時,就執行 1
7-67. Challenge 1 - Picking a Random Words and Checking Answers
包含 7-68. Challenge 1 Solution - How to Check the User’s Answer
參考文件:Python Lists Document
HINT: In Python 3.0, types are classes, so there is no special case for types
小技巧複習:用 print 把值印出來,可以很快知道變數的值,是不是和我們預期的相同,做 debug 的輔助
範例:不確定資料型態是不是和你想像中的相同,可以 print 出來看看
# Print the type of variable
print(type(var))
7-69. Challenge 2 - Replacing Blanks with Guesses
包含 7-70. Challenge 2 Solution - How to Replace the Blanks
複習:註解的快捷鍵 Ctrl + /
display = []
for _ in range(word_length):
display += "_"
...
for position in range(word_length):
letter = chosen_word[position]
if letter == guess:
display[position] = letter
Sky 補充:有些人喜歡程式短。我自己的想法是:如果是常用的語法,程式簡捷的寫法很棒。但如果不是一眼可以看懂的CODE,寧願寫的清楚些,對未來可能接手程式的人(有時是自己)會更好。
7-71. Challenge 3 - Checking if the Player has Won
包含 7-72. Challenge 3 Solution - How to Check if the Player Won
問題:為什麼 Python 不支援 i++ 語法?
重要:變數儲存值的方式,和我們之前討論的不同,我們用其他程式語言來理解python時,沒有注意到兩種程式的背後方式不同。會找時間修改之前的會議記錄。
當我們定義 i = 1000 ,然後 i = i + 1 時,不同語言會作出不同的處理:
C 程式語言(寫法 int i = 1000)會申請一塊內存空間,並給它“綁定”一個固定的名稱 i,同時寫入一個可變的值1000。在這裡,i 的地址以及類型是固定的,而值是可變的(在一定的表示範圍內)。
Python(寫法 i = 1000)也會申請一塊內存空間,但是它會“綁定”給數字1000,即這個1000的地址以及類型是固定的(immutable),至於 i,只是一個名稱標籤貼在1000上,自身沒有固定的地址和類型。
所以當我們令 i “自增”時(i = i + 1),它們的處理是不同的:
C 程式語言,先找到 i 的地址上存的數值,然後令它 +1,操作後新的數值就取代了舊的數值。
Python 的操作過程是把 i 指向的數字 +1,然後把結果綁定到新申請的一塊內存空間,再把名稱標籤 i “貼”到新的數字上。新舊數字可以同時存在,不是取代關係。
參考資料:
7-73. Challenge 4 - Keeping Track of the Player’s Lives
包含 7-74. Challenge 4 Solution - How to Keep Track of the Player’s Lives
將 list 轉為 string的語法補充
# Join all the elements in the list and turn it into a String.
print(f"{' '.join(display)}")
# 如果把空格 ' ' 改為 '串連字串' 再印出來的話,就很容易理解
print(f"{'串連字串'.join(display)}")
參考來源:
# 示範一(將 list 轉為 string,中間加 - 號)
list1 = ['1','2','3','4']
s = "-"
s = s.join(list1) # joins elements of list1 by '-' and stores in sting s
print(s) # join use to join a list of strings to a separator s
Output:
1-2-3-4
# 示範二(將 list 轉為 string)
list1 = ['g','e','e','k','s']
print("".join(list1))
Output:
geeks
7-75. Challenge 5 - Improving the User Experience
包含 7-76. Challenge 5 Solution - How to Add ASCII Art and Improve the UI
import 實際範例:
from hangman_art import stages
from hangman_art import logo
from hangman_words import word_list
關於 import,Angela 附的網站說明不直覺,請參考這篇中文說明
其他分享或QA
swap
Dot:我之前好像不小心寫了swap 今天不小心翻了書才發現python不用 只要a, b = b, a就可以
debug
wufengyou:debug的過程 是個學習的機會
Sky:自己找出問題,和別人直接告訴你哪裡錯,學到的東西差很多。
初學者一定要先思考問題,一步一步用工具或在心中,延著程式碼執行,看看每行code當時變數的值,是否與之前所想的相同(IDE工具或print出來),從頭到尾看過兩次以上,真的找不到問題,再向前輩請教。
經過這樣的步驟,下次遇到類似問題時,才能靠自己解決,否則很可能又是直接問前輩。
記憶體釋放
speedthunder 提到迴圈會不會很占記憶體的問題
Dot:通常re-assign的時候 原本的記憶體就會準備做garbage collect 其他語言是這樣啦
for loop & while loop
Dot:所以教 for loop 的時候沒有順便教 break 嗎 我進度還沒到 loop
剛剛查了一下 是可以用 break 沒錯
speedthunder:還沒教 break
玉米:了解 break 的時侯 continue 和 pass 可以順便了解一下
玉米:通常while迴圈伴隨if-else是為了改變條件狀態好跳出迴圈
不然就是使用for loop讓迴圈有次數限制
For Loop 使用時機
當我們知道一件事情需要執行幾次可以完成時,就可以使用 For Loop 語法,執行我們想要完成的指令。
While Loop 使用時機 (思考 Yes or No )
While Loop 最棒的使用時機在於:我可能無法預測接下來的情況要執行幾次,反正只要條件成立,程式就會不斷執行指令,直到條件不成立為止。
可以參考這個連結,講得蠻詳細的
Sky:質數那章的例子,Angela 是用 for loop,我是用 while loop
while ((prime == True) and (i < number)):
if (number % i == 0):
prime = False
i += 1
給初學者的問題:
空白試紙(沒有 Angela 的註解,開始寫程式時,是完全空白的),open book(可以上網查詢 語法 及 函式如何使用),可以寫出一樣功能(方法不拘)的程式嗎?