Day 7 - Beginner - Hangman

會議記錄

時間: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才學會:sweat:

Sky:例如 Day5 的問題,先提供3個字串,等程式告一段落後,再導入全部的字串。
這個例子可能不是很好,但這類小技巧,其實經常會用到。

Sky:以機器人走迷宮那一章為例,我看到這個問題的簡化方式是:

  1. 機器人在每一格,判斷下一步怎麼走,然後走一步。
  2. 一個 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 :pleading_face:
剛剛查了一下 是可以用 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(可以上網查詢 語法 及 函式如何使用),可以寫出一樣功能(方法不拘)的程式嗎?

1個讚

7.72 最後一段我是用
先設定answer = list(chosen_word)

if display == answer:
    end_of_game = True
    print("Good Job!")
1個讚