# 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..