合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 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)