---
title: Python Basic
tags: python, basic
---
[TOC]
---
## Fundamental Concept
1. Python為一[強型別程式語言](https://stackoverflow.com/questions/11328920/is-python-strongly-typed)

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))
'''
*
***
*****
*******
*********
'''
```