---
# System prepended metadata

title: Python基礎
tags: [winter_camp, python]

---

# Python基礎
###### tags:  `python` `winter_camp`
[TOC]


## Linux下的python
* 在終端機直接打`python`即可進入python2的互動模式，`python3`為python3的互動模式
* 若在```python3```後面接檔名，會開始逐行執行該檔案
* 直接執行，在程式第一行加上```#!/usr/bin/env python3```，並用```chmod```將檔案改成可執行檔。
---
## python基本變數型態
* int
* flaot
* str
```python=
a = 1
b = 1.
c = 0.1
d = '1'
e = '1' * 10
```

```python=
a = 1
print(type(a))

b = float(a)
print(type(b))

c = str(a)
print(type(c))

d = int(c)
print(type(d))

```
---
## python 運算子
* 與C語言比較

|運算子| C | python |
| -------- | -------- | -------- |
| 加 | +     | +     |
| 減 | -     | -     |
| 乘 | *     | *     |
| 除 | /     | / (//)     |
| 取餘數 | %     | %     |
| 乘冪 | pow()     | **     |
| 單行註解 | // | #     |
* python2 : ```<int>/<int>```為整數除法，與C的結果相同
* python3 : ```<int>/<int>``` : 若無法整除，會自動轉乘float。若不想自動轉型，要用```<int>//<int>```
---

## 資料型別
### List
list 是一種 python特有的資料格式
用"type()"來查詢的話 會顯示：list
python中沒有陣列，只有list，不過list比C的array更強大，它可以自由改變長度，也可以容許在同一個list裡放不同型態的變數
#### list常見的function
* ```a=[]``` : 建立的list
* ```a=[1, 2, 3]``` : list初始化
* ```a[索引值]``` : list a成員讀取，索引值從0開始
* ```len(a)``` : 回傳list a的長度
* ```a.append(b)``` : 在a尾端加入成員b
* ```a.extend(B)``` : 在a尾端接收另一個list B

### Tuple
list 是一種 python特有的資料格式
用"type()"來查詢的話 會顯示：tuple
tuple跟list很像，唯一的差別是tuple內的資料無法更改。

#### list常見的function
* ```a=()``` : 建立的tuple
* ```a=(1, 2, 3)``` : tuple初始化
    * ```a = (1,)``` : 只有單一成員tuple，初始化記得加```,```
* ```a[索引值]``` : tuple a成員讀取，索引值從0開始

----

## 判斷句
* `>`:大於
* `<`:小於
* `>=`:大於或等於
* `<=`:小於或等於
* `==`:等於(vs=:指派)
* `!=`:不等於
* `and`:且
* `or`:或
* `not`:非(真假對調)
* 這些在python裡也是可以用的
```python=
x=10
y=20
print(x is y)
print(x is not y)
print(x <= 5 and y <= 5)
print(x <= 5 or y <= 5)
print("C" in "Python")
print("C" in "C++")
```

* 範例
```python=
mood = "happy"

if mood is "happy":
    print("^_^")
    
elif mood is "normal":
    print("-_-")
    
elif mood is "sad":
    print("Q_Q")
```

---

## 迴圈
### for迴圈
:::info
for <迭代變數> in <可迭代變數>:
<縮排><其他程式>
:::
## range
* 產生一個整數的等差數列存
* 語法:range(start, stop, step)
    * start:起始值(可省略，預設值為0)
    * stop:中止值
    * step:增值(可省略，預設值為1)
* 注意range範圍是**≧start, <stop**
* 檢視發法，轉成list
    * Ex:t=range(0, 6, 2)
  ```a=list(t)  #a=[0, 2, 4]```
---

* C
```C=
for(int i=0;i<10;i++){
    printf("%d\n", i);
}
```
* python
```python=
for i in range(10):
    print(i)
```

```python=
data=[]
for i in range(10):
    data.append(i**2)

print(data)
```
* 列出1~a，是2或3的倍數但不是6的倍數的所有整數。

```python=
a=10
for i in range(1, a+1):
    if i%2 == 0 or i%3 == 0:
        if i%6 == 0:
            pass
        else:
            print(i)
```
#### 進階應用
https://www.runoob.com/python/python-func-enumerate.html
https://www.runoob.com/python/python-func-zip.html
```python=
for i,j in enumerate(range(10)):
     print(i,j)

```

```python=
for i,j in enumerate(zip(range(10),range(1,11))):
     print(j)

```


### while迴圈
:::info
while <判斷句>:
<縮排><其他程式>
:::
* C
```c=
int cnt = 10;
while(cnt--){
    printf("%d\n", cnt);
}
```
* python
```python=
a = 10
while a > 0:
    print(a)
    a-=1
```

### 自定義函式
:::info
def <函數名稱>(<變數1>, <變數2>…):
<縮排><函數內容>
:::
* 範例

```python=
def ten():
    return 10

a = ten()
print(a)
```

```python=
def f(x):
    ans = 5*x**2-3*x-11
    s = 5*x-3*x-11
    return ans, s

a = f(9)
print(a)

a, b = f(9)
print(a)
print(b)
```

# HW
## 把下面的C code改成python code
(UVA-12503: Robot Instructions)
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3947
```C++=
#include<stdio.h>

int main(){
    int init = 1;
    int time = 3;
    char command[3] = {'L', 'R', 'S'};
    int sc[3] = {0, 0, 2 };        //same as command
	for (int l=0;l<init;l++){
		int ans = 0;
		int data[time];
		for (int i=0;i<time;i++){
			char s = command[i];
			switch(s){
				case 'R':
					data[i] = 1;
					break;
				case 'L':
					data[i] = -1;
					break;
				default:
					int t = sc[i];
					data[i] = data[t-1];
			}
			ans+=data[i];
		}
        printf("%d\n", ans);
	}
}
```
#### ans
```python=
time = 3
ans = 0
data = []
command = ['L', 'R', 'S']
sc = [0, 0, 2 ]
for j,i in enumerate(command):
    if i == 'L':
        ans -= 1
        data.append(-1)
    elif i == 'R':
        ans += 1
        data.append(1)
    elif i == 'S':
        l = data[sc[j]-1]
        ans += l
        data.append(l)

print(ans)

```