# Python IO ## 輸出 ---- ## ```print()``` 在 ```print()``` 中間放入一段字就能輸出出來 ```python= print("Hi") ``` ```bash Hi ``` ---- 要記得如果是文字的話,要用 ```""``` 或者 ```''``` 包起來 而如果是數字或者運算式的話就不用 ```python= print("Hi") print('Hello') print(1) print(2.5) print((5 * 3 - 7) / 2 ) ``` ```bash Hi Hello 1 2.5 4.0 ``` ---- ## Practice 自己試著輸出點東西吧! ---- 一個 ```print()``` 內也可以放多個要輸出的內容 輸出後會以空格隔開 ```python= print("Hello", "World", 5555) ``` ```bash Hello World 5555 ``` ---- 如果一行太長,可以考慮切成多行 只要換行時在最後加上 ```\``` ```python= print("aaaaaaaaaaa", \ "bbbbbbbbbbb") ``` ```bash aaaaaaaaaaa bbbbbbbbbbb ``` ---- 因為 python 語法的關係,一行只能有一個 ```print()``` 如果真的一行要不止一個的話,中間要加 ```;``` 隔開 ```python= print("Hello"); print("World") ``` ---- 會發現每個 ```print()``` 後都會變到下一行,這是因為 ```print()``` 預設在輸出完都會換行 如果不想換行,可以加上 ```end='<取代換行的東西>'``` ```python= print("Hello", end=' ') print("World", end='') print('.') print("Hello again") ``` ```bash Hello World. Hello again ``` ---- 相同的,中間的空格也可以被取代掉, 在後面加上 ```sep='<想取代的東西>'``` ```python= print("Hello", "World", end='.', sep=',') print(" Bye") ``` ```bash Hello,World. Bye ``` ---- ## 跳脫字元 如果我們要輸出 ```"abc'``` 呢? ```python= print(""abc'") ``` ```bash File "/Users/jonason2004/tmp.py", line 1 print(""abc'") ^ SyntaxError: invalid syntax ``` ---- ```"abc'``` 的雙引號跟包住文字的雙引號配對到了 所以我們要用種方式告訴程式,這個雙引號屬於文字的一部分 ---- ## Solution 在前面加上 ```\``` ```python= print("\"abc\'") ``` ```bash "abc' ``` ---- 這些加上 ```\``` 的字就叫做跳脫字元,是用來避免程式把文字和程式碼混淆的 | 跳脫字元 | Meaning | |--- | --- | | ```\\``` | Backslash(```\```) | | ```\"``` | Double quote(```"```) | | ```\'``` | Single quote(```'```) | | ```\a``` | Beep | | ```\n``` | newline | --- ## 變數 ---- 當程式需要儲存資料時, 會跟記憶體要一段空間來儲存 而為了方便區分, 我們會給這些空間一個別名,也就是變數 ---- ## 指派變數 ``` <變數名字> = <初始值> ``` ``` python= a = 5 b = 0.00001 c = "Word" a = 10 ``` 如果這個變數之前沒出現過,代表宣告了一個變數 否則就是將原本存在的變數指派新的值 ---- 也可以同時做到一次指派多個變數 ```python= a, b, c = 1, 2, 3 # a = 1, b = 2, c = 3 ``` ---- ## 刪除變數 如果不會再用到該變數,就可以把它刪除節省空間 語法:```del <變數> ``` ```python= a = 5 del a print(a) ``` ```bash Traceback (most recent call last): File "/Users/jonason2004/tmp.py", line 3, in <module> print(a) NameError: name 'a' is not defined ``` ---- ## 輸出變數內容 變數也可以放到 ```print()``` 內輸出變數的資料 ```python= a = 100 print(a) ``` ```bash 100 ``` ---- ## 變數命名規則 - 由英文、數字、底線組成 - 不得以數字開頭 - 不能與 Python 內建的保留字相同 ```python= abc_123 = 1 # ok 3pigs = 2 # not ok Happy New Year = 3 # not ok Class # not ok Good! # not ok ``` ---- ## Practice 交換兩個變數的資料 ```python= a = 1 b = 2 # do some magic print(a, b) ``` ```bash 2 1 ``` ---- ## Answer 1 最基本的交換方式 ```python= __tmp = a a = b b = __tmp del __tmp ``` ---- ## Answer2 基於同時指派多個變數來交換兩變數的資料 ```python= a, b = b, a ``` ---- ## 變數型態 雖然我們沒有指定,但每個變數都有各自的型態 - 整數 : int - 浮點數 : float - 布林值(True / False) : bool - 字串 : str - 序列型態 : list, tuple - 集合型態 : set - 對映型態 : dict ---- 查看一個變數的型態 語法:```type(<變數>)``` ```python= a = 5 b = 1.5 c = "Hi" d = True print(type(a), type(b), type(c), type(d)) ``` ```bash <class 'int'> <class 'float'> <class 'str'> <class 'bool'> ``` ---- 在某些狀況下,程式會自動判斷幫忙把變數轉型 有些時候則要自己強制轉型 ```python= a = 5 b = 1.5 print(type(a)) a = a + b print(type(a)) a = int(a) print(a, type(a)) ``` ```bash <class 'int'> <class 'float'> 6 <class 'int'> ``` --- ## 輸入 ---- ## ```input()``` 我們可以用 ```input()``` 來讀取一行輸入 ```input()``` 會將輸入轉成 ```str``` 型態,這時候我們可以用變數去把輸入內容儲存下來 ```python= a = input() ``` ---- ## Example 將輸入的內容輸出出來 ```python= a = input() print(a) ``` ```bash abcde abcde ``` (第一行 abcde 是輸入的內容) ---- ```input()``` 內也可以放一段文字進去,代表在使用者輸入前會先輸出那段文字 ```python= a = input("Enter your input:") print(a) ``` ```bash Enter your input:abcde abcde ``` ---- ## Practice 試著讓使用者輸入一個名字, 之後輸出 ``` Hello, <名字> ``` ```bash Daniel Hello, Danel ``` ---- ## Answer ```python= a = input() print("Hello", end=', ') print(a) ``` ---- ## Practice 在一行內輸入三個字,再一行一行印出來 ```bash apple banana car apple banana car ``` ---- 如果用 ```input()``` ,會把整行讀起來, 這樣就沒辦法把這些字分開了 ---- 我們可以用 ```input.split()``` 來達成 ```python= a, b, c = input().split() print(a, b, c, sep = '\n') ``` 這代表程式會將這行輸入以空白區隔成三段, 每一段分別指派到各自的變數去 ---- ```split()``` 內也可以決定以其他字去切割, 像是如果三個字改成以逗號區隔,就可以寫: ```python= a, b, c = input().split(',') print(a, b, c, sep = '\n') ``` ---- ## 注意 ```split()``` 所切出來的數量要與前面變數的數量一樣 ```python= a, b = input().split() ``` ```bash apple banana car Traceback (most recent call last): File "/Users/jonason2004/tmp.py", line 1, in <module> a, b = input().split() ValueError: too many values to unpack (expected 2) ``` --- ## 運算子與變數型態 ---- ## 常見的運算子 ```+``` 、 ```-``` 、 ```*``` ```python= a = 2 b = 5 print(a + b) print(a - b) print(a * b) ``` ```bash 7 -3 10 ``` ---- ## 除法 在程式語言中,除法有些特殊的規則, 在這裡我們把它細分成整數除法以及一般除法 ---- ## 整數除法 結果只會有整數,如果不能整除就無條件捨去 運算符號為 ```//``` ```python= print(6 // 3) print(-8 // 3) ``` ```bash 2 -3 ``` ---- ## $-8 // 3 = -3$ ? 在 python 中,整數除法的運算規則會遵從除法原理 也就是餘數一定要是小於除數的非負整數 ---- ## 一般除法 我們常見的除法,如果無法整除會有小數點出現 運算符號為 ```//``` ```python= print(6/ 3) print(-8 / 3) ``` ```bash 2.0 -2.666666666665 ``` ---- ## 小數點精准度 我們知道,電腦的資料是透過二進位去儲存的, 但如果是無限循環的小數,甚至是無理數該如何儲存? ---- 因為空間有限,電腦會以一種特殊的格式儲存小數 相對的,就會犧牲掉一些精準度 ---- ## 取餘 顧名思義,就是跟除以某數字的餘數,我們常常唸作 mod 運算符號為 ```%``` ```python= print(11 % 5) ``` ```bash 1 ``` ---- ## 次方 運算符號為 ```**``` ```python= a = 9 b = 1.414 print(a**1.5) print(b**2) ``` ```bash 27.0 1.99939599999997 ``` ---- ## Thinking 在前面的運算子中,加減乘除開方都算常見的,但取餘數實際上會有什麼用途? ---- ## 變數型態 - Example 輸入兩個整數 $a, b$,分別輸出 $a / b, a^b, a - b$ ```bash 100 3 33.333333333336 1000000 97 ``` ---- 會發現如果這樣寫 ... ```python= a = input() b = input() print(a / b) print(a ** b) print(a - b) ``` ```bash 100 3 Traceback (most recent call last): File "/Users/jonason2004/tmp.py", line 3, in <module> print(a / b) TypeError: unsupported operand type(s) for /: 'str' and 'str' ``` 為什麼? ---- 記得剛剛提到的, ```input()``` 會把輸入內容以 ```str``` 型態存起來 這時候就出問題了,兩個字串要怎麼相乘或相除? ---- ## Answer 要先將 $a, b$ 轉為整數才可以做運算 ```python= a = int(input()) b = int(input()) print(a / b) print(a ** b) print(a - b) ``` ---- ## Practice 一支鉛筆 5 元,一打鉛筆 50 元,現在我要買 $n$ 支鉛筆,請你輸出最少要花多少 ```bash 42 180 ``` ---- ## Answer ```python= a = int(input()) print((a % 12) * 5 + (a // 12) * 50) ``` ---- ## Practice 課堂上要將同學分組,座號 1 2 3 第一組、4 5 6 第二組,以此類推 現在輸入一個座號,輸出他應該在第幾組 ```bash 7 3 ``` ```bash 12 4 ``` ---- ## Hint 同一組的座號有什麼關係,除以 3 一樣? 那如果將座號 - 1 再除以 3 呢? ---- ## Answer ```python= a = int(input()) print(((a - 1) // 3) + 1) ``` ---- ## 關係運算子 運算後的型態為布林值 (```True``` / ```False```) - ``` > ``` :大於 - ``` >= ``` :大於等於 - ``` < ``` :小於 - ``` <= ``` :小於等於 - ``` == ``` :等於 - ``` != ``` :不等於 ```python= print(1 > 1, 10 <= 10, "Hi" != "Hello") ``` ```bash False True True ``` ---- ## 邏輯運算子 用來處理布林值的運算 - ```and```:且 - ```or```:或 - ```not```:非 - ```^```:異或 ```python! print((1 < 2) and (10 % 2 == 0), not (1 == 2), \ (1 == 2) or (3 >= 1), (1 < 2) ^ (1 <= 2)) ``` ```bash True True True False ``` ---- ## 如果邏輯運算子不放布林值... ```python= print(1 and 2, 1 or 2) ``` ```bash 2 1 ``` why ? ---- ## Short Circuit 若 ```a and b``` 中 ```a``` 為 ```False``` ,那就不用去看 ```b``` 了 若 ```a or b``` 中 ```a``` 為 ```True``` ,那就不用去看 ```b``` 了 ---- 因此,若: - ```a``` 為 ```True``` - ```a or b``` 的結果為 ```a``` - ```a and b``` 的結果為 ```b``` - ```a``` 為 ```False``` - ```a or b``` 的結果為 ```b``` - ```a and b``` 的結果為 ```a``` ---- ## 哪些東西為 True? - 數字:不為 ```0``` 的皆為 ```True``` - 字串:不為空字串的皆為 ```True``` - 容器:不為空的皆為 ```True``` ---- ## 應用 在 Linux 中,如果指令2需要用到指令1的結果, 我們就可以打 ```指令1 && 指令2``` ---- ## Practice 假如我們定義了 $a \div 0 = 0$, 那麼輸入兩個數字 $a, b$,請你輸出 $a \div b$ ```bash 6 2 3.0 ``` ```bash 19 0 0 ``` ---- ## Answer ```python= a = int(input()) b = int(input()) print(b and a / b) ``` --- ## 註解 ---- 註解在程式中是不會起到任何作用的, 主要是用來讓閱讀程式的人知道這段程式在幹嘛的 ---- 單行註解:以 ```#``` 開頭 多行註解:用 ```"""``` 或 ```'''``` 包起來 ```python= # This is a single line comment """ This is a multiple line comment """ ``` --- ## 其他輸出技巧 ---- ## fstring 如果我們想輸出的內容有變數和文字混合的話,該怎麼辦? ```python= a = input() b = input() # How to print out "Hi, <a>, I am <b>." ? print("Hi ", a, ", my name is ", b, ".", sep='') ``` ```bash Hi Daniel1, my name is Daniel2. ``` 有點太麻煩了 ---- 這時候我們就可以用 fstring 語法: ```python print(f"some text {<變數1>}, some text {<變數2>} ...") ``` ``` some text <變數1的內容>, some text <變數2的內容> ... ``` ---- 以剛剛的例子,我們用 fstring 就可以寫成: ```python= a = "Daniel1" b = "Daniel2" print(f"Hi, {a}, my name is {b}.") ``` ---- ## 限制輸出小數點位數 語法: ```python print("%.<i>f" % 變數) print(f"text {變數:.<i>f} ...") ``` 其中的 ```<i>``` 為要限制輸出到小數點後 ```i``` 位 ---- ## Practice 輸入一個溫度 $f$ ,將 $f$ 從華氏溫度轉為攝氏溫度 $c$ 並輸出 ```<f> F = <c> C``` ![](https://hackmd.io/_uploads/HJXD58-xp.png) ---- ## Answer ```python= f = int(input()) c = (f - 32) * 5 / 9 print(f'{f} F = {c:.2f} C') ``` ---- ## 對齊 設定一個對齊的長度, 如果變數的長度小於對齊長度就將它對齊 ```python= a = 5 print(f'text1,{a:<5},text2') # 向左對齊 print(f'text1,{a:>5},text2') # 向右對齊 print(f'text1,{a:^5},text2') # 置中對齊 ``` ![](https://hackmd.io/_uploads/rJCScJQga.png) ---- 對齊時產生的空格,我們也可以把它改掉 ```python= a = 5 print(f'This is {a:!<20}') ``` ![](https://hackmd.io/_uploads/BJB2s1Qx6.png) ---- ## 對齊 + 控制小數點 記得對齊的語法要在控制小數點的前面 ```python= a = 1 / 3 print(f'{a:0>20.3f}') ``` ![](https://hackmd.io/_uploads/r1eX3kQlT.png) ---- ## Practice 試著用對齊印出 5 行高的一個星星樹 ```bash * *** ***** ******* ********* ``` ---- ## Answer ```python= print(f"{'':<4}{'':*<1}") print(f"{'':<3}{'':*<3}") print(f"{'':<2}{'':*<5}") print(f"{'':<1}{'':*<7}") print(f"{'':*<9}") ``` ---- ## 要全部背起來? 其實不用, 教這些的意義只是為了讓人知道有這東西 未來遇到的時候,就能快速想起這些語法的關鍵字
{"title":"Python IO","contributors":"[{\"id\":\"24fdcf7f-f72d-490b-ba72-1e6f11570abd\",\"add\":9688,\"del\":0}]","description":"創始人:Guido van Rossum"}
    121 views
Advertisement