[Day04] 使用者輸入輸出與字串物件操作


請先在 Accupass 活動通報名,並參考課程兌換教學完成課程兌換。


問題討論區
加入問題討論
作業任務區
提交作業任務


Tammy832 Nov 30, 2019

老師您好,想請教該課程內容:

  1. 新式字串格式化(format())有提到「也可以使用名稱來指定變數變換順序」,我看完程式碼,還是不明白,可以請老師更詳細說明嗎?
  2. 字串插值提到「新的字串插值語法更為強大的點是,可以在裡面嵌入任何 Python 的運算式」,我想知道為什麼不要直接打print('x + y =', x + y)?單純覺得這樣打蠻直覺的XD
  3. 字串切片 slice的範例說明,有一個程式碼如下:
    # 起始值為 index 1:y,結束為 index 4(但不包含結束 index),間隔值為 2。所以取出子字串為 yh
    print(language[1:3:2])
    我拿去跑的時候,發現取出子字串為y耶><
  4. 搜尋字串 find / rfind,有兩種找法,我試過如果我用rfind下去找,為什麼回傳值還是從左開始算呢?(我以為會是從右開始算)我想知道使用rfind的時機點?
    以上問題,請老師多指教了,謝謝 :)
SHUKAIYANG Dec 01, 2019

Tammy832 您好
我不是老師,但看到第一個問題,那時我看得時候try了一下,我的想法是因為''內的{}已寫好那一格的{}要對應什麼,
所以format()內的寫法是name=name,text=text,會印出hello Leo, hello world
若把name=text, text=name,則會印出hello world, hello Leo

name = 'Leo'
text = 'world'
print('hello {name}, hello {text}'.format(name=name, text=text))

chuangwenyang Dec 01, 2019

我也不是老師,但回覆你第二題之後

  1. 當然可以,也很直覺,但是python基本上提供很多種寫法,我自己是覺得習慣,然後能寫得出來就好
  2. 我想是課程內容寫錯了,老師要寫的應該是print(language[1:4:2]) (因為他說在4終止),這樣跑出來的結果就會是yh (搜尋2-4個字母,2個間隔搜索,輸出第1,3個字母,也就是yh)
  3. 我也有一樣的問題
odderbox Dec 01, 2019

我也不是老師,
不過第四的答案,個人的見解是因為index是固定的,就是從左到右由0開始。

例如:找從y開始到o前。(找從第一個y開始到第一個o前)
statement = 'Python'
print(statement[statement.find('y'):statement.find('o')])
就會給出yth
那如果今天的字串可能有重複
statement = 'PythonPythonPython'
print(statement[statement.find('y'):statement.find('o')])
一樣只有rth
但使用rfind就會是 找從第一個y開始到最後一個o前
print(statement[statement.find('y'):statement.find('o')])
ythonPythonPyth
我猜是這樣,不對請鞭小力。

https://repl.it/@oddbox/slice-find-test

Tammy832 Dec 02, 2019

太感謝上面的同學了!! get到很多不一樣的想法~ 關於第四點加上爬文之後,如同最後一位同學所說的。
第四點說明:https://www.tutorialspoint.com/python/string_rfind.htm
再次謝謝上面的同學 :)

happycoder Dec 03, 2019

您好

看到許多學員主動查詢資料,互相交流分享經驗,教學相長真的很棒,這就是共學營的精神呢!

關於您的問題回覆如下:

  1. 新式字串格式化(format())有提到「也可以使用名稱來指定變數變換順序」,我看完程式碼,還是不明白,可以請老師更詳細說明嗎?

    這部份有更新範例,應該可以更清楚,主要對比在於以下這種沒有指定屬性需要按照順序:

     name = 'Leo'
     text = 'world'
     print('hello {}, hello {}'.format(name, text))
    

    以下參數有指定屬性對應值,則不用按照參數順序:

     name = 'Leo'
     text = 'world'
    
     # 雖然 text 在參數時寫在前面但不影響先顯示 name 再顯示 text
     print('hello {name}, hello {text}'.format(text=text, name=name))
    
  2. 字串插值提到「新的字串插值語法更為強大的點是,可以在裡面嵌入任何 Python 的運算式」,我想知道為什麼不要直接打print('x + y =', x + y)?單純覺得這樣打蠻直覺的XD

    這部分編排上有將字串格式化順序微調到最後。這兩個是不同層面的東西:其中 print() 是負責輸出到終端機畫面的函式,主要區別的是 print() 只是負責輸出的函式,要輸出什麼不是它關心的。而通常字串格式化用於將變數(可以根據不同情境改變)整合到字串中
    若是沒有使用字串格式化則需要使用 + 號來串連字串和變數(通常這種方式效能較差),等到後面課程會需要把變數當成參數傳入函式中就會更清楚兩者差異。
    參考範例可以更清楚理解兩者差異(print() 只是負責輸出的函式,當你要將變數和字串整合時需要的是字串格式化):

     age_1 = 10
     age_2 = 7
    
     text_1 = 'I am ' + str(age_1 + age_2) + ' year old'
     print(text_1)
    
     text_2 = f'I am {age_1 + age_2} year old'
     print(text_2)
    
  3. 這部份為誤植,已經更新:print(language[1:4:2]),謝謝您~

  4. 已有更新 rfind 範例:
    從以下的範例我們可以更清楚看到兩者的差異(注意:index 都是從左開始,首位為 0):

     text = 'Python is cute. Python is lovely.'
    
     # 1
     print(text.find('ython'))
     # 17
     print(text.rfind('ython'))
    

    希望有回答到您的問題~
    謝謝您,加油加油~:)

moonlight76856e4 Dec 03, 2019

老師好,我有問題。
以下截圖是字串差值、還有作業任務給的隨堂練習:字串格式化的解答。
我想問,為何能用字串差值印出結果,但用字串格式化的方式卻沒辦法。
Q1
Q2

happycoder Dec 03, 2019

應該是 typo:

print(f'hello, {username}')

已修正,謝謝您:)