---
title: python讀書會(五)
tags: python讀書會
notes: 0.00011001100110011.....、(https://www.programiz.com/python-programming/methods/built-in)
---
{%hackmd @themes/orangeheart %}
## 5.0 回顧...
1. 變數的有效域(```global```、```nonlocal```)
2. 其他的keywords(```del```、```pass```、```lambda```)
3. 命名規則、數值簡述、陣列簡述(tuple、list、set、dictionary)
## 5.1 模組
:::success
嘗試看看將十進位的0.1分別轉換成二進位的小數和分數形式。
:::
模組(Module)就是一個檔案,包含了相關性較高的程式碼。隨著應用程式的開發規模越來越大,我們不可能把所有的程式碼都寫在同一份Python檔案中,一定會將關聯性較高的程式碼抽出來放在不同的檔案中來形成模組。
- [ ] 程式碼 5.1
```python=
# 想知道這個模組裡面有什麼東西可以用
print(dir(模組))
# 如果作者有好好寫文檔(.doc)的話,這個可以知道詳細功能
print(help(模組))
# 模組的路徑
import 模組
print(模組.__file__)
```
#### 5.1.1 math 模組
上次我們知道```math```這個模組讓我們可以在python上運行不簡單的運算。
像是:$\pi$、$\cos$、$e$、$\log$、$\sinh$、$n!$、$\sqrt[2]{n}$ ...
在此之前,要先了解到以下兩者的差別:
```python
import math as m
print(m.e)
from math import *
print(e)
```
- [ ] 程式碼 5.1.1a
```python=
math.ceil(x)#回傳一個大於等於x的最小整數
math.copysign(x, y)#讓x變成y的同號數
#基本上看見f開頭的通常是回傳float型態
math.fabs(x)#絕對值
math.factorial(x)#階乘
math.floor(x)#取高斯,和ceil相反
math.fmod(x, y)#取x/y的餘數
math.frexp(x)#取尾數和指數(科學記號)
math.fsum(iterable)#將所有的iterable值加總,像是list型態
math.isfinite(x)#x是有限值,則回傳True
math.isinf(x)#x是無限值,則回傳True
math.isnan(x)#x是NaN,回傳True
math.ldexp(x, i)#相當於x*(2**i)
math.modf(x)#回傳x的小數和整數部分
math.trunc(x)#只取x的整數部分
math.exp(x)#e**x
math.expm1(x)#e**x-1
math.log(x, b)#以b為底,取x的對數
math.log1p(x)#ln(1+x)
math.log2(x)#以2為底,取x的對數
math.log10(x)#以10為底,取x的對數
math.pow(x, y)#x**y
math.sqrt(x)#x**0.5
math.acos(x)#arccos(x),弳度制
math.asin(x)#arcsin(x),弳度制
math.atan(x)#arctan(x),弳度制
math.atan2(y, x)#arccos(y/x),弳度制
math.cos(x)#cos(x),弳度制
math.hypot(x, y)#返回兩股斜邊長sqrt(x*x + y*y)(Euclidean norm)
math.sin(x)#sin(x),弳度制
math.tan(x)#tan(x),弳度制
math.degrees(x)#將弳度轉換成角度制
math.radians(x)#將角度轉換成弳度制
math.acosh(x)#雙曲餘弦反函數,arccosh(x)
math.asinh(x)#雙曲正弦反函數,arcsinh(x)
math.atanh(x)#雙曲正切反函數,arctanh(x)
math.cosh(x)#雙曲餘弦函數,cosh(x)
math.sinh(x)#雙曲正弦函數,sinh(x)
math.tanh(x)#雙曲正切函數,tanh(x)
math.erf(x)#回傳x的誤差函數值(自己去wiki查)
math.erfc(x)#回傳x處的互補誤差函數值
math.gamma(x)#回傳x處的gamma函數
math.lgamma(x)#log(abs(gamma(x)))
math.pi
math.e
```
#### 5.1.2 random 模組
上次也稍微提到了```random```,專們用來產生隨機變數的模組。
當你想產生隨機變數但是又怕一不小心內核重置,原本的數據就搞丟時,可以使用```seed()```來固定住隨機值。
- [ ] 程式碼 5.1.2a
```python=
#這是上次的程式碼4.3.2f加上seed()
import random
random.seed(2)#改變seed內數字就可以改變隨機值
print(random.randrange(10, 20))#兩個整數之間取一個隨機整數
x = ['a', 'b', 'c', 'd', 'e']
print(random.choice(x))#在list或tuple中隨機挑一個
random.shuffle(x)#將原本的list打亂
print(x)
print(random.random())#0~1之間隨機取一個float
```
- [ ] 程式碼 5.1.2b
```python=
getstate()
setstate(state)
getrandbits(k)#0~2**k選擇數字
randrange(start, stop, step)#隨機整數
randint(a, b)#隨機整數
choice(list)#list中的一個隨機元素
shuffle(list)#顧名思義:洗牌
sample(list, k)#取樣k個
random()#0~1隨機float
uniform(a, b)#a~b隨機float
triangular(low, high, mode)#?
betavariate(alpha, beta)#beta distribution
expovariate(lambd)#exponential distribution
gammavariate(alpha, beta)#gamma distribution
gauss(mu, sigma)#gaussian distribution
lognormvariate(mu, sigma)#log normal distribution
normalvariate(mu, sigma)#normal distribution
vonmisesvariate(mu, kappa)#vonmises distribution
paretovariate(alpha)#pareto distribution
weibullvariate(alpha, beta)#weibull distribution
```
看見產生這麼多隨機變數,裡面有很多不同種類的分佈,我們來稍微看一下下~~
:::info
:snail: **Beta distribution**
 圖片來源:wikipedia
:::
:::success
:snail: **Exponential distribution**
 圖片來源:wikipedia
:::
:::warning
:snail: **Gamma distribution**
 圖片來源:wikipedia
:::
:::danger
:snail: **Gaussian distribution(Normal distribution)**
 圖片來源:wikipedia
:::
:::info
:snail: **Log normal distribution**
 圖片來源:wikipedia
:::
:::success
:snail: **Von mises distribution**
 圖片來源:wikipedia
:::
:::warning
:snail: **Pareto distribution**
 圖片來源:wikipedia
:::
:::danger
:snail: **Weibull distribution**
 圖片來源:wikipedia
:::
#### 5.1.3 python 內建函數
不用import任何模組(module)或是套件(packages),我們直接就能在python中使用。
- [ ] 程式碼 5.1.3a
```python
#因為我好懶惰,這邊各個函數的功能交給大家去找,並且標註上去~(共76行)
abs()
divmod()
input()
open()
staticmethod()
all()
enumerate()
int()
ord()
str()
any()
eval()
isinstance()
pow()
sum()
basestring()
execfile()
issubclass()
print()
super()
bin()
file()
iter()
property()
tuple()
bool()
filter()
len()
range()
type()
bytearray()
float()
list()
raw_input()
unichr()
callable()
format()
locals()
reduce()
unicode()
chr()
frozenset()
long()
reload()
vars()
classmethod()
getattr()
map()
repr()
xrange()
cmp()
globals()
max()
reverse()
zip()
compile()
hasattr()
memoryview()
round()
sorted()
complex()
hash()
min()
set()
delattr()
help()
next()
setattr()
dict()
hex()
object()
slice()
dir()
id()
oct()
#在這邊欠揍的說一句:"加油~~"
```

## 5.2 數據類型
在這個部分介紹4種類型:```tuple```、```list```、```set```、```dictionary```
先來比較一下它們的差異...

- [ ] 程式碼 5.2
```python=
L1 = ["hello", 1, 4, 8, "good"]
print(L1)
L1[0] = "morning"
print(L1)
print(L1[4])
print(L1[-1])
print(L1[1:4])
L2 = ["apple", "mango", "banana", 1, 4]
print(L1 + L2)
```
嘗試看看如果把程式碼5.2的list型態資料原封不動地改成tuple、set,會發生什麼事?
#### 5.2.1 tuple
當只有一個元素時,```tuple = ('hi',)```,否則它的型態不是tuple
佔用空間、運作速度都比list強。
#### 5.2.2 list
不同於tuple型態資料,list的自由度非常高,因此許多簡單暫存的資料都常常用list來表示。
- [ ] 程式碼 5.2.2a
```python=
my_list = ['p', 'r', 'o', 'b', 'e']
print(my_list[0])#提取序號只能是整數
print(my_list[2])
print(my_list[5]) #error
print(my_list[-1])
print(my_list[-5])
```

- [ ] 程式碼 5.2.2b
```python=
my_list = ['p','r','o','g','r','a','m','i','z']
print(my_list[0:8])
print(my_list[:9])
print(my_list[:])
```
- [ ] 程式碼 5.2.2c
```python=
n_list = ["Happy", [2, 0, 1, 5]]
print(n_list[0][1])
print(n_list[1][3])
```
- [ ] 程式碼 5.2.2c
```python=
#list基本功能
list.append(element)
list.insert(index, element)
list.extend(seq)
list.pop(index)
list.remove(element)
list.clear()
list.count(element)
list.index(element)
list.reverse()
cmp(list1, list2)
len(list)
max(list)
min(list)
list(seq)#將別的數據型態轉換成list,嘗試看看將set轉換成list~~
#基本操作
#['Hi!'] * 4
#3 in [1, 2, 3]
#for x in [1, 2, 3]:
```
## Homework 5
[d010: 盈數、虧數和完全數(zerojudge)](https://zerojudge.tw/ShowProblem?problemid=d010)
[d562: 山寨版磁力蜈蚣(zerojudge)](https://zerojudge.tw/ShowProblem?problemid=d562)
[a042: 平面圓形切割](https://zerojudge.tw/ShowProblem?problemid=a042)
* 刷題除了使用zerojudge以外,也可以嘗試英文版的[online judge](https://onlinejudge.org)