---
# System prepended metadata

title: Lab03：變數、運算式、判斷式
tags: [計算機概論]

---

## 先來回答上週遇到的問提
- 在官網安裝python & 在vscode安裝python

## 什麼是 python?
- Python 是一種直譯式、物件導向、功能強大的高階程式語言，其設計強調程式碼的可讀性以及簡潔的語法，使用空格縮排來劃分程式碼區塊，不像其他常見的程式語言大多使用大括號或關鍵詞。
- Compiler(編譯器)和Interpreter(直譯器)

- 如果要讓程式輸出:`hello`
```python=
# 這是python
print("Hello!")
```

```cpp=
// 這是c
#include <stdio.h>

int main(){
    printf("Hello World!\n");
    return 0;
}
```
```java=
// 這是java
public class Hello
{
    public static void main(String[] args)
    {
    System.out.println("Hello!");
    }
}
```

## Python有什麼功能?
* 數據分析與處理
* Web開發應用
* 人工智慧應用

## python 常見 data type
- 資料型態
    -   int
    -   float
    -   string：任意的文字內容。
    -   boolen：表達正確(True)或錯誤（False）。
    -   查看型態：type()
-   容器
    -   list：有順序且可以變動的資料集合。
    -   tuples：有順序且不可變的資料集合。
    -   sets：無順序的資料集合。
    -   dict：key-value pair的集合。
```python=
print(type(10))
# <class 'int'> #整數

print(type(3 + 5j))
# <class 'complex'> #複數

print(type('hello python'))
# <class 'str'> #字串

print(type(True))
# <class 'bool'> #布林值
```


## 下註解
- 註解雖然會出現在程式碼裡面，但是並不會被執行，是個很適合為程式新增說明的手段
- 如果不好好寫註解的話，肯定會被一個月後的自己討厭
-  助教不會討厭不寫註解的人，但你的分數會討厭你


```python=
# 這是單行註解
# 多行註解的方式：全選後一次註解
```

## 變數與賦值(variable & assignment)
- 變數就是為了方便在程式中調用記憶體中的值而取的名字
```python=
# eg
x = 5
x = x+1
print(x)

# 可以將 x = x+1 寫成 x+=1 → syntax sugar（語法糖）
```
- ![upgit_20240813_1723540788.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/08/upgit_20240813_1723540788.png)
- 可以用type()函數來查看變數的資料型態

## 變數的命名規則
https://zh.wikipedia.org/zh-tw/%E5%91%BD%E5%90%8D%E8%A7%84%E5%88%99_(%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)#Python_and_Ruby

## 格式化基本輸出
- python的輸出非常簡單, print()裡面可以放任何東西(字串、變數、int…)
```python=
# 基本語法
print(13, sep="", end="")

print('Hello World!')
# Hello World!

print('Hi, my name is', 'Simon')
# Hi , my name is Simon

print(123)
# 123


# value: 要輸出的值，可以是多個，用逗號分隔。
# sep: 用於分隔多個值的字符串，預設是空格 " "。
# end: 在輸出結束後添加的字符串，預設是換行符 "\n"。
```

![image](https://hackmd.io/_uploads/BkI9oKpaA.png =70%x)
```python=
# 範例
print("要走進學校", "需要很大的勇氣", sep="。", end="。")
# 要走進學校。需要很大的勇氣。
```




```python=
# 格式化輸出
score = 90
name = "助教"
count = 1

print("%s你的第 %d 次物理考試成績是 %d" % (name, count, score))
print(f"{name}你的第 {count} 次物理考試成績是 {score}")
# 助教你的第 1 次物理考試成績是 90
```


## 格式化基本輸入
```python=
# 預設輸入為string
name = input("請輸入姓名")
print(name)

# 如果是要輸入int
num = int(input("請輸入數值"))
```



## 基本數學運算
```python=
print(10+5)
print(10-5)
print(10*5)
print(10/5) # 2.0(python它會自動判斷格式)
print(10%5) # 0


# 餘數、整除
print(9%5) # 4
print(9//5) # 1
# 次方
print(3**2)z X

# 科學記號
print(1.23E+6) # 1230000.0
print(1.23E-4) # 0.000123
```

### 甚麼時候會用到mod?
- 迴圈中的循環計數
```python=
elements = ['A', 'B', 'C']
index = 5
print(elements[index % len(elements)])  # 輸出: 'C'
```

- 星期計算：假設要計算某天的後 100 天是星期幾
```python=
current_day = 3  # 例如今天是星期三 (3)
days_later = 100
future_day = (current_day + days_later) % 7
print(f"100 天後是星期 {future_day}")

```

## 進制互換
```python=
# 二進位
x=0b1101
print(x) # 13

# 十進位轉二進位
print(bin(13)) # 0b1101

# 八進位、十進位、
print(oct(47)) # 0o57

# 十六進位
print(hex(47)) # 0x2f
```

## 數據型態互換
- 整數 (int) 與 浮點數 (float) 互換
    - 整數當然可以換小數點
    - 小數換整數的話，python是無條件捨去
```python=
print(int(12.34))  # 輸出: 12 # 四
print(float(12))   # 輸出: 12.0
```
- 整數 (int) 與 布林值 (bool) 互換
    - int(True)：布林值 True 轉換為 1。
    - int(False)：布林值 False 轉換為 0。
- 布林值 (bool) 與 字串 (str) 互換
    - str(True)：將布林值 True 轉換為字串 "True"。
    - str(False)：將布林值 False 轉換為字串 "False"。
    - bool()：任何非空字串轉換為 True，空字串 "" 轉換為 False。
```python=
print(str(True))   # 輸出: 'True'
print(str(False))  # 輸出: 'False'
print(bool("Hello"))  # 輸出: True
print(bool(""))       # 輸出: False
```

## ASCII 碼
- ASCII 碼 是一種用來表示文字和符號的編碼標準，每個字符（如字母、數字、符號等）都對應著一個唯一的 數字代碼。
- ASCII 碼表 包含 128 個字符，對應的數值範圍是 0 到 127，其中：
    - 控制字符（例如換行、回車、退格等），對應 ASCII 值 0 到 31 以及 127。
    - 可打印字符，包括字母、數字和符號，對應 ASCII 值 32 到 126。
- 那這個ASCII可以幹嘛?像是文本保存、鍵盤輸入及網路通訊協定都是靠他們歐
![image](https://hackmd.io/_uploads/r1Yubq66R.png)

```python=
print(chr(97)) # a
print(ord("a")) # 97
print(ord("A")) # 65
```

```python=
# 字符驗證
char = input("請輸入一個字符: ")

if ord(char) >= 65 and ord(char) <= 90:
    print(f"{char} 是大寫字母")
elif ord(char) >= 48 and ord(char) <= 57:
    print(f"{char} 是數字")
else:
    print(f"{char} 是其他字符")
```


## 字串
- 它就是ABC搂
- 可以使用單引號或雙引號來定義
- 不可變的：一旦創建，便不可修改，也就是說，當你嘗試修改實，它其實是創建一個新的字串對象
```python=
text = "Hello"
# text[0] = "J"  # 這會導致錯誤，因為字串是不可變的
new_text = "J" + text[1:]  # 正確方式：創建新字串
print(new_text)  # 輸出: Jello
```
- 字串是有序的：才會有索引跟切片
- 字串連接
```python=
print(111+333)
print("111"+"333")
```

- 處理多於一行的字串
```python=
str1 = """
變數、運算式、判斷式.ipynb
今天天起真好
"""
```
- 重複字串
```python=
# 使用 * 來重複字串。
repeat_str = "ha" * 5
print(repeat_str)  # 輸出: hahahahaha
```

- 字串長度
```python=
# 使用 len() 函數來計算字串的長度。
sentence = "Hello, world!"
print(len(sentence))  # 輸出: 13
```

- 查找與替換
```python=
message = "Hello, Python!"
index = message.find("Python")
print(index)  # 輸出: 7

new_message = message.replace("Python", "World")
print(new_message)  # 輸出: Hello, World!
```

- 字串的索引及切片
    - 在 python 中，字串是有順序的，並且從 0 開始計算。
    - 字串可以使用單引號也可以使用雙引號。
```python=
# indexing
my_str = "helllo"
print(my_str[0])
print(my_str[1])
print(my_str[-1])
print(my_str[-2])
# print(my_str[-10]) # index error

# slicing
x = "abcdefg"
print(x[2:]) # cdefg
print(x[:4]) # abcd
print(x[2:6]) # cdef
print(x[1:5:2]) # bd
```
- 附上有關於python string 的更完整函數，同學再去花時間try try see搂
https://www.youtube.com/watch?v=dNFI2c007Sw
![image](https://hackmd.io/_uploads/r1nMu5apA.png)



## 常用到的內建函數（built-in）
- 恩...好多歐，那就請同學自己學習吧(笑
- 一個函數（function）一次只能返回一個值
    - abs()
    - str()
    - pow()
    - max(), min()
    - int(), float(), round()
    - e, pi , sqrt()
    - floor(), ceil()
    - round()


![image](https://hackmd.io/_uploads/S1xy9c6T0.png)

                     

## 處理字串的數學運算evel()
- 可以把字串轉成程式碼去執行
```python=
print(eval("3+4"))
print("abs(4)", abs(4))
print("max([1, 2, 3])", max([1, 2, 3]))
```

- 有時候我需要輸出程式碼字串跟執行結果，這樣就可以偷懶一下ww：
```python=
def f(str):
    print(str, eval(str))

f("abs(4)") # abs(4) 4
f("max([1, 2, 3])") # max([1, 2, 3]) 3
```
## 比較運算符（comparison operator）
![upgit_20240418_1713383314.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240418_1713383314.png)


## 邏輯運算（logical operator）
![upgit_20240418_1713383360.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240418_1713383360.png)

![upgit_20240420_1713557595.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240420_1713557595.png)

## 位運算符（bitwise operator）
- 位運算子允許我們對整數的二進位位元進行操作。這些運算子在某些特定情況下非常有用,例如位操作、旗標設定等。
![upgit_20240418_1713383409.png](https://raw.githubusercontent.com/kcwc1029/obsidian-upgit-image/main/2024/04/upgit_20240418_1713383409.png)
```python=
# AND 運算 (`&`)
a = 0b1010  # 10 (十進位)
b = 0b1100  # 12 (十進位)
print(a & b)  # Output: 8 (二進位: 1000)

# OR 運算 (`|`)
# 將對應位元進行 OR 運算,只要有一個對應位元為 1,結果位元就為 1。
a = 0b1010  # 10 (十進位)
b = 0b1100  # 12 (十進位)
print(a | b)  # Output: 14 (二進位: 1110)

# XOR 運算 (`^`)
# 將對應位元進行 XOR 運算,當對應位元不相同時,結果位元為 1。
a = 0b1010  # 10 (十進位)
b = 0b1100  # 12 (十進位)
print(a ^ b)  # Output: 6 (二進位: 0110)

# 取反運算 (`~`)
# 將所有位元取反,即 0 變 1,1 變 0。需要注意的是,取反運算在 Python 中會產生一個負值。
a = 0b1010  # 10 (十進位)
print(~a)  # Output: -11 (二進位: 111..10101)

# 左移運算 (`<<`)
# 將位元向左移動指定的位數,相當於乘以 2 的指定次方。
a = 0b1010  # 10 (十進位)
print(a << 2)  # Output: 40 (二進位: 101000)

# 右移運算 (`>>`)
# 將位元向右移動指定的位數,相當於除以 2 的指定次方。
a = 0b1010  # 10 (十進位)
print(a >> 1)  # Output: 5 (二進位: 101)
```


## membership operator（in, not in）
- 這邊有兩種
    - in, not in 
    - is, not is
```python=
arr = "ABCD"
if "A" in arr: ...

a = {"a", "b", "c"}
if "a" in a: ...
```
- 參考教學：
    - https://www.youtube.com/watch?v=W7luvtXeQTA
    - https://www.youtube.com/watch?v=W7luvtXeQTA&t=2s
    - https://www.youtube.com/watch?v=mO_dS3rXDIs


## 判斷式--if語句
- if 語句是最基本的條件控制語句之一，用於根據條件執行不同的程式碼塊。
- 寫程式的時候，很常遇到某些情況，如：達成條件要做A，未達成要做B。這時候我們就可以用 if…else 來做到這件事情。
- 縮排：就是多出一些空格數(通常為4格)

```python=
# 判斷奇偶數
x = 5
if x > 0:
    print("x is positive")
elif x < 0:
    print("x is negative")
else:
    print("x is zero")
```
                  
```python=
password = input("請輸入密碼")
if password == "123456"    
	print("hello master")                 :           
```
                     
                     
![image](https://hackmd.io/_uploads/H1_FN5T6C.png)


## Lab03作業題目
- 繳交方式 : 
    - 請到[https://140.116.179.59:8080](https://140.116.179.59:8080)完成作業題目
    - 並將程式碼加上==註解(你的理解)==，很重要，否則助教有權利扣你分數
    - 禁止抄襲，否則助教會來查水表
- 作業繳交期限：至09/30 12:00前
- 題目為基本題9題+一題加分題，共10題
    - Lab03_01-Lab03_08：一題11分(==不符規定九折，未註解七折，遲交六折==)
    - Lab03_09：一題12分(==不符規定九折，未註解七折，遲交六折==)
    - 加分題直接列入期末成績計算
- github檔名格式：
    - 每一個檔案為：`Lab03_OO.py`
    - 所有檔案放入資料夾`學號_Lab03`在將資料夾上傳