# 邏輯及流程控制

> 

Published: 2011-10-12
URL: https://kaochenlong.com/python-flow-control

---

## 變數

在開始講流程控制之前，要先來看一下在 Python 的變數。

&lt;!-- more --&gt;

Python 的變數有幾項特點以及有趣的使用：

- 不用宣告，可以直接用 `x = &quot;abc&quot;`
- 變數名稱沒有型態
- `x, y, z = 1, 2, 3` 可一口氣指定多個變數
- `x, y = y, x` 把 x 跟 y 的值對調
- `x, y, z = &quot;abc&quot;` 會得到 x = &quot;a&quot;、y = &quot;b&quot;、z = &quot;c&quot;
- `x = y = z = &quot;abc&quot;`，x、y、z 都是 `abc`

### 命名規範

1. 最好取有意義且相關的
2. 開頭只能以底線或英文字母
3. 小心保留字

保留字：

| | | | | | | |
| ----- | ------ | ------ | ------ | ----- | -------- | ------ |
| and   | as     | assert | break  | class | continue | def    |
| del   | elif   | else   | except | exec  | finally  | for    |
| from  | global | if     | import | in    | is       | lambda |
| not   | or     | pass   | print  | raise | return   | try    |
| while | with   | yield  |

## 如果這樣，那就這樣，不然就那樣.. 的 if-else

所謂的邏輯控制，說穿了大概就是「如果下雨，就去吃麥當勞，不然就去吃肯德雞」之類的敘述罷了。如果我們把這段語法改寫成程式碼的話：

```python
weather = &quot;sunny&quot;

if weather == &#39;rainy&#39;:
  print &quot;go to M&quot;
else:
  print &quot;go to KFC&quot;
```

如果你曾經學過別的程式語言，例如 C/C++/PHP，你可能一下子看到這樣的程式碼會不太習慣。Python 的 code block 不需要大括號，只要用整齊的縮排就可以了。至於你是要縮排 2 格空白、4 格空白都可以，只要排整齊就好了。另外，每行的行末也不需要分號做為結束。

Python 的變數不需要特別宣告，在做邏輯判斷的時候，如果不會影響語意的話，也是不需要小括號的。假設我們原來這段程式碼改用 C-like 的程式碼來改寫的話，可能會長得像這樣：

```js
var weather: String = &quot;sunny&quot;;

if (weather == &quot;rainy&quot;) {
  print(&quot;go to M&quot;);
} else {
  print(&quot;go to KFC&quot;);
}
```

上面這段程式碼只是舉例，不一定完全正確。不過要表達一樣的意思，用 Python 就是可以讓你的程式碼變得簡單很多，至少你可以少敲好幾下鍵盤，也因為 Python 的程式碼強制一定要縮排排整齊，所以你也不用擔心程式碼風格會差很多的問題(當然有的人就是喜歡用奇技淫巧..硬是要寫得跟別人不同的也大有人在)。

有`if..else..`，那當然也要來一下 `elseif` 之類的語法，不過 Python 的 elseif 是用 `elif`：

```python
weather = &quot;sunny&quot;

if weather == &#39;rainy&#39;:
  print &quot;M&quot;

elif weather == &#39;not good&#39;:
  print &quot;Stay at home&quot;

else:
  print &quot;KFC&quot;
```

## switch?

你知道當程式的判斷開始越來越多的時候，學校老師或是教課書上就會教我們用 `switch` 之類的語法來處理，不過，你可能會很訝異，Python 沒有 swtich 之類的語法的，它就是用一大串的`if..elif..else..`來處理。

不優美嗎? 我覺得還好。反正 Python 程式碼的縮排很清楚，看起來也不會多混亂 :)

## 註解

Python 的註解有兩種，單行註解跟多行註解。單行的這樣用：

```python
# this is comment in python
```

多行的這樣用

```python
&quot;&quot;&quot;
this is comment
this is comment, too!
many comment..
&quot;&quot;&quot;
```

## 中文字..會出現錯誤!!

如果你的檔案裡有用到非英文字元的話，請在檔案最前面加上一行：

    # encoding: utf-8

這樣你的程式執行起來才不會跳出 `SyntaxError`，誰叫電腦跟程式語言不是中國人發明的..

## 輸入/輸出

這個我們在寫一些 console 的應用程式的時候常會用到，前面我們已經用過`print`了，不過接下來我們來試著做個可以跟使用者互動的簡單小程式：

```python
print &quot;Hello, how old are you?&quot;
age = raw_input()
if age &gt;= 18:
  print &quot;You&#39;re an Adult already!&quot;
else:
  print &quot;kid, go back to school!&quot;
```

這其實也是個沒什麼實戰用途的程式碼範例，也沒有很嚴格的檢查輸入值的範圍，不過可以從這邊看到在 Python 的輸入/輸出大概是怎麼處理的。另外一樣在處理輸入的，還有兩個稍微要提的，分別是`raw_input`跟`get_pass模組`。也許你會好奇`input`跟`raw_input`的差別? 比較明顯的差別是在於數字的處理，如果你輸入`20+3`，你會得到 23，但如果用的是`raw_input`的話，則是得到`20+3`這個字串。

不管是`input`或是`raw_input`，我們在輸入的過程中都會被旁邊的人看光光，如果你不想你在輸入密碼的時候全部都秀在畫面上，你可以使用`get_pass`這個內建的模組。我們直接在 shell 裡試試看：

    &gt;&gt;&gt; import getpass
    &gt;&gt;&gt; getpass.getuser()
    &gt;&gt;&gt; your_pw = getpass.getpass(&quot;please input your password: &quot;)
    please input your password:

這樣你打的字就應該不會被看到了。

接下來，我們要來把這些程式碼包成 method(方法)..

