---
# System prepended metadata

title: python筆記
tags: [python3, python, 程式]

---

# python筆記

## 演算法模板Algorithm

### deque
deque(全名double-ended queue)，為一種兩端都可以放入,取出元素的資料結構。


| 尾部插入 | 頭部插入   | 尾部刪除 | 頭部刪除 |
| -------- | ---------- | -------- | -------- |
| append   | appendleft | pop      | popleft  |

```python=
# deque實作queue的用法
q = deque()
q.append()
q.popleft()
```

### priority queue
預設是min-heap，也就是會按照小到大排序。
若要實作max-heap，可將元素x以-x的方式放入pq，取出元素時加個負號即可取出最大元素。
```python=
pq = []
heappush(pq, element)
element = heappop(pq)
```

### defaultdict
內置參數: int, list, set, dict
```python=
better_dict = defaultdict(list) # default值以一個list()方法產生

better_dict['a'].append(1) # [1] 
better_dict['a'].append(2) # [1,2] 
better_dict['a'].append(3) # [1,2,3] 
```

#### 查看多個字典中，共有幾種不同的字典值
```python=
unique_dicts = set()
for d in dicts:
    dict_tuple = tuple(sorted(d.items())) # 將字典轉換為排序過的tuple 
    unique_dicts.add(dict_tuple)
print(len(unique_dicts))
```

### 字典樹 Trie
為一種有序樹，通常用來存放字串，鍵值（字元）存放在節點中。
```python=
class Node:
    def __init__(self):
        # self.cnt_prf = 0
        self.children = collections.defaultdict(Node)

class Trie:
    def __init__(self):
        self.root = Node()

    def insert(self, word: str) -> None:
        node = self.root
        for c in word:
            node = node.children[c]
            # node.cnt_prf += 1
```

### format string
```python=
h, m = 13, 57
formatted_num = "{:02d}:{:02d}".format(h, m) # 02d代表要輸出長度為2的字串
print(formatted_num)  # 输出: '13:57'
```

### itertools
```python=
original_list = [1, 2, 3]

all_combinations = []
for r in range(len(original_list) + 1):
    combinations_r = itertools.combinations(original_list, r)
    all_combinations.extend(combinations_r)
# [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
```
```python=
original_list = [1, 2, 3]

permutations_3 = itertools.permutations(original_list, 3)
# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
```

### 排列組合
```python=

def C(n, k):    # 組合
    if k > n or k < 0:
        return 0
    return math.factorial(n) // (math.factorial(k) * math.factorial(n - k))

def P(n, k):    # 排列
    if k > n or k < 0:
        return 0
    return math.factorial(n) // math.factorial(n - k)
    
def H(n, k):    # 重複組合
    return C(n+k-1, k)
```

### binary search
```python=
l, r = 0, len(nums)
while l < r:
    mid = (l+r)//2
    if nums[mid] > target:
        r = mid
    elif nums[mid] < target:
        l = mid+1
    else:
        return mid
return -1
```

## 虛擬環境Virtual Environment
以下介紹的為python原生的venv，除此之外還有conda等虛擬環境可以使用。

### 建立虛擬環境
name_env為安裝虛擬環境的資料夾名稱
```bash=
python3 -m venv name_env
```
接著當前目錄下應該會出現一個資料夾裡頭有著虛擬環境的檔案。當不再需要用到虛擬環境時，可直接將/name_env資料夾刪除即可。

### 啟用虛擬環境
```bash=
source name_env/bin/activate
```
如果命令列最前面出現(name_env)，即代表成功開啟了虛擬環境

### 查看虛擬環境位址
```bash=
which python3
```

### 套件管理
查看已有什麼套件
```bash=
pip3 list
```
下載&更新套件。若不指定版本的話，會預設下載最新版本。
```bash=
pip3 install package_name
pip3 install package_name==version
pip3 install --upgrade package_name
```
刪除套件
```bash=
pip3 uninstall package_name
```

### 關閉虛擬環境
```bash=
deactivate
```