# 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```

----
## 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') # 置中對齊
```

----
對齊時產生的空格,我們也可以把它改掉
```python=
a = 5
print(f'This is {a:!<20}')
```

----
## 對齊 + 控制小數點
記得對齊的語法要在控制小數點的前面
```python=
a = 1 / 3
print(f'{a:0>20.3f}')
```

----
## 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"}