## 先來回答上週遇到的問提
- 在官網安裝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(語法糖)
```
- 
- 可以用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"。
```

```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可以幹嘛?像是文本保存、鍵盤輸入及網路通訊協定都是靠他們歐

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

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

## 處理字串的數學運算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)

## 邏輯運算(logical operator)


## 位運算符(bitwise operator)
- 位運算子允許我們對整數的二進位位元進行操作。這些運算子在某些特定情況下非常有用,例如位操作、旗標設定等。

```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") :
```

## 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`在將資料夾上傳