---
# System prepended metadata

title: python讀書會(二)
tags: [python讀書會]

---

---
title: python讀書會(二)
tags: python讀書會
---
{%hackmd @themes/orangeheart %}

## 2.0 回顧...

1. print(a)、```#```、input(b)
2. operators: ```+``` ```-``` ```*``` ```/``` ```%``` ```>``` ```=``` ```&```...
3. keywords: ```True``` ```False``` ```None```...
:::success
:question: 給定一個數字，如果數字是偶數，就回傳False；奇數則True，請問該怎麼寫出判斷的程式? 

```
45
60888632
2147483649
-54654669
```
:::

---

## 2.1 繼續keywords

![](https://i.imgur.com/vjsPafj.png =500x)

上次只提到幾個keywords，今天將它結束掉!

![](https://i.imgur.com/Dak7DdH.gif =x300)

#### 2.1.1 from, import, as

當你從python官網將python下載到你電腦中的時候，除了python程式本體以外，python的周邊套件也都被下載了，~~啊可是我們在寫程式的時候還是要多於打一句from...import...，很麻煩..~~ 所以說，```from```就是從某個套件取出你需要的工具，```import```就是你要引入的工具。

有些套件，真的是一長串名字:cry:，此時```as```就可以將冗長的套件名稱瘦身。

- [x] 程式碼 2.1.1a
```python=
import math
print('output_1 = ', math.pi, '\n')

###print('output_3 = ', m.pi, '\n')
###第4行會出錯👆

import math as m
print('output_2 = ', math.pi, '\n')
print('output_3 = ', m.pi, '\n')
```

- [x] 程式碼 2.1.1b
```python=
from math import cos, pi
print(cos(pi/3))

###print(sin(pi/6))
###第4行會出錯👆

##三角函數以弳度制為輸入

from math import * #星號代表'everything'的意思
```

如果在這一步有出錯，那可能是未安裝相關的套件，那麼要去資料夾確認一下套件是否存在:
```
>>>import sys
>>>import requests
>>>sys.modules['requests']
```
然後就會輸出套件安裝的位置~

```C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages```

若還是找不到，那就打開cmd，輸入```pip install```+安裝套件名稱，即可安裝。

#### 2.1.2 if, else, elif

```if```是非常方便的指令，可以藉由條件的邏輯判斷，來控制程式的執行與否。通常會搭配```else```或是```elif```這種考慮額外狀況的指令一起使用。
以下是```if```邏輯的程序圖。
![](https://i.imgur.com/6HqtX70.png =600x)


:::warning
如果你想挑戰自己的邏輯，也可以考慮不用任何```if```指令去解題。對於某些程式高手來說，不使用任何```if```指令去解題是有難度的。
:::

- [x] 程式碼 2.1.2a
```python=
def if_example(a):
    if a == '1':
        print('it is 1!')
    else:
        print('it is not 1!')
        
if_example(input())
#可以嘗試看看如果不寫else那一段會發生什麼事
```

- [x] 程式碼 2.1.2b
```python=
#如果我們嘗試看看if後面只剩變數呢?
def if_example(a):
    if a == 1:
        print(a)
    else:
        print('not 1')
        
if_example(input())
```
你即使輸入了1，編譯器仍然判定"not 1"，為什麼? 該怎麼辦咧?

:::danger
哭阿，我的Anya各種動圖、靜圖都在另一台筆電上，所以這份講義沒有什麼Anya...
這邊放個彩蛋：
```python
import this #直接這一行執行看看(●'◡'●)~~
```
:::

#### 2.1.3 def, return, class

熟練地使用```def```指令會使你的程式碼看起來更整潔清爽，而且寫出有功能的程式時可以利用它來避免掉一些會一直重複的程式。

- [x] 程式碼 2.1.3a
```python=
def find_same_letters(word1, word2):
    "在兩個單字中找到相同的字母並輸出。"
    result_list = []#先創一個空列表
    for i in word1:
        #如果輸入pear，第一次迴圈的i會等於p，接著是e、a、r
        if (i in word2) and (i not in result_list):
            result_list.append(i)
            result_list = sorted(result_list)
    return result_list

find_same_letters('pear', 'apple')

find_same_letters('linguistics', 'economics')
```

跟其他程式語言相比，在python語言當中，需要利用縮牌的方式去區隔有特定功能的程式碼，縮排縮不對，失之毫釐，差之千里!
基本上啦，看到```:```，下一行就要縮排!
縮排請用鍵盤左上角的<font color=#bb1119>**Tab鍵**</font>、<font color=#ed4488>**Tab鍵**</font>、<font color=#ff22aa>**Tab鍵**</font>!!!

---

```return```指令常常緊跟著```def```，將最後函數所得到的結果回傳給呼叫函數的一方，沒有使用```return```的函數，回傳值預設為```None```。

沒有```return```的function就像是你算數學算了一堆過程，但是偏偏不把答案寫下來，~~除非老師會通靈~~，不然老師也不知道你到底想幹嘛~

- [ ] 程式碼 2.1.3b
```python=
def no_return():
    pass#你定義了一個函數，但是就只有一堆計算

print(no_return())#恭喜你，電腦不知道你要幹嘛

#######分隔線
print(print("None"))
```

- [ ] 程式碼 2.1.3c
```python=
def return_sum():
    i = 1
    sum = 0
    while i <= 100:
        sum += i
        i += 1
    return sum

print(return_sum())#你把算出來的sum告訴電腦了~

##print是給使用者看結果；return相當於把結果給電腦看
```

**再進階一點的~:fire:**

函數預設只能回傳一個數值，但```return```後可用逗號接多個數值，此時回傳單一數值的型態為**tuple** ，因此可由**tuple**取出以逗號間隔的每個數值。

- [ ] 程式碼 2.1.3d
```python=
def fn():
    return 10, 0.003, True, 3+4j, "hello", [1,2], {"one":1, "two":2}, (1,2), {1,2}

a = fn()
print(a)
print(type(a))

a1, a2, a3, a4, a5, a6, a7, a8, a9 = fn()
print(a1, a2, a3, a4, a5, a6, a7, a8, a9)
print(type(a1), type(a2), type(a3), type(a4), type(a5), type(a6), type(a7), type(a8), type(a9))

```
---

```class```是一個初學者比較不會用到的功能keyword，在使用OOP(物件導向程式設計)會使用到。
```class```表示真實世界情況的相關屬性和方法的集合，在模塊中定義單個class是一個好習慣。

- [ ] 程式碼 2.1.3e
```python=
#這是一個標準的class寫法
class Cars:
    def __init__(self, color, seat):
        self.color = color  
        self.seat = seat  
    def drive(self):
        print(f'My car is {self.color} and {self.seat} seats.')

operator = Cars('red', 6)
operator.drive()

operator = Cars('yellow', 0)
operator.drive()
```
- [ ] 程式碼 2.1.3f
```python=
#這也是一個標準的class寫法
class food():
    def __init__(self, fruit, color):
        self.fruit = fruit
        self.color = color
    def show(self):
        print("fruit is", self.fruit)
        print("color is", self.color )
 
apple = food("apple", "red")
grapes = food("grapes", "green")
 
apple.show()
grapes.show()
```

#### 2.1.4 for, while

到了迴圈的部分啦~~
迴圈相當於```一段程式碼```*```次數```
真的就是這樣啦，不會很難~~

我們先說說```for```:

- [ ] 程式碼 2.1.4a
```python=

n = eval(input("你要從1加到多少?"))
sum = 0
for i in range(n+1):
  sum += i

print(sum)

```
在這邊```range(5)```就相當於一個等差數列，基本上等於list型態的```[0, 1, 2, 3, 4]```。
然而```range```的完整語法是這樣的：
```python
range(起始, 結束, 間隔)#沒有特別說明的話，起始預設為0，間隔預設為1，結束則會是(n-1)
```

在```for```迴圈的世界裡，它總是會伴隨著```in```，有時甚至還會跟著```else```:

- [ ] 程式碼 2.1.4b
```python=
for i in [0, 2, 6]:
    print(i)
else:
    print('已到列表末尾')
```

---

```while```迴圈和```for```迴圈不同的是，只要條件判斷式為真，就會一直循環，直到條件判斷式不成立為止!
所以說，如果判斷式一直回傳True，則此迴圈就會無限地執行下去😱😱

- [ ] 程式碼 2.1.4c
```python=
n = 10
sum = 0
i = 1

while i <= n:
    sum = sum + i
    i = i+1   

print("The sum is", sum)
```


和```else```搭配的```while```迴圈，你們也嘗試看看~~
- [ ] 程式碼 2.1.4d
```python=
counter = 0

while counter < 3:
    print("Inside loop")
    counter = counter + 1
else:
    print("Inside else")
```

## Homework 2

* 本周題目：
<font color = gray>a001: 哈囉 </font>
<font color = gray>a002: 簡易加法</font>
<font color = gray>a006: 一元二次方程式</font>

