# 1 運行環境
用pycharm軟件,類似vs。
## 分屏顯示

# 2 import 程序調用
程序運行的情況:導入即執行、何時導入何時執行、重復導入不再執行。
## 獨立運行 vs 調用運行:
執行import pinyin的時候相當于是把pinyin.py程序全部運行了一遍,(即使寫`from b import sqr`這種也不行)所以效率不高,所以最好的寫法應該是把要調用程序中函數意外的部分寫成**兩個下劃線**。
意思是:在調用b模塊時先判斷一下是被別人調用的,還是自己作為主程序__main__運行。如果是作為主程序運行,就啟用if下面的內容,如果不是,則只調用 其他內容 。
`if __name__ == '__main__' `
可以看到如果作為主程序運行,那么print(__name__)顯示的就是'__main__',如果是被調用的,那么`print(__name__)`,顯示的就是變量b的名字'b'


## module類
所有自定義的模塊都歸屬module類,這個 類有很多屬性,比如上述的__name__。`print(__file__)`可以顯示該文件所在的完整路徑。
## 包
可以將一個項目需要的模塊全部打包放入mypackage文件夾中。要放到同一個項目的子文件夾!記得由于版本的不一致,所有的mypackage最好都創建一個名叫`'__init__.py'`的空文件,以免有的版本不識別自己創建的文件夾包。
也可以右擊新建文件夾。新建完默認就是有`'__init__.py'`的文件。

## matplotlib數據分析模塊
其中兩個常用:pyplot.py用來創建圖表,animation.py用來創建動態圖。
> 但是當橫坐標不均勻時,plot會默認自動調整成均勻,這樣就失真了。詳見下面datetime部分。
官網:[https://matplotlib.org/index.html](https://matplotlib.org/index.html)
可以直接首頁的pyplot模塊,也可以搜索function功能,找到matplotlib.pyplot函數。

```
import matplotlib.pyplot as plt
weight = [20,30,40]
power = [10,33,80]
#可設置中文的橫縱坐標,但由于matplotlib默認是英文字符所以會出錯,加兩行:
plt.rcParams['font.sans-serif'] = ['fangsong'] # 也可設置其他字體格式如下圖
plt.rcParams['axes.unicode_minus'] = False # 設置完就可以正常顯示正負號而不是亂碼
plt.title('hhhh') # 設置圖表名字
plt.grid() # 設置網格顯示
plt.xlable('weight') # 設置橫坐標的名字
plt.ylable('power') # 設置縱坐標的名字
plt.xlim(0,200) # 設置橫坐標起止
plt.ylim(0.200) # 設置縱坐標起止
plt.axis([0,200,0,200]) # 上面兩句可以直接寫成這一句,用個列表的形式
size = [] # 專門寫一個size的列表來指定圖中點的大小:
for x in power:
size.append(x*x/10)
plt.scatter(weight, power, marker = '*', s = size, c = ['r', 'b', 'g', 'm']) # scatter是最簡單的橫縱坐標圖,s表示點的大小size,c表示顏色,可以配置不同的顏色
plt.plot(weight, power) # 要記得寫這一步才能根據橫縱坐標生成
plt.show() # show以后才能顯示圖表
plt.savefig('y:/desktop/111.png') # 保存到指定位置,如果是jpg格式需要pip先按照pillow包
```


> savefig不全的問題 圖片保存不全、圖片不完整:
> 如果plt.show()與plt.savefig一起,則可能出現保存的fig為空白,可以先把show注釋掉
> `plt.savefig('c:/users/zyt/desktop/22.png',dpi=200, bbox_inches='tight')`
> 也可以指定圖片大小`plt.figure(figsize=(15, 6.5))`
也可以修改點的形狀,在scatter后面設置marker即可。

也可以加一個參數s 用一個列表,表示大小。注意個數要與橫縱坐標個數一致。s的意思是size,可以直接寫`s = power`,但有時候power變化不明顯,可以人為的把每個power平方一下除以10。這時候寫法比較麻煩,所以干脆就直接用個size列表 :
```
size = []
for x in 戰斗力
size.append(x*x/10) # 用列表的append“添加”方法,把power里面的數據經過人為加工后添加到size里面
plt.scatter(weight, power, s = size) # s這個參數直接調用size列表中的數據
```

還可以指定顏色`c = 'y'` 意思是黃色yellow

```
plt.bar(weight, power, width) # 柱狀圖
plt.scatter(weight, power, s = size, c = 'b') # 點圖
plt.plot() # 折線圖
plt.pie() # 餅狀圖
```
保存時如果是要保存成jpg格式,需要先裝好pillow包。

# 3 參數 可選參數 必選參數
```
def sqr(a,b, c)
s = a+b+c
return s
```
- python可以通過參數的名稱來傳遞值:函數中參數的順序如果后面我們忘記了是abc還是cab,可以直接寫參數的名字。`mmm = sqr(c =3, b = 4, a = 4 )`無需擔心各個參數位置順序。
- 有的函數一開始的時候用了3個參數,已經被很多程序調用了,后續如果我們需要對函數優化,需要增加參數,那么前面已經調用這個函數的程序就會出錯。解決辦法:將后續新增的參數弄成可選參數的形式,也就是一開始直接指定默認值。`def sqr(a,b,c, d = 0, e = false)` 比如后續新增了d和e兩個參數,那我們在修改這個函數的時候可以指定默認值。一旦指定了默認值,系統就會認為這些是可選參數。
> 注:可選參數必需寫在必選參數的后面。
## 可變參數,多個參數
如果參數我們事先不知道有幾個,人為判斷大小也不合適,可以弄成“可變參數”,用列表形式。注意不要多寫`all_house = []` 不需要初始化。

> 或者直接用星號,那么在實際使用時就不需要用列表方括號了。記得帶星號的參數必需寫在最后,否則它后面的其他參數都會被默認是包含在它里面。
```
def house(*all_house):
s = 0
for h in all_house:
s +=h
return s
if __name__ == '__main__':
m = house(200,300,400,111,999)
print(m)
```
## 字典做為參數

```
def showinfo(info):
print('name is',info['name'])
print('age is', info['age'])
print('gender is', info['gender'])
if __name__ == '__main__':
s = {'name': 'zyt','age':25, 'gendle':'femal'}
print(showinfo(s))
```
如果是原來的調用,則需要輸入完整的字典。如果用兩個星號,則在實際應用時只要寫等于號即可。

```
print('name is',info['name'])
print('age is', info['age'])
print('gender is', info['gender'])
if __name__ == '__main__':
print(showinfo(name = 'zyt',age=25,gender='femail')) # 寫一句就可以了
```
# 數據類型

## 計數 十進制 模塊 decimal 中的Decimal方法
在python中如果進行小數計算很容易出錯,比如 0.1+0.2≠0.3 這是因為計算機用的是二進制,所以要先把我們輸入的十進制翻譯成二進制以后再計算,就很容易出錯。一般用round函數可以解決,但有時候也不一定,比如`round(2.675, 2)`保留兩位,應該是2.68,結果還是2.67。
## decimal
此時可以用decimal,英文中就是十進制的意思。但是decimal必須是字符串,而且一旦用了decimal所有的都必須用decimal。decimal計算非常慢。
```
from decimal import Decimal
Decimal('2.67') + Decimal('3') # 不能寫Decimal(2.67),否則還是用二進制計算
x= Decimal('0.3'), x+0.3 # 則也會出錯,必須是x + decimal('0.3')
print(float(x)) # 用int或者 float轉化即可
```
## format
用于處理顯示格式,也就是說,用round或者二進制默認計算,但只是在顯示的時候,稍微好看一點。

無窮大: `float('inf')`
## 邏輯運算
如果要用循環交替的功能,則只要`while true \n light = not light ` 即可。

## 代碼簡化
可以省略很多的if寫法,當然需要有比較強的語法能力。

```
x = input('please enter your name:')
if x:
print('welcome!', x)
else:
print('input false! please enter again')
```
# 時間
內置模塊time中的time函數
```
import time
用一個小程序計算我們自定義函數的運行速度與計算機內置函數運行速度比較
import time
t1 = time.time()
print(t1)
s = 0
for i in range(10000):
s += i
t2 = time.time()
print(t2)
x = (t2-t1)*1000
print(s)
print(f'it taked time:{x}')
t1 = time.time()
s=sum(range(10000))
t2 = time.time()
x = (t2-t1)*1000
print(s)
print(f'another time is:{x}')
```
## datetime的datetime方法 中文顯示時間 本地化設置
格式如下圖。寫的時候要寫`h = datetime.datetime.now()` 因為是datetime里面的datetime方法。如果直接寫`datetime.now()`會出錯。

可以用字符顯示:`str(datetime.datetime.now() )` 顯示結果為` '2020-3-8 20:37:21.333 `
如果想改變格式,可以用datetime.strftime()方法。`datetime.strftime(%Y * %m * %d-%M-%S)` 可以指定用上圖的什么格式來顯示,也可以指定用什么符號(比如用*)組合,但如果想顯示年月日,則需要以下設置:
```
import locale
locale.setlocale(locale.LC_CTYPE,'chinese') # 導入本地化設置,并將其設置為中文環境
```


## 反向顯示
用strptime方法,可以將一個字符串轉化成默認的datetime格式。

## 時間差 提高篇第八回 人為調整坐標軸

如果 是自帶模塊,則會顯示有誤,比如500年* 365 天,則有差,因為有閏年。所以最好的辦法是就第三方模塊,比如dateutil,有很多參數,就可以直接使用`years = 500`。

寫一個銷售函數用來統計銷售時間與銷售量的關系:詳見onedrive\newProject\time函數.py
```
from matplotlib import pyplot as plt
import datetime
plt.rcParams['font.sans-serif'] = ['fangsong']
plt.rcParams['axes.unicode_minus'] = False
dates = ['19-03-01','19-03-12','19-03-16','19-03-31']
sales = [5,22,48,78]
days=[] # 人為加工,引入時間間隔變量days,然后把輸入的saleday中的數據轉化成日期間隔,這樣plot畫出來的點就是正確 了
# for這部分是人為加入調整坐標軸的 人為調整
for d in dates:
delt = datetime.datetime.strptime(d,'%y-%m-%d') - datetime.datetime.strptime(dates[0],'%y-%m-%d')
days.append(delt.days) # delt是個timedelta的形式,所以要用delt.days轉化成數字的形式,才能用在坐標軸
plt.grid()
plt.ylim(0,100)
plt.xlabel('date') # 橫坐標的名字
plt.ylabel('sale')
plt.title('服裝銷量')
plt.xticks(days,dates) # xticks方法,有兩個參數,第一個參數是實際刻度(也就是日期差),第二個參數是想顯示的數字
plt.plot(days,sales)
plt.show()
```

# 錯誤 try except 結構 with..as..結構——處理文件打開關閉常用
## try: except: else: finally:


## with..as..