今天我们学习Python的高级特性、模块和IO操作,通过学习这些,我们可以更快的了解Python,使用Python。
高级特性中会讲述列表生成式、生成器、和一些高级函数,学习这些方便我们快速的生成列表,节省我们使用Python的时间,更快的使用Python达成我们的目的。
模块是我们调用包含函数和变量的文件,我们可以通过学习Python中的模块,明白如何使用和安装Python系统中的内置模块、自定义的模块以及第三方开源的模块。
IO操作是在Python中对文件进行读取,写入,和关闭的操作,我们可以在Python中通过IO操作快速的对文件进行操作。
高级特性
1.列表生成式
相信通过之前的学习,大家对列表已经比较熟悉了,在Python中,我们可以通过一些列表生成式来快速的生成我们需要的列表,用来节省时间,下面我们就介绍一些简单快捷的列表生成式。
1.1生成1-10的列表
range函数的作用是创建一个整数列表,一般呢是用在 for 循环中。Range的参数为range(start, stop[, step]),也就是range(开始参数(真包含),结束参数(假包含),步长),其中假包含和真包含的意思咱们在之前已经解释过了,这里也就不再解释了,不明白的可以去看前面的帖子。
1.2生成一个20以内为奇数的列表
公式的意思为生成一个长度为20,当x/2的余数为1的列表,其中%的意思为取余数,之前也讲过,这里也就不再重复。
1.3生成一个长度为10,取每个值得平方的列表
同理将x*x改为x**2也可以生成相同的列表。
1.4生成一个对应元素依次相加的列表
首先定义两个列表,然后x从a中取值,y从b中取值,取出值后,x内的值在对应加上字符串格式的y,最终结果就取出了对应元素相加依次的列表。
1.5生成对应元素相加的列表
这个生成式和上面的生成式差不多,但是上面那个是依次相加,这个为对应相加,其中 zip函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,也就是每一个的单独的对象去相加,这样做的好处是节约了不少的内存。如果要使用列表可以使用 list 转换来输出列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
2.生成器
我们可以通过上面学到的生成式,直接创建一个列表,但是受到内存的限制,列表的容量肯定是有限的,但是生成器在循环的过程中不断推算出后续的元素,没有必要创建完整的list。也就是直接将列表赋值给一个值,然后在调用就好。
或者也可以通过创建函数的方式来创建生成器,在Python中,使用了yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
3.Python中的一些高级函数
虽然我们现在是有关Python基础的教学,但是我们还是要讲一点高级的东西的,不然怎么才能上档次呢,接下来我们就介绍一下有关Python中的一些常用的高级函数。
3.1 map函数
Map函数的作用是接收两个参数,一个是函数,一个lterable0,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的lterator返回。
由于结果呢是一个lterator,lterator是一个惰性的序列,因此通过list函数让它把整个序列都计算出来,并返回一个list
3.2 reduce函数
reduce 函数会对参数序列中元素进行累积,函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。Function有三个参数, Function(函数function,iterable可迭代对象,initializer初始参数(可选))
Reduce把一个函数作用在一个序列[x1,x2,x3,…]上,这个函数需要接受两个参数,reduce把结果继续和序列的下一个元素做累计计算。
当然也可以手动指定初始的值
3.3 filter函数
Python中内建的filter函数是用于过滤序列。和map比较类似,filter也是接受一个函数和一个序列。但是和map不同的是,filter把传入的函数依次作用于每个函数,然后根据返回值是True还是False决定保留还是丢弃该元素。
跟Map相同,filter函数返回的是一个lterator,也就是一个惰性的xulie,所以我们为了让filter完成计算结果,就必须用list函数获得所有结果并返回list。
3.4 zip函数
Zip函数我们在上面已经讲了原理,这里也就不再扩展开来讲了。
3.5 sorted函数
Sorted函数也是一个高阶函数,可以按照方式进行排序
它还可以通过接受参数来进行自定义的排序
Sort(iTerable(可迭代对象),key(进行比较的元素,只有一个参数),reverse(排序规则=True是降序 =False是升序,默认为升序))
比如按照绝对值大小排序:
模块
上面就是我们的一些经常用到的有关Python的一些高级特性,下面我们进入有关模块的知识,如果我们从Python的解释器中退出在进入,那么已经定义的所有方法和变量都已经消失了,所以为了方便代码的多次使用,Python提供了一个办法,把这些定义放在了文件之中,为一些降本或者互相交互的解释器示例使用,那么这些文件就被称为了模块。
模块是一个包含所有定义的函数和变量的文件,它的后缀名为.py。模块是可以被其他的程序引用,然后使用这个模块的函数的功能,这也是使用Python标准库的方法。比如想要在Python中调用sqrt函数,必须用import关键字引入math这个模块,说的简单一点,模块就是工具包,要想使用这个工具包中的工具,就需要导入这个模块。
在Python中模块分为以下几种:
系统内置的模块,列入:sys、time、json模块等等;
自定义模块,自定义模块是自己写的模块,对某段逻辑或某些函数进行封装后供其他函数调用。注意:自定义模块的命名一定不能和系统内置的模块重名了,否则将不能再导入系统的内置模块了。例如:自定义了一个sys.py模块后,再想使用系统的sys模块是不能使用的;
第三方的开源模块:这部分模块可以通过pip install进行安装,有开源的代码;
1.import
在Python中用关键字import来引入模块,比如要用模块math’,就可以在文件最开始的地方用import math来引入,当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。在调用math模块中的函数时,必须这样引用:
模块名 函数名
Import module1
我们为什么在调用的时候必须加上模块名进行调用呢?
因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名
通常情况下,鼓励每个import语句只导入一个包方便理解和阅读代码。需要注意的是一个模块只会被导入一次,不管执行了几次import。这样是为了防止导入模块一遍又一遍的执行。所以一个包被导入后源文件被修改是不会立即生效的,可以通过重启Python的方式或者显式的重载包。
除了使用import之外也可以使用from import语句
比如form pandas import DataFrame,series, 通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function,在模块B中也有函数function,如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。除此之外,还有一个from 模块名 import * 是把一个模块的所有内容全部导入到当前的命名空间中去,但是具不推荐使用,因为这样的话就不知道那些命名被导入到当前的空间了。
2.第三方包的管理
在Python中还有一些非内置的包,比如pandas等,需要自己额外安装。(如果安装的Anaconda的话就不用安装了,因为Anaconda已经给我们提前安装了常用的数据分析的包,这也是Anaconda的好处。)
如何安装非内置的包呢,在Cmd命令行下执行:
Conda install packagename(包名称)
或者
Pip install packagename(包名称)
第一个的话如果是在使用conda的管理工具优先选择的,因为他有更好的包的相互依赖的管理机制。
如果在conda内找不到相对应的包,那么则使用下面的pip工具,pip工具的安装包来源是PyPl – the python package index
(https://pypi.python.org/pypi(https://pypi.python.org/pypi))
3.导入自己编写的模块内容
在安装了第三方库的情况下,可以直接使用import packagename(模块名)来导入使用,但是有些情况下,我们需要导入自己编写的一些文件作为包使用。
当我们使用import语句的时候,python的解释器是如何找到对应的文件呢?这里边就涉及到了Python的搜索路径,搜索路径是由一系列的目录名组成的,python解释器就依次从这些目录中去寻找所引入的模块,看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。
Sys.path输出的是一个列表,其中第一项是空串”,代表当前目录,就是我们执行Python解释器的目录(对于脚本的话就是运行的脚本所在的目录)。所以在使用自己编写的文件最方便的方式就是把文件放在当前路径下,小编在这里并不建议将自己编写的模块放入到一些系统默认的相关路径下,最好是把自己所有编写的文件放入到一个固定的文件夹下,方便管理与查看,运行代码前把这个文件夹的路径放入到sys.path中。
这个文件在当前路径下被导入
这个文件是从被添加的路径中直接导入,而不是当前的路径。
需要注意,添加的sys.path只在当前生效,下次运行需要重新导入。
讲了这么多,大家应该也明白了模块了吧,那么模块的优点有哪些呢:
提高了代码的可维护性;
一个模块编写完毕之后,其他模块直接调用,不用再从零开始写代码了,节约了工作时间;
避免函数名称和变量名称重复,在不同的模块中可以存在相同名字的函数名和变量名,但是,切记,不要和系统内置的模块名称重复;
IO操作
IO在计算机中值input/output,也就是输入和输出。由于程序和运行时数据是在个驻留,由CPU这个计算核心来执行,涉及到数据交换的地方,通常是磁盘,网络等,就需要到IO接口。
文件读写
文件读写是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。在读写文件之前,我们首先需要了解一点知识,那就是在磁盘上读写文件的功能都是由操作系统提供的,现代的操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常呢成为文件描述符),然后通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入到这个文件对象(写文件)。
1.1读文件
要读文件呢,就要以读文件的模式打开一个文件对象,使用Python内置的open函数,传入文件名和标识符:
其中标识符:
“r”表示只读.就是读取文件,如果不设置标识符的话就是默认为只读。
“w”表示写入.以覆盖的方式写入文件。
“x”表示创建一个新的文件,打开并写入
“a”表示打开并在文件的尾部追加内容(如果文件存在),与add类似
“b”表示二进制模式
“t”表示文本模式(默认值)
“+”表示读取并写入
系统的默认值为”rt”也就是文本模式读取。如果文件打开成功,接下来调用Read方法可以一次性读取文件的全部内容。
最后一步是调用Close方法关闭文件。文件使用完毕后必须关闭!!!!
由于文件读写时都有可能出现错误,那么后面的f.close就不会调用。所以为了保证无论是否出错都能正确的关闭文件,我们可以使用try...finally来实现:
其中调用的Readline每次会读取文件的一行,如果调用Readlines一次性读取所有内容并按行返回list。为了文件的打开关闭更方便,我们也可以使用with语句来自动帮我们调用Close方法:
1.2字符编码
如果我们要读取非UTF-8编码的文本文件,那么需要给open函数传入Encoding参数,例如上面的文件是有乱码的:
对于这种情况应该怎么办呢,我们可以使用一个针对文本类文件专门用来做编码推断的包:Chardet
打开文件需要使用二进制的方式,才能推断文本类的文件编码。
1.3写文件
写文件呢和读文件其实是一样的,唯一的区别就是调用open函数时,传入标识符”w”或者”wb”表示写文本文件或写二进制文件:
可以反复的使用Write来写入文件,但是需要使用f.close来关闭文件,当我们写文件时,操作系统并不会立刻把文件写入磁盘,而是先放到内存里边缓存起来,空闲的时候在慢慢写入。只有调用close方法时,操作系统才会马上将没有写入的数据写入磁盘,忘记调用close的后果是数据可能就只写入了一步分到磁盘,剩下的就丢掉了。
所以这个时候使用with语句就是很保险的方式,使用with语句操作文件IO是一个特别好的习惯。
1.4文件的删除重命名
有时候,需要对文件进行重命名、删除等一些的操作,在Python的os模块中都有这些功能
Os模块中的rename可以完成对文件的重命名操作,rename(需要修改的文件名,新的文件名)
Os模块中的remove可以完成对文件的删除操作,remove(待删除的文件名)
2.操作文件和目录
要获取某个环境变量的值,可以调用os.environ.get(‘key’)
获取当前的路径
3.JSON数据解析
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于ECMAscript的一个子集。
Python3中可以使用json模块对JSON数据进行编解码,它包含了两个函数:
Json.dumps:对数据进行编码
Josn.loads:对数据进行解码
Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。