---
# System prepended metadata

title: Python Basic
tags: [python, ' basic']

---

---
title: Python Basic
tags: python, basic
---

[TOC]

---
## Fundamental Concept
1. Python為一[強型別程式語言](https://stackoverflow.com/questions/11328920/is-python-strongly-typed)
     
     ![](https://i.imgur.com/b58Zw3U.png)


2. Python的語法中沒有`{}`，因此是用縮排(indent)來判別範圍，縮排並沒有規定為多少空格，只要統一即可

3. Python中所有的東西都是物件，變數實際上是參考到一個物件(可以用id查看)
    - Immutable object：此物件的內容不能被更改，所以對此物件的更改實際上是創造一個新的物件，並將新物件的參考assign給變數
        - 傳遞參數時**類似C/C++ call by value**
        - 常見的有: int、str、tuple
    - Mutable object：此物件內容可以被更改，因此每次對其做的更改，都對該物件的參考做更改
        - 傳遞參數時**類似C/C++ call by reference**
        - 常見的有: list、dict
    - 這個觀念非常重要，一開始初學時因為不知道所以很常碰壁

4. 註解符號
    - Single Comment: `#後面內容為單行註解`
    - Mutiple Comment: `""" 內容為多行註解 """`

5. Keyword
    1. `pass`
        - 如同字面上的意思，當程式運行到 pass statement 時，會略過
        - 非常常見，像是一開始規劃程式時，可以列出需要的function，但function body不能為空，此時就可以用pass略過；或是在處理Exception時，有時遇到一些例外可以略過不處理，也會用到pass
    2. `is`
        - 用來判斷兩物件是否相等，跟`==`不同的是，`is`比較是兩物件的記憶體位址，`==`比較的是兩物件的值


## Control Statement
### If Satement
```python=
if condition:
    handle statement
elif condition:
    handle statement
else:
    handle statement
```

Condition 的部分可以加括號亦可不加

### Ternary Operator
:::danger
Python 沒有 Ternary Operator
:::

```python=
# 第一種方法
True Satement if Condition else False Satement
# 第二種方法
(True Satement, False Satement)[Condition]
# 歡迎提供更多方法
```

### Switch Statement
:::danger
Python 沒有 switch statement
:::
替代方案有蠻多種，這裡提供一個我自己用過還不錯的
```python=
# 使用 dict 模擬 switch
# 使用時機為 內容行為可以直接用function處理

# 為不影響篇幅，假設fun已存在    
handler = {
    '1' : fun1,
    '2' : fun2,
    '3' : fun3,
}

# 執行
fun_handle = handler[choice]
fun_handle()
# 簡化
handler[choice]()
# 更好的寫法
handler.get(choice, lambda:print('No option'))()
```

## Loop
### While Loop
```python=
# 注意縮排
while Condition:
    statement
```

### For Loop
#### Start with common usage
```python=
# Increment
for i in range(5):
    print(i, end=' ')  # 0 1 2 3 4

for i in range(2, 5):
    print(i, end=' ')  # 2 3 4

for i in range(1, 5, 2):
    print(i, end=' ')  # 1 3

# Decrement
for i in range(5, 0, -1):
    print(i, end=' ')  # 5 4 3 2 1

# List & Tuple
listA = ['A', 'B', 'C']
for idx in range(len(listA)):
    print(listA[idx])     # A B C

for elem in ['A', 2, 'C', 4]:
    print(elem, end=' ')  # A 2 C 4

for n, s in [(1, 'one'), (2, 'two')]:
    print(n, '=', s, end= ' ')  # 1=one 2=two
```

#### With enumerate
> Pythonic 寫法
> enumerate(iterable, start=0)
```python=
aList = ['one', 'two', 'six', 'ten']
for idx, val in enumerate(aList):
    print(f'{idx}:) {val}')
# Output
0:) one
1:) two
2:) six
3:) ten
# File
with open(f_name) as fd:
    for i, line in enumerate(fd, 1):
        print('{}: {}'.format(i, line))
        
# logging
for i, elem in enumerate(aList):
    try:
        pass
    except Exception as e:
        logging.error('{} on elem[] = '.format(e.args, i, elem))
        
# Reverse dict
aDict = {elem : i for i, elem in enumerate(aList)}
```
#### Some Example
1. print the triangle
```python=
n = 5
for i in range(n):
    print(' '*(n-i) + '*'*(2*i+1))
'''
     *
    ***
   *****
  *******
 *********
'''
```