# 1 教程
[全民一起玩 python](https://www.bilibili.com/video/av85391396?p=4)
## 语法特点
* 不用声明变量
* if 后要加: 冒号
* **同一层级的代码要对齐**,如果有缩进则会认为是被包含关系的下一层级的代码
* 不要用 python 读取 word 文件,因为 word 中有各种各样的格式,读取有误
* print()里面内容用逗号, 连接,input里面内容用加号+连接。
* 自定义 函数:vba中自定义函数(如function ccc())如果有返回值,只需要写 ccc = xxx即可。
* python中,自定义函数与c#一样要写一个return xxx。
* 幂运算 用两个“/*/*” 表示 ‘2**3 = 8’
* 正数整除用“//”表示
![](https://img.kancloud.cn/c5/a4/c5a4399286b73ffbbd2d0146909454b3_632x363.png)
## 快捷键
https://www.cnblogs.com/liyuanhong/articles/4375890.html
加缩进:可以直接选中按tab
批量注释:alt +3
去注释:alt +4
![](https://img.kancloud.cn/22/15/221569db4af00be2508648ee972e52d4_464x276.png)
## 帮助文档
https://docs.python.org/zh-cn
## 全民一起玩python教程资料
[https://www.ukoedu.com/pythoncourseinfo](https://www.ukoedu.com/pythoncourseinfo)
![](https://img.kancloud.cn/e9/5a/e95a33aff67f119c1b32d035558d8900_836x622.png)
## bilibili 免费课程
![](https://img.kancloud.cn/3a/fc/3afc946b32503c2f3f7427d54c7f81b6_572x202.png)
[https://www.bilibili.com/video/av31294714?from=search&seid=14926404958243477782](https://www.bilibili.com/video/av31294714?from=search&seid=14926404958243477782)
pyp 中文网里面也有很多相关的视频
![](https://img.kancloud.cn/8b/42/8b42cfbbf0ecbaa5cb70d441b9a6a18e_1081x670.png)
官网:www.python.org,可以直接下载。也可以用 visual studio 编辑器编辑。但要注意重新安装一下 python 模块(重启visuan studio 安装程序,选择“修改”即可)。
## 学习网站
[知乎问答](https://www.zhihu.com/question/36082950)
[某博客中推荐的内容](https://www.cnblogs.com/guohongwei/p/10840963.html)
[廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/897692888725344/897692941155968)
[runoob 网站(推荐)](https://www.runoob.com/python/python-tutorial.html)
## 环境设置:添加行号
[https://www.jianshu.com/p/dd1dc070367f](https://www.jianshu.com/p/dd1dc070367f)
[https://blog.csdn.net/huidr0/article/details/97804411](https://blog.csdn.net/huidr0/article/details/97804411)
[http://www.pythonheidong.com/blog/article/49497/](http://www.pythonheidong.com/blog/article/49497/)
其中文本configHandle里面设置的要跟linenumber里面一致。注意几行代码的一致性,比如configHandle.py 是否在python/Lin/idlelib文件夹,如果没有,则从下载文件中复制到扩展包中。
![](https://img.kancloud.cn/e8/f0/e8f0621ed4723497e355477c91649365_638x557.png)
可以先运行linenumber.py。看是否有问题,如果没问题即可。
或者:用alt+g定位错误代码行。
![](https://img.kancloud.cn/da/b2/dab2586cf7de402e5c4c60bdc1a8cd51_295x234.png)
> 重启后,在options设置里面记得勾选!!
![](https://img.kancloud.cn/72/d2/72d26fe4c9e8358dfcb4fa788a2596c0_466x412.png)
## 符号
不等于:'!='
# 占位符 第18讲
```
total = total +1
print('the total is:' , total) //这里用逗号隔开即可,而不是用加号
```
但是如果要连接字符串时,就要写加号。
![](https://img.kancloud.cn/c0/ce/c0cee47d25796a5485185a4f31aa2ea8_294x30.png)
```
name = 'abc'
age = 12
s = '我叫'+ name + '我的年龄'+ age+'岁'
print(s)
上面可以替换成:
s = '我叫%s,我%d岁了,还 没读书。' &(name,age)
```
> 记得在后面加`& (name, age)` ,不同的占位符代表的不一样。
![](https://img.kancloud.cn/0c/63/0c63ce1b71054bc424dbf04b17219db7_406x328.png)
![](https://img.kancloud.cn/b4/20/b420d7b3e907e40f0b5815ef9706325d_561x394.png)
或者用`s = f ' 我叫{name},今年{age}岁 ,没有读书 ' `。直接 f 加引号的办法,中间就可以直接用变量名+花括号。f与引号不能有空格。
![](https://img.kancloud.cn/0d/1e/0d1e3dd770f498f339e26e49733e894a_395x98.png)
![](https://img.kancloud.cn/94/08/94082de45abce84eeb4cce1cf9abf84a_376x121.png)
# 交换变量
```
a = 3
b = 5
c = 1
a,b,c = c,a,b
print(a,b,c) #显示结果为:a,b,c = 1,3,5 注意交换,是把等号右边的值传给左边。
# 显示
```
# 2 函数
python 里面有很多的库,调用的时候要写“import”,比如数学运算是在一个叫`math`的库里面,要写`import math`调用。同时如果要显示结果必须写
```
import math
print(math.sin(3))
```
![](https://img.kancloud.cn/0c/05/0c0545100ae76af21b6a0e8a30506ae9_133x47.png)
这里面 print 不能少,否则无法显示计算结果。
> 同一层级的代码必须对齐,否则默认为是下一层级
常见模块(库 ):
![](https://img.kancloud.cn/97/96/97961233b09de71a7d25bab7b6310371_466x483.png)
标准库 http://docs.python.org
## print 函数
用逗号隔开,与其他语言不同!
`print ("张三",power)`
vba 里面是用`&` -> `msgbox '张三' & power`
用单引号还是双引号都行。
## 交互式:用 input 函数
但是input 默认都是字符串,所以需要 int 或者 float函数转化成数字
![](https://img.kancloud.cn/9b/1c/9b1c150c48c5da7f108124f726bebb43_482x81.png)
也就是说,`c = int( input ('请输入汉字:') )` 这样得到的c也是一个int,不管input里面是汉字+数字,只要用户输入的格式正确就行。
## 音频文件
课程第六回
# 3 os 模块
打开文件、打开文件夹。
其中有一条 `os.system()`可以用来执行类似打开文件夹、关闭等的操作
![](https://img.kancloud.cn/da/43/da438b00600227eca9071a7f5ebf1254_651x332.png)
```
import os
os.system('start …… ' ) 用斜线/。
os.system('open ') //在苹果操作系统上面要用 open
```
![](https://img.kancloud.cn/ca/2c/ca2c4bf1d3ed54dd809aa7a00640ebca_506x319.png)
```
import os
os.system('start Y:/Desktop/测试.xlsx')
```
![](https://img.kancloud.cn/af/b4/afb4eb124baa86f6bc3c6f8f8ecce48a_228x64.png)
或者是反斜线也行。
![](https://img.kancloud.cn/0e/d9/0ed930357feb26ddcc995479496832c4_369x66.png)
## if else
```
if xxx:
elif xxx:
else:
```
## 逻辑运算 and 多条件
```
if gender =='femail' and (age<20 or age > 30):
也可以写成:'if gender == 'femail' and not 20<age<30'
```
## open
如果直接写`os.system('start Y:/Desktop/测试 .xlsx', 'r')`,则只是打开了这个文件,但后续想对文件进行操作,仍建议创建对象。
也可以弄成一个对象
`f = open('start Y:/Desktop/测试.xlsx','r') #只读方式打开`
r:只读,w:写入(原文本全部清除后再添加新内容),a:追加。
用 open 方法,但 open()执行以后,就自动创建了一个对象,我们可以用 `f = open('')` 来表示,如果不,也可以直接用`open('')`来表示,后续可直接调用`open('').readlines`等。
所以 f 就表示我们打开的这个文件窗口了。
以下例子用来统计出现次数,同8字典。
```
f = open('','r')
p = f.readlines() #如果文本中有回车换行,那么 readlines 方法就会自动识别,如果有 4 个段落,那么 p 就变成了一个有 4 个元素的列表,其中每个元素是一个字符串,用 ' ' 括起来。
i = 0
for s in p:
if '你真漂亮' is s:
i=i+1
print(i,s)
f.close()
```
![](https://img.kancloud.cn/53/71/5371f33421ea520f45c4f18c5d6364f1_377x295.png)
## readlines
`p = f.readlines()` #如果文本中有回车换行,那么 readlines 方法就会自动识别,如果有 4 个段落,那么 p 就变成了一个有 4 个元素的列表,其中每个元素是一个字符串,用 ' ' 括起来。
比如下面这段话一共3段。
“我去吃饭了,
你叫一下他。
他没听我说。
”
那么p = f.readlines()以后就是:`f.readlines() = ['我去吃饭了,' , '你叫一下他。' , '他没听我说。' ]`
所以如果p.count('我'),也可以统计出结果。
## 读取文件保存报错
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence
因为不要用 python 读取 word!!!,word 有自己软件自带的一些 markdown 语法,与 python 不兼容!!!
[https://blog.csdn.net/lqzdreamer/article/details/76549256](https://blog.csdn.net/lqzdreamer/article/details/76549256)
可修改代码,`f = open('','r',encoding = 'gbk')` ,或者是`f = open('','r',encoding = 'utf-8)` 有的时候用gbk,有的时候用utf-8,看情况。比如字典中的自定义函数例子mytools.count就只能用gbk。
第16讲。
![](https://img.kancloud.cn/83/3a/833a96961433679cd9e256890ad69255_621x250.png)
![](https://img.kancloud.cn/6b/25/6b25dae8daeffde57179121f41c520bd_716x235.png)
## 用一个新的txt文件来存放拆分的单词内容 拆分单词 分词 类似也可以用8 字典。
将一篇英语文章全部拆分成单词,放入一个新的txt文件中:
```
f = open('Y:/Desktop/world.txt','r')
p = f.readlines()
# 如果f 文章一共4段,那么p就有4个元素,每个元素对应一段
total_words = []
for s in p:
#为了得出每一段中的所有单词,再汇总
s = s.replace('.',' ')
#标点符号全部去掉,用空格代替,后续就可以只用空格进行划分了
s = s.replace(',',' ')
#标点符号全部去掉,用空格代替,后续就可以只用空格进行划分了
s = s.lower() #有的单词大小写不同会被识别成不同单词,所以要统一格式
line_words = s.split(' ')
#每一段全部拆分成一个一个单词
total_words.extend(line_words) #也可以写成total_words = total_words + line_words
,但如果是加法,则每次都会新建一个列表,效率低,而用extend方法则可以直接在原有列表中添加。
f.close()
set_words = set(total_words)
total_words = list(set_words)
total_words.sort()
#排序一下按字母表顺序排
f2 = open('Y:/Desktop/world22.txt','w')
f2.write('\n'.join(total_words)) # 用write方法将字符串写入txt文件,但由于我们之前拆分过的是列表,不是字符串,所以要用join方法再连起来,但我们更希望换行,所以可以用'\n'把这些列表连接成一个字符串,同时又有换行的功能
f2.close()
#一定要记得写close!!!!不然会发现新建了文件但打开没有内容,因为如果不写close,则默认东西还是在内存中。只有加了close以后才能看到文件内容。
```
> 用write方法将字符串写入txt文件,但由于我们之前拆分过的是列表,不是字符串,所以要用join方法再连起来,但我们更希望换行,所以可以用'\n'把这些列表连接成一个字符串,同时又有换行的功能
;
> 一定要记得写close!!!!不然会发现新建了文件但打开没有内容,因为如果不写close,则默认东西还是在内存中。只有加了close以后才能看到文件内容。
> **代码简化**!!!有一些s只是用来传递值,所以可以简写成`line_words = s.replace(',',' ').replace('.',' ').lower().split()`
> ![](https://img.kancloud.cn/57/52/5752a8063e1c250881b7e1fdce1cef32_193x137.png)
![](https://img.kancloud.cn/63/e2/63e27bf650b659c3135d78308b495d36_567x248.png)
![](https://img.kancloud.cn/8b/2e/8b2ef7811543f21529141ea2fb564ab2_67x386.png)
但还有个问题:上图中单词出现重复,我们需要的是不重复的单词。此时可以用set解决。在sort转置前加两行:
```
set_words = set(total_words) # set功能的意思是得到不重复的子集,不考虑顺序。详见“7 集合”
total_words = list( set_words) # 详见“7 集合”
```
![](https://img.kancloud.cn/73/c8/73c82c47e386d76a64a8e6802c95e2b9_399x357.png)
![](https://img.kancloud.cn/20/cb/20cbbf70d3c184908ee706569fdef28e_183x348.png)
> **简化:**
![](https://img.kancloud.cn/ab/dd/abdd9412c0955508049fbbf127683077_653x357.png)
![](https://img.kancloud.cn/f9/2a/f92a7b29d225f4f111b518342a3d8d95_402x331.png)
![](https://img.kancloud.cn/72/e4/72e4a163ea5c6365caa32dcd260553d4_418x340.png)
也可以用第三方插件,如jieba.py
# 4 循环 if、while、for
```
if age<18 : $$冒号不能省略!注释用$$美元符号
print('未成年')
else :
print("成年")
```
![](https://img.kancloud.cn/40/3a/403a0c61dd3860d6637b0f2d35826db0_653x304.png)
if 在 25-30之间:25<= age <=30
![](https://img.kancloud.cn/a9/a3/a9a3e5719db41ac96d086a221bbb5a9d_634x338.png)
while 重复录入
![](https://img.kancloud.cn/66/69/66696a15a0a71f0deb80e636a42e1612_363x237.png)
注意有计数器的功能! 用i++ 这样的形式来计数,然后作为判断条件。
```
s = 'y' #记得要有初始值!!!!
m= 0
while s =='y'
name = input('please enter name:')
age = input('please enter age:')
m = m +1
s = input('do you want to continue?(y/n)')
print("total:", i )
```
![](https://img.kancloud.cn/9e/3a/9e3af37e5b1b2f8c75a38479b7ad9a7e_300x157.png)
## 死循环
ctrl+c 强制退出
但有时候为了不断输入,可以人为制造死循环。如下图
```while 1==1
x = int(input('请输入数字:'))
```
![](https://img.kancloud.cn/b6/38/b638b46c54d4aa983b9d279afe4916f8_636x294.png)
## for
for i in 列表:
![](https://img.kancloud.cn/45/94/4594e2ac62446b19c134cad6f05143d1_645x267.png)
语句类似于c#、vba 中的`for each`
>**但 for 循环只能读取,不能修改列表中的值,用 while 则可以修改列表中的值**
![](https://img.kancloud.cn/93/ec/93ec68469b8fc1c6c6ad9c3c7899ecc0_662x295.png)
## 随机数
`import random`
random.randint(a, b) 随机生成 a b 之间的整数。
![](https://img.kancloud.cn/f0/82/f08249d3d86cfd802e907534f4c80e7d_653x365.png)
生成随机数,用来猜大小
记得 break
![](https://img.kancloud.cn/bc/9d/bc9dca719520b748de5cf7b0093f7e2e_241x267.png)
# 5 序列
包括列表、字符串、元组、集合等
![](https://img.kancloud.cn/32/7c/327c0c1d3333a4420915f923e420ee6d_309x197.png)
# 6 列表,可以理解为数组 第 12讲
用方括号`[]`
> 注意取数范围!
可以用冒号表示数组中的某几个元素,但注意右边是开区间,要比下标元素大 1,也就是,如果列表里面只有 5 个元素,那么下标编号就是 0-4,如果要从下标 2 开始取数到下标 4,那么必须写成 a[2:5),而不是 a[2:4]
![](https://img.kancloud.cn/8f/27/8f2710d19d608e693bf550df2b482f26_375x178.png)
> 但如果不写取值范围的起始值,只写冒号后面,与上面一样,也是开区间,比下标大 1。
![![](https://img.kancloud.cn/59/20/5920a34cc084efd16dd8ffacc519066c_512x98.png)](images/screenshot_1582969650489.png)
## 长度
```
a[300,400,'hello',66.6,'well']
print(len(a)) #即可求出长度
print(a[0:len(a)-1]) #即可列出 a 中所有元素,这样当后续 a 进行修改时,就不用在修改 print 里面的内容了
```
![](https://img.kancloud.cn/0e/bf/0ebf062592d6f8b5567d0cb03370f640_300x86.png)
## 相乘
```
a[1,2,'a']
print(a*3) # 则是把 a 里面的元素复制 3 次
```
![](https://img.kancloud.cn/42/3e/423e419d4ede12786ec3ba59ba51b092_452x58.png)
## range(m,n) 第 12讲
比如range(3,7)
自动生成 [3,7)之间的数字,也就是[3,4,5,6],左闭右开,要记得!!!
![](https://img.kancloud.cn/52/0e/520edb54c90b4a12afe7e7f7ae4079f7_568x215.png)
也可以只提供 一个7
![](https://img.kancloud.cn/89/52/8952850a065287827a5cd67136e4c29f_644x332.png)
range 可指定步长,比如range(1,10,2),生[1,3,5,7,9],不需要跟其他语言一样自己 i++,因为默认每次循环,都自动跳到下一个。
![](https://img.kancloud.cn/70/ab/70ab4a6a82c8620ece0dad0d9fe4cdf7_639x299.png)
## 元素可替换
```
a = [300,400,'hello',66.6,'well']
a[3]='www'
显示:a = [300,400,'hello','www','well']
```
![](https://img.kancloud.cn/de/1c/de1cf6e113e1af3aa8008357a0f39819_585x207.png)
## 添加列表元素
```
a=[1,2,3]
a+4 #报错!!!!因为加号左右两边格式不一样
a+[4] #可以,结果变为[1,2,3,4],但 a 本身还是[1,2,3]
a = a+[4] # 除非这么写才可以a=[1,2,3,4]
a.insert(2,'qqq') #从下标2开始插入qqq,qqq的下标是2,原来的数据往后移
```
![](https://img.kancloud.cn/14/d1/14d19382a79750521e004e8ae69effbc_278x329.png)
**更好的办法:**
直接写a.append(4)即可。因为列表是对象,可以用属性!
![](https://img.kancloud.cn/f5/57/f5579fe9023b0054ec4421e8ede1cc4c_294x309.png)
第15讲,也可以用`a.exten(b)`,如果用加法,则每次都会新增一个新的列表,效率低。
![](https://img.kancloud.cn/b4/03/b4038a728864ef950acb54fa62020302_354x293.png)
## 列表是个对象,可以用各种属性!!! 第 13讲
![](https://img.kancloud.cn/56/bf/56bfd227488a74d532801c108c25601f_326x213.png)
面向对象!——属性+方法
所以上面的例子直接写`a.append(4)`即可
![](https://img.kancloud.cn/d9/4d/d94d3013aec403c8734e8de973262068_674x394.png)
![](https://img.kancloud.cn/08/58/08581611df464ec9accc364a38a59735_472x89.png)
其他方法:
```
a.append()
a.count('NNN') #统计某个元素 NNN 出现的次数
a.insert(i,'NNN') #从下标 i 开始插入'NNN',原来下标 i 的元素变成下标 i+1
a.pop(i) #移除下标 i 的元素,不直接括号内写要移除的内容!!!!如 a.pop('NNN')则报错,而要用 remove 方法!
a.remove('NNN')
a.reverse() #倒序
a.sort() #从小到大自动排序
```
![](https://img.kancloud.cn/43/29/4329d86c657f2ac44b2ee6e7ca59bb28_639x355.png)
![](https://img.kancloud.cn/2f/66/2f6692c7e97d7921a0e6ac4d89ae5e55_653x392.png)
## 转置或倒序
>注:如果要显示转置倒序后的数列,要先写r.sort(),再写print(r),不能写成print(r.sort())!!!!
![](https://img.kancloud.cn/9c/b3/9cb34732f4d21c021d87f9db03da0441_690x208.png)
倒序也可以写成
a[ : : -1] #步长-1,但原来的 a 数列没有变化。
字符串也可以转置,注意不要写成s= ['spring is comming'],而是直接写s = 'spring is comming'
## 切片
列表可切片,如
`a = [300,400,'hello',66.6,'well']`
字符串也可以切片。字符串本身不能改变元素,但通过切片就可以。
```
s = '春眠不觉晓'
s[2:] #显示'不觉晓',从下标 2 开始,也就是第三个元素
s[:2] #显示'春眠',从第一个元素开始一直到下标 2(不包含下标 2)
```
所以可以利用切片的特点,往字符串中间插入或者改变字符串,但其实只是显示而已,原来的字符串还是不变,除非写成`s = s[2:]`
![](https://img.kancloud.cn/da/fb/dafb887b020eb6a24fbd1d72cabd934e_371x152.png)
![](https://img.kancloud.cn/6b/1d/6b1d08cc79421d9a3ac36ec34cef4b62_368x236.png)
字符串也可以转置,注意不要写成s= ['spring is comming'],而是直接写s = 'spring is comming'
![](https://img.kancloud.cn/4f/cd/4fcdd05d4f26cb4b67fb4b40e4584cfc_280x122.png)
![](https://img.kancloud.cn/da/fb/dafb887b020eb6a24fbd1d72cabd934e_371x152.png)
# 7 set、list集合转换成列表 列表转换成集合 集合列表转换 列表集合转换 删除重复 去除重复
在前序open类型中:
```
set_words = set(total_words)
total_words = list( set_words)
```
集合用{}表示,不允许重复,可以用多个数据类型,没有顺序,所以没有下标,如果写X[2]就会报错,因为没有下标。
![](https://img.kancloud.cn/39/54/395492df63476a50c98d6e78329fdb11_715x340.png)
但python中提供了内置函数`set(x)` 以及`list()`函数
```
y = [3,4,5,1,3,1,3,23]
x = set(y) #第一次转换:用set来得到一个不重复的集合,没有顺序,没有下标
得出:x = {3,4,5,1,23} #注意是用花括号{}
y = list(x) #第二次转换:用list将y转换成列表
得出:y = [3,4,5,1,23] #注意是用[]
```
# 8 字典 第16讲
集合、嵌套等。键值对。写法:
`names = {'张三':24, '李四':25, '王五': '三好生' } # 注意不能写成 '张三 : 24' `
无下标,无顺序,所以如果写`name[2]`,则会出错。
## 查询
`names['张三']` 就会显示24。
键不能重复。如果有多个,那么默认以最后出现的键值对为准。
## 修改
值可以修改,**但键不允许修改**。
`names['张三'] = 30`,即可。
如果要修改键,则只能先把原来的键值对全部删除,然后再新增。
## 删除 再新增
```
names.pop('张三')
names['张六'] = 42
```
![](https://img.kancloud.cn/17/c0/17c0bcca60cff6ee41d39b6cc0c3862d_723x338.png)
但因为pop时会有一个返回值,所以其实上面代码可以合并:
`names['张六'] = names.pop('张三')`。
![](https://img.kancloud.cn/c8/f5/c8f50953a10ae7efedf54abf9ccd8d6d_698x178.png)
## 循环遍历字典
用for,但遍历后显示的是键,不是值
```
names = {'张三': 24, '李四': 25, '王五': 28, '赵六': '刘能'}
for x in names:
print(x)
显示:
张三
李四
王五
赵六
如果要显示值,则:
for x in names:
print(names[x])
```
![](https://img.kancloud.cn/ee/05/ee055ee299d134c0bacb9f7884ae22be_284x284.png)
## 多个value的怎么处理:
用“列表套字典”的形式:如图。
![](https://img.kancloud.cn/b6/38/b638b46c54d4aa983b9d279afe4916f8_636x294.png)
```
import random
questions = [{'题目':'3+2 = ', '答案':5, '难度系数' : 0.3},
{'题目':'1+2 = ', '答案':3, '难度系数' : 0.1},
{'题目':'30+12 = ', '答案':42, '难度系数' : 0.7},
{'题目':'39+21= ', '答案':60, '难度系数' : 0.9}
]
while 1==1:
# 做一个死循环一遍一直出题
i = random.randint(0,4)
print('下一题难度系数是:' , questions[i]['难度系数'])
s =int( input('请输入 ' + questions[i]['题目']+ '的答案:'))
# 注意是用加号连接,不是用逗号
if s==questions[i]['答案']:
print('恭喜答对了!继续答题')
else:
print('错!继续答题')
```
## 统计次数——同##open中的两个例子。
1、先文章分段
2、统计某段中人物1-12分别出现的次数
3、把值加到原数组中
![](https://img.kancloud.cn/76/ad/76ad771699e9008229e9e221524fd0d4_674x261.png)
txt:
“张三约李四去打王五,但是王五刚好没在家,于是张三又出主意说可以改天。张三这个人很不好,经常欺负李四他们。李四也不敢吭声。
李四看起来老实,其实很不老实,是个名副其实的两面派。王五真的是二百五。
王五妈妈经常说:“王五啊王五,你真的是个二百五。”
```
girls = {'张三':0,'李四':0,'王五':0}
f = open('Y:/Desktop/张三.txt','r',encoding = 'utf-8')
for s in f.readlines():
for name in girls:
girls[name] = girls[name] + s.count(name)
#详见open里面的readlines注释,s变成了一个由字符串构成的列表。
for k in girls:
print(k,'出现次数:', girls[k])
f.close()
```
![](https://img.kancloud.cn/96/ab/96ab445bf40c1f096787dd82fd3c9706_472x257.png)
# 9 str 类
上述各种字符串的操作,也可以用 str 类自带的方法解决:如
`s.replace('a','b')`
![](https://img.kancloud.cn/f8/1d/f81d5055c4f767888a0f3c4fde6bffb1_180x68.png)
str.find('a'),默认返回的是'a'出现的第一次的**下标**
str.find('a', 6,10) 表示查找从下标 6 开始,找到下标是 10,如果没找到,返回-1
> 如果想查找到第二个'的' 下标,则可以先用 find 找到第一个'的'下标,在从其下标开始往后找。
![](https://img.kancloud.cn/a8/9d/a89d219d34f641a8e7b9202c46ce6ca4_647x262.png)
所以可以用一个循环,每次找到下标,就从后一个开始找,就能找到所有的关键字了。
![](https://img.kancloud.cn/5f/c6/5fc60b488123a45fadc6583eb2d69ee8_294x260.png)
```
s = '找一个最爱的相爱的亲爱的人'
c = s.find('的')
while c != -1:
# 如果找不到,则 c 返回的是-1,所以可以来控制。不要写成while c < len(s),因为 c 是下标。
print('的出现在:'c)
c = s.find('的', c+1)
```
`s.rfind('xx')` 表示从后开始往前找
`s.strip()` 表示去掉最左右两头的空格,也有s.lstrip和s.rstrip就是去掉左边或者右边的空格
![](https://img.kancloud.cn/b7/56/b7564b28c3d61db04f0a648926178956_291x253.png)
`s.replace(' ', '')` 表示去掉字符串里面的空格,但不改变字符串,如果要改变,则要写成`s = s.replace(' ', '')`
![](https://img.kancloud.cn/f6/d8/f6d8d8c359e99d6c6b7593beb7dbba82_319x110.png)
还有其他方法
![](https://img.kancloud.cn/81/c8/81c8abff4d84e27959d10b68005c3dfe_648x322.png)
`s.split()` 分割
分割完就变成了列表的形式
![](https://img.kancloud.cn/a1/87/a187289c7fc7702658bf3db519e3de2c_625x256.png)
`'$'.join()` 拼接
意思是用$拼接两个字符串,如果只想接起来,则可以用空字符串拼接
![](https://img.kancloud.cn/87/52/8752169cf0bf738bcd460087e4d7327b_596x163.png)
如果要用+加号拼接,则可以直接写`'+'.join(a)`,这样的写法意思是,python 会自动识别'',或者[],或者()元组,将这三种都视为对象,所以可以直接`[20,30,33,20].count(20)`调用这种方法,只不过不便于阅读。
# 10 元组
`a = ('mm', 22, 'hello')`
与列表类似,只不过用圆括号标识,可以用不同类型的数据,但也同字符串一样不允许修改。
# 11 模块
## 如何引用模块
`import math`即可。可以简写`import math as m`
即可,后续就不用写math.sin(3),可以直接写m.sin(3) ,但如果后面又重新定义了m=7,则无法引用m.sin(3),也无法引用math.sin(3)了。
也可以写`from math import *` 但不推荐。
![](https://img.kancloud.cn/40/e3/40e33d5adf98742e292d3e78f6212b7f_405x246.png)
## 模块无法安装
可用cmd命令安装,如果需要更新pip,则可以用cmd 的cd命令找到python.exe文件夹,然后在upgrade。
![](https://img.kancloud.cn/c6/cf/c6cf1160877ba859c15acedb7a212ce1_711x736.png)
## 自定义函数 def
比如数字转换中文。这个函数不需要在函数里面写for循环。
![](https://img.kancloud.cn/4a/12/4a12f83a10c7611cb6a576ecec143603_456x225.png)
如果自定义函数无返回值,则最好也写一下return,只不过return后面不需要再写东西。
## 列表转字典 字典转列表
python中有一个字典类dict类。dict.fromkeys(列表, 默认值) 有两个参数。比如:
```
n = ['张三','李四','王五','赵六']
d = dict.fromkeys(n,55)
得出:
d = {'张三':55,'李四':55,'王五':55,'赵六':55}
```
dic.fromke
![](https://img.kancloud.cn/f2/4c/f24cccf74c0d0a7caa32257dcd955a50_404x183.png)
![](https://img.kancloud.cn/07/61/076159977faa1e58d625c69b0ab15e60_265x185.png)
可以将所有def自定义的函数全部存放在一个类似mytools.py的文件中。下次只需要确保要调用的mytools.py与要输入的文件在同一个文件夹下, 就可以直接import mytools即可。调用时:`r = mytools.count('d:/desktop/张三.txt',n)`
即可。
![](https://img.kancloud.cn/5f/2d/5f2dfb2976f7783ccf5d87cb2c67a9c7_683x197.png)
## 数字转中文大小写
`def chNum(x):`
如果是532,可将各个位数识别出来,也可以直接‘伍叁柒’
![](https://img.kancloud.cn/a9/7c/a97cdd94946f47af8a2cc8f3b9aa4aac_857x233.png)
## 安装第三方库 第17讲
用系统自带的pip命令行。不是在idle窗口中,而是在cmd命令行中输入pip list。
命令行输入pip提示非外部或内部指令:解决办法:https://jingyan.baidu.com/article/ca41422f8db0f05eae99ed84.html
由于org是国外网站,如果无法安装,可在国内的网站安装,输入pip install -i +网址 +插件名结巴
`pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba`
![](https://img.kancloud.cn/df/69/df6921e0b0941b04512c60d7fb9b1b43_777x408.png)
![](https://img.kancloud.cn/a8/92/a89289b8c8342503245dfc96aa5cb182_679x111.png)
## 炒股模块
![](https://img.kancloud.cn/ba/10/ba10e4f8a4c21a26b40ca36598a865f4_373x221.png)
## 解方程
![](https://img.kancloud.cn/36/4b/364b602bbdde3df45b527d63ab9d6d36_344x301.png)
## excel模块
![](https://img.kancloud.cn/7c/45/7c456483db677f011446ba4dba23c482_561x351.png)
![](https://img.kancloud.cn/1d/bf/1dbfff76578081a2fb864af08946aada_1037x461.png)
```
import xlwings as xw
excel = xw.App() # 一定要先创建excel 的app才可以有下一步
excel.quit() # 用来退出excel程序。如果是关闭excel文件的,一般不用这个,用close()
wb = excel.books.open('C:/Users/zyt/Desktop/22222.xlsx') # 接下来就可以用wb来指定打开某个excel文件了
wb=excel.books.add() # 先add完再用save方法保存,不能直接在add括号中写路径,会出错
wb.save('C:/Users/zyt/Desktop/bbbb.xlsx') # 可以把打开的文件另存
wb.close() # 关闭excel文件
wb.sheets.add() # 增加一个sheet,可以括号里面加sheet的名字,可以用一个循环添加多个sheet,名字可以用占位符表示,如下图
wt = wb.sheets['第一张sheet'] # 可以写sheets[0],或者直接写sheet的名字。注意点后面是sheets类,而不是sheet类 不要写错
wt.name='hhh' # 改sheet名字
wt.clear() # 清空sheet内容,包括格式
wt.range() # 其余的range对象跟vba中差不多功能
wt.range('a1').color = 65533 #设置单元格格式黄色,不能写成rgb(253,255,0)
```
![](https://img.kancloud.cn/8b/1c/8b1c89c6259c77ce35f7734aec43b316_535x153.png)
也可以把range赋值给一个变量x,就自动生成一个列表对象。
![](https://img.kancloud.cn/f9/37/f93742110782a75df5da2094c57c6770_317x101.png)
![](https://img.kancloud.cn/3e/39/3e39836307f83961609ae921bf49be84_591x196.png)
## python调用excel中的vba
创建对象m,
```
import xlwings as xw
app = xw.App()
wb = app.boos.open('C:/')
m = app.macro('VBA的名字') # 用macro方法,但这个方法是app.macro,不是wb.macro
m.run()
```
![](https://img.kancloud.cn/96/c9/96c96595a987facd95e6c8333b936ac5_925x520.png)
## os 第20讲
```
import os
x = os.listdir('c:/users/zyt/desktop') # 用listdir属性可以得到某个文件夹下所有文件的名字列表。
但listdir只返回第一层,如果要返回第二层 用walk方法,一般放for里面
for i in os.walk('c:/users/zyt/desktop')
```
![](https://img.kancloud.cn/61/d3/61d3f4b93072c32dc48d0adf93591648_1037x592.png)
![](https://img.kancloud.cn/ad/90/ad902ed16942b575acc511593fc1ce6b_502x448.png)
# 爬虫
模块 urllib.request 模块中的urlopen功能
`from urllib.request import trlopent` 即可。也可以写import urllib.request
再用一个bs4 外挂中的 BeautifulSoup功能。
![](https://img.kancloud.cn/ea/40/ea4051c79368b7b27c334ca0ec3cb44d_851x560.png)
```
from urllib.request import urlopen
from bs4 import BeautifulSoup
r = urlopen('http://192.168.168.231:8080/WebReport/ReportServer?reportlet=PM%2FXMSZ%2FAssessmentReportQuery.cpt')
c = r.read()
#s = c.decode('gbk') ##在网页中点击F12,查找“charset”就可以得到该网页的编码方式,集团这个网站是gbk编码
bs_obj = BeautifulSoup(c, features = 'lxml')
# 有这一步以后暂时不需要上面的decode转换了。但是会提示。'UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). '错误,如下图。只要加入 feature = 'lxml'即可
```
![](https://img.kancloud.cn/43/9f/439feeea759dec0542644d968664f122_753x232.png)
![](https://img.kancloud.cn/a6/36/a636526c76394ebb89290cd91ba25f02_1054x498.png)
# 加载窗体
## 加载 fomr、单行文本框、按钮
在输入汉字时点击按钮,转化成拼音。这里要用到pinyin这个插件。详见“窗体.py”。
```
from tkinter import Tk
, Entry, Button # Entry是用来插入单行文本的框,Button是按钮
import pinyin
fm_main = Tk()
def ok():
print('hellohhhhhh')
def convert():
s = ent_hanzi.get() # 获取用户在文本框中输入的字符串
p = pinyin.get(s) # 用插件中的get方法,及可转换成拼音。如果用的是其他插件,估计方法名称不同。
ent_pinyin.insert('end', p) # 直接用文本框后面加个点,接insert方法,即可插入,两个参数,一个是指定插入的位置,如果是end就是光标后面,如果是‘0’,就是在最开始插入;第二个参数是插入的内容,也就是上一步中翻译好的拼音。
return
ent_hanzi = Entry(fm_main) # 创建单行输入框对象,命名为ent,调用Entry方法,括号内指定要显示在哪个form中,
ent_pinyin = Entry(fm_main)
btn = Button(fm_main, text = 'click here', command = convert) # 点击可执行自定义函数,用command直接跟函数名即可,无需引号。
ent_hanzi.pack() # 创建完以后,还需要对象的pack方法,才能加载显示
ent_pinyin.pack()
btn.pack()
fm_main.mainloop() # 这个是默认添加的
```
> 自定义函数必须写在调用的语句前,比如command前,如果写在command后面,则出错。
![](https://img.kancloud.cn/f2/30/f2306776cb911fba7b1079a26fafc7d4_1060x567.png)
![](https://img.kancloud.cn/7e/a2/7ea2ac6e0be5ada18a13cb9a8dc15d99_585x596.png)
## 读取文本框内容、将内容写入文本框中
一些方法
[https://www.cnblogs.com/hackpig/p/8196480.html](https://www.cnblogs.com/hackpig/p/8196480.html)
读取:get即可。初学者容易犯的错误:不需要去管使用者一输入数据就去读取文本框中的内容,而只需要当他们按下button按钮以后再去读取。
![](https://img.kancloud.cn/1c/23/1c237733f72db8bd714d95579becde2a_672x345.png)
## text插件
读取网络股市信息并显示在text控件中。
```
fm_main = Tk()
t1 = Text(fm_main)
f = open('Y:/user/desktop/zyt.txt')
f.write( t1.get(1.0,'end' ) ) #text 的get方法可以指定从哪个字符开始复制,1.0 的意思就是开始,end表示读到最后
```
![](https://img.kancloud.cn/14/31/1431e036cade68cad57ca632fd4d1e42_651x341.png)