Python程序设计与科学计算精录&总结Episode.3 Python高级语法:文件、异常、标准库和问题解决模式知识总结(基于Michael导师Python课程与VS2019)
今天是2020年5月20日,这个对于博主来说平凡的一天,但社交媒体上早就炸开锅了。
博主认为,有些人受过伤之后,就爱的小心翼翼,迟迟不敢去再次追求自己的另一半,就这样,渐渐的过了能够大胆去爱的年纪,一直到了不敢去挑剔时候,才找到勉强能算得上是另一半的人。但可笑的是,真正的生活在一起之后才发现,其实爱与不爱,并没有那么重要。
重要的是,责任。爱与责任使人变美,一个人也因有了爱与责任,其美无可替代。
所以,博主并不会喜欢妖媚的女孩,更不喜欢那些用情话骗取到的心灵。也可能很少主动去给女孩送口红,送花,送奶茶。最多的可能随笔写一些相赠。在这个浮躁的社会,这样做会很孤单,但是绝对没有错。更多时候,那些所谓的渣与肤浅的爱,只是因为读的太少,想得太短罢了。
一、Python文件操作:
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。
1、open 函数:
你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
语法:
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
- file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
- access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
下表中详细总结了文件打开方式命令字符access_mode对应的意义:
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
反过来,对应我们需要的操作,我们可以选择的access_mode命令字符如下 :
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
2、file对象:
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
file.closed | 返回true如果文件已被关闭,否则返回false。 |
file.mode | 返回被打开文件的访问模式。 |
file.name | 返回文件的名称。 |
file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
(1)File.close():
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
比如下面这个例子:
[code]#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("foo.txt", "w") print "文件名: ", fo.name # 关闭打开的文件 fo.close()
输出结果是:
文件名: foo.txt
(2)File.write():
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
write()方法不会在字符串的结尾添加换行符('\n'):
[code]#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("foo.txt", "w") fo.write( "www.runoob.com!\nVery good site!\n") # 关闭打开的文件 fo.close()
上述方法会创建foo.txt文件,并将收到的内容写入该文件,并最终关闭文件。如果你打开这个文件,将看到以下内容:
$ cat foo.txt www.runoob.com! Very good site!
(3)File.read()方法:
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
这里我们用到以上创建的 foo.txt 文件。
[code]#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("foo.txt", "r+") str = fo.read(10) print "读取的字符串是 : ", str # 关闭打开的文件 fo.close()
以上实例输出结果:
读取的字符串是 : www.runoob
(4)File.tell()方法:
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
[code]#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("foo.txt", "r+") str = fo.read(10) print "读取的字符串是 : ", str # 查找当前位置 position = fo.tell() print "当前文件位置 : ", position # 把指针再次重新定位到文件开头 position = fo.seek(0, 0) str = fo.read(10) print "重新读取字符串 : ", str # 关闭打开的文件 fo.close()
输出结果为:
读取的字符串是 : www.runoob 当前文件位置 : 10 重新读取字符串 : www.runoob
(5)os模块:import os
Python的os模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。
要使用这个模块,你必须先导入它,然后才可以调用相关的各种功能。
os.rename()方法:
rename()方法需要两个参数,当前的文件名和新文件名。
os.remove()方法:
你可以用remove()方法删除文件,需要提供要删除的文件名作为参数。
mkdir()方法
可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
chdir()方法
可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。
getcwd()方法:
getcwd()方法显示当前的工作目录。
rmdir()方法
rmdir()方法删除目录,目录名称以参数传递。
在删除这个目录之前,它的所有内容应该先被清除。
详细的os模块的各个内嵌功能函数解释如下表:
1 |
检验权限模式 |
2 |
改变当前工作目录 |
3 |
设置路径的标记为数字标记。 |
4 |
更改权限 |
5 |
更改文件所有者 |
6 |
改变当前进程的根目录 |
7 |
关闭文件描述符 fd |
8 |
os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 |
复制文件描述符 fd |
10 |
将一个文件描述符 fd 复制到另一个 fd2 |
11 |
通过文件描述符改变当前工作目录 |
12 |
改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
13 |
修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
14 |
强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
15 |
os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 |
返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
17 |
返回文件描述符fd的状态,像stat()。 |
18 |
返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
19 |
强制将文件描述符为fd的文件写入硬盘。 |
20 |
裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 |
返回当前工作目录 |
22 |
返回一个当前工作目录的Unicode对象 |
23 |
如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 |
设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 |
修改连接文件权限 |
26 |
更改文件所有者,类似 chown,但是不追踪链接。 |
27 |
创建硬链接,名为参数 dst,指向参数 src |
28 |
返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 |
设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 |
像stat(),但是没有软链接 |
31 |
从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 |
以major和minor设备号组成一个原始设备号 |
33 |
递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 |
从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
35 |
以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
36 |
创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 |
os.mknod(filename[, mode=0600, device]) |
38 |
打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 |
打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 |
返回相关文件的系统配置信息。 |
41 |
创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 |
os.popen(command[, mode[, bufsize]]) 从一个 command 打开一个管道 |
43 |
从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 |
返回软链接所指向的文件 |
45 |
删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
46 |
递归删除目录。 |
47 |
重命名文件或目录,从 src 到 dst |
48 |
递归地对目录进行更名,也可以对文件进行更名。 |
49 |
删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 |
获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 |
os.stat_float_times([newvalue]) |
52 |
获取指定路径的文件系统统计信息 |
53 |
创建一个软链接 |
54 |
返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 |
设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 |
返回唯一的路径名用于创建临时文件。 |
57 |
返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 |
为创建一个临时文件返回一个唯一的路径 |
59 |
返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 |
删除文件路径 |
61 |
返回指定的path文件的访问和修改的时间。 |
62 |
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
63 |
写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
64 |
获取文件的属性信息。 |
具体的例子可以参看下面这个程序:
[code]import os import time time1 = os.path.getctime('/etc/shadow') #时间戳时间 print(time1) tuple_time = time.localtime(time1) print(tuple_time) year = tuple_time.tm_year month = tuple_time.tm_mon day = tuple_time.tm_mday with open('date.txt','a') as f: f.write('%d %d %d' %(year,month,day)) f.write('\n')
不难知道它所实现的功能是:
利用time.time()方法,我们可以计算两个时间点之间的时间间隔,但是有些时候我们想要得到/etc/group文件的a/c/m的时间对应的年月日这些信息,并保存再文件date.txt文件中。
二、异常处理:
1、异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行:
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。下面的表格详细总结了常见的python编译异常及名称:
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
2、异常处理的方法:
(1)捕捉异常可以使用try/except语句:
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
语法:
以下为简单的try....except...else的语法:
try: <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else: <语句> #如果没有异常发生
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,且并未发生异常:
[code]#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
输出结果为:
$ python test.py 内容写入文件成功 $ cat testfile # 查看写入的内容 这是一个测试文件,用于测试异常!!
这里需要多说一句:except对象不带异常参数则是捕获所有的异常抛出。如果except对象要捕获多个异常,括号内异常名称用逗号连接:
try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 ...................... else: 如果没有异常执行这块代码
(2)try-finally 语句无论是否发生异常都将执行最后的代码:
例如这个例子:
[code]#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") finally: print "Error: 没有找到文件或读取文件失败"
输出结果为:
$ python test.py Error: 没有找到文件或读取文件失败
当在try块中抛出一个异常,立即执行finally块代码。finally块中的所有语句执行后,异常被再次触发,并执行except块代码。此处参数的内容不同于异常。
(3)我们可以使用raise语句自己触发异常:
raise语法格式如下:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
一个异常可以是一个字符串,类或对象。 Python的内核提供的异常,大多数都是实例化的类,这是一个类的实例的参数。
定义一个异常非常简单,如下所示:
[code]def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
为了能够捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串。
例如我们捕获以上异常,"except"语句如下所示:
[code]try: 正常逻辑 except Exception,err: 触发自定义异常 else: 其余代码
(4)用户自定义异常:
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。
在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。
[code]class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
在你定义以上类后,你可以触发该异常,如下所示:
[code]try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
三、Python标准库:
这一节是后面引入Python进阶知识总结的一个敲门砖。我们前面学习了Python中包含的大量模块和包,那么这些东西统一起来称作Python的标准库。事实上Python最强大的功能正是在于这个标准库的存在,并且用户可以随心下载一些更新的包、模块,利用help或者dir方法查看其功用,并且快速上手完成办公、人工智能、数据科学计算等复杂的工作。
真正要详细讲解Python标准库的内容,可能三天三夜也说不完。以下借鉴了@PythonAV的文章,我们可以深入地学习了解这二十个最好用也最强大的标准库&第三方库。具体的学习地点可以百度或者上Python官网查看,后面的文章也会对其中的一些内容作深入剖析:
- Requests.Kenneth Reitz写的最富盛名的http库。每个Python程序员都应该有它。
- Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的。用过它之后你就不会再想用别的同类库了。
- wxPython.Python的一个GUI(图形用户界面)工具。我主要用它替代tkinter。你一定会爱上它的。
- Pillow.它是PIL(Python图形库)的一个友好分支。对于用户比PIL更加友好,对于任何在图形领域工作的人是必备的库。
- SQLAlchemy.一个数据库的库。对它的评价褒贬参半。是否使用的决定权在你手里。
- BeautifulSoup.我知道它很慢,但这个xml和html的解析库对于新手非常有用。
- Twisted.对于网络应用开发者最重要的工具。它有非常优美的api,被很多Python开发大牛使用。
- NumPy.我们怎么能缺少这么重要的库?它为Python提供了很多高级的数学方法。
- SciPy.既然我们提了NumPy,那就不得不提一下SciPy。这是一个Python的算法和数学工具库,它的功能把很多科学家从Ruby吸引到了Python。
- matplotlib.一个绘制数据图的库。对于数据科学家或分析师非常有用。
- Pygame.哪个程序员不喜欢玩游戏和写游戏?这个库会让你在开发2D游戏的时候如虎添翼。
- Pyglet.3D动画和游戏开发引擎。非常有名的Python版本Minecraft就是用这个引擎做的。
- pyQT.Python的GUI工具。这是我在给Python脚本开发用户界面时次于wxPython的选择。
- pyGtk.也是Python GUI库。很有名的Bittorrent客户端就是用它做的。
- Scapy.用Python写的数据包探测和分析库。
- pywin32.一个提供和windows交互的方法和类的Python库。
- nltk.自然语言工具包。我知道大多数人不会用它,但它通用性非常高。如果你需要处理字符串的话,它是非常好的库。但它的功能远远不止如此,自己摸索一下吧。
- nose.Python的测试框架。被成千上万的Python程序员使用。如果你做测试导向的开发,那么它是必不可少的。
- SymPy.SymPy可以做代数评测、差异化、扩展、复数等等。它封装在一个纯Python发行版本里。
- IPython.怎么称赞这个工具的功能都不为过。它把Python的提示信息做到了极致。包括完成信息、历史信息、shell功能,以及其他很多很多方面。一定要研究一下它。
由于博主是电子信息方向的学生,有同时在深入学习数据科学的知识,所以这几个库是必备的,如果读者与博主的方向相同或者类似,不妨也下载来试试看:
1、Signal库:signal可以被用来进程间通信和异步处理。Python标准库提供了signal包可以用来处理信号相关
2、Scipy库:主要是Numpy模块用于现代数值计算分析
3、标准库有个 wave 模块:可以转音频成 wav 格式,再用它处理。不过说实话,这个模块太底层了。除此便是Pydub,超方便的模块。不仅封装了 wave,安装了 ffmpeg 后还可以处理 mp3 ogg 等所有常见格式。
4、python-midi库:python-midi的优势是不光可以自己写程序生成MIDI,而且还可以对MIDI文件进行解析。这样的功能配合机器学习算法,或许可以帮助我们实现机器的自动编曲。
5、Beautifulsoup库:BeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据,Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。
6、 TensorFlow、Torch、MLPack、CNTK等深度学习、人工智能库:人工智能的实现离不开开发框架和AI库,以下是汇总的10大高质量人工智能开发框架和AI库,以便于更深入的了解并探索人工智能的世界。笔者虽然并不喜欢人工智能研究方向,但是这些已经开发出来的人工智能方面的软件编写知识中或多或少有值得我们借鉴优化我们程序别的算法的地方。
P.S.Python库的在线安装方法:(离线安装就像安软件一样,此处不再赘述)
pip install --upgrade 库名
s在cmd中输入pip install --upgrade xxxx就可以在线更新库了,xxx为你要更新的库的名称。如在线更新lxml包,只需要在cmd中输入pip install --upgrade lxml。
Python库的调用方法:
四、用Python是为了解决问题:
Python纯语法部分总结的最后一小节,我将稍作交流如何建立用Python为我们的生活工作带来便捷的思维模式,这有助于我们之后的学习和开发工作。
这是一个很强大的思维导图,几乎囊括了Python基础及思维模式的一切知识,学习&复习过程不妨拿来多推敲几遍。摘自@背了个影子 https://www.geek-share.com/detail/2776451420.html 总结。
既然我们要学习Python,那么我们应该学会Python的程序设计思维:
1、自顶向下 和 自底向上
自顶向下(设计)
解决复杂问题的有效方法
- 将一个总问题表达为若干个小问题组成的形式
- 使用同样方法进一步分解小问题
- 直至,小问题可以用计算机简单明了的解决
自底向上(执行)
逐步组建复杂系统的有效测试方法
- 分单元测试,逐步组装
- 按照自顶向下相反的路径操作
- 直至,系统各部分以组装的思路都经过测试和验证
设计的时候,编码之前,先想好框架
调试的时候,逐渐测试各个单元
2、计算思维与程序设计
- 逻辑思维:推理和演绎,数学为代表,A->B B->C A->C
- 实证思维:实验和验证,物理为代表,引力波<-实验
-
计算思维:设计和构造,计算机为代表,汉诺塔递归
3、计算生态与Python语言
开源思想深入演化和发展,形成了计算生态
计算生态以开源项目为组织形式,充分利用“共识原则”和“社会利他”组织人员,在竞争发展、相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径。
以开源项目为代表的大量第三方库Python语言提供 >15万个第三方库;
库的建设经过野蛮生长和自然选择同一个功能,Python语言2个以上第三方库;
库之间相互关联使用,依存发展Python库间广泛联系,逐级封装;
社区庞大,新技术更迭迅速AlphaGo深度学习算法采用Python语言开源;
学习 python,不是一行一行代码,而是站在巨人的肩膀上
4、用户体验与软件产品
编程只是手段,不是目的,程序最终为人类服务,所以我们要尽量考虑提高用户体验;
要是我们自己都不满意自己的产品,那么别人更加不会满意
提升用户体验的方法无非就是做到以下几点:
- 如果程序需要计算时间,可能产生等待,请增加进度展示
- 如果程序有若干步骤,需要提示用户,请增加进度展示
- 如果程序可能存在大量次数的循环,请增加进度展示
- 当获得用户输入,对合规性需要检查,需要异常处理
- 当读写文件时,对结果进行判断,需要异常处理
- 当进行输入输出时,对运算结果进行判断,需要异常处理
- 打印输出:特定位置,输出程序运行的过程信息
- 日志文件:对程序异常及用户使用进行定期记录
- 帮助信息:给用户多种方式提供帮助信息
5、基本的程序设计模式
从IPO开始…
- 确定IPO:明确计算部分及功能边界
- 编写程序:将计算求解的设计变成现实
- 调试程序:确保程序按照正确逻辑能够正确运行
模块化设计
- 通过函数或对象封装将程序划分为模块及模块间的表达
- 具体包括:主程序、子程序和子程序间关系
- 分而治之:一种分而治之、分层抽象、体系化的设计思想
- 紧耦合:两个部分之间交流很多,无法独立存在
- 松耦合:两个部分之间交流较少,可以独立存在
- 模块内部紧耦合、模块之间松耦合
配置化设计
- 引擎+配置:程序执行和配置分离,将可选参数配置化
- 将程序开发变成配置文件编写,扩展功能而不修改程序
- 关键在于接口设计,清晰明了、灵活可扩展
应用开发的四个步骤
从应用需求到软件产品
- 1 产品定义:对应用需求充分理解和明确定义
产品定义,而不仅是功能定义,要考虑商业模式 - 2 系统架构:以系统方式思考产品的技术实现
系统架构,关注数据流、模块化、体系架构 - 3 设计与实现:结合架构完成关键设计及系统实现
结合可扩展性、灵活性等进行设计优化 - 4 用户体验:从用户角度思考应用效果
用户至上,体验优先,以用户为中心
用最简单的方式来描述Python程序设计的最佳思路,便是:做什么(分析)→如何做(设计)→编写代码(实施)→测试程序(调试)→使用程序(实施或开发)→维护(优化程序)六个步骤。做好了这六个步骤,我们所进行的程序开发工作便可谓接近完美了。核心永远牢记:用户体验最佳模式。此外如果需要对程序备份脚本,可以通过在zip归档名上附带一个用户提供的注释来方便并且直观地实现。
至此,我们利用三篇文章介绍了Python的所有常用语法。虽说工欲善其事必先利其器,但光有语法远远不够,我们的python学习道阻且长。将Python的语法和C语言进行对比,可以加快对这些知识点的理解。如果对C语言的编写还不太熟悉,建议先从C语言开始学起。初学者直接学Python容易养成避重就轻爱走捷径的坏习惯。事实上理解算法的本质含义比学会多少个库的使用都重要,它能帮助我们养成真正的程序员思维。
- Python程序设计与科学计算精录&总结Episode.5 Python进阶:机器学习、人工智能应用(基于Michael导师Python课程与VS2019)
- Python程序设计与科学计算精录&总结Episode.4 Python进阶:自动化办公应用(基于Michael导师Python课程与VS2019)
- Python学习总结第十三天-文件操作、异常和设计模式
- vs2015 系统找不到指定的文件(异常来自HRESULT:0x80070002)问题的解决方法
- Python程序设计与科学计算精录&总结Episode.7 Python进阶:数据分析库Pandas、Matplotlib与Scikit-learn(基于VS2019)
- linux Centos6.7 python交互模式下回退异常问题解决
- vs 2019创建python应用程序import报unresolved import ' '问题解决方案
- vs2017 cshtml文件打开文字不显示语法颜色,都是黑色问题的解决
- 解决问题:vs 使用命令行参数调试时出现"当前项目设置指定将使用特定的安全权限对该项目进行调试.在此模式下,命令行参数将不会传递给可执行文件."
- 真正的创新必然是基于对市场的了解,对客户反馈的观察,开发出来的产品一定要适应市场,提出的模式一定要能解决现实的问题。而在这其中,技术只是一种实现手段。
- javaEE异常总结——更换工作空间向同一个tomcat上部署同一个项目时出现问题解决
- .NET 一个VS 2005不能辨别文件问题解决
- C#高级语法基础知识总结4——运算符
- VS2012 每次编译程序都会出现”无法查找或打开 PDB 文件“问题解决方案
- 解决VS编译出现Moc'ing文件,系统找不到指定路径问题
- 解决AES算法BCB模式加密文件在解密后出现乱码问题
- 基于JChardet自动检测文件编码,批量转换文件编码,解决乱码问题
- 【转】彻底解决Asp.net文件下载(Response.WriteFile)时文件名的中文乱码和空格异常问题
- 解决ie6、7 position异常问题,以及flash文件挡住position定位
- 2014-J2EE开发工作中遇到的异常问题及解决方法总结