重要的python库:Numpy、pandas、matplotlib
第二章 语言基础、IPYTHON及Jupyter
在我看来,在python中高效地分析数据并不需要完全精通如何利用python语言开发软件,一旦学会了如何使用python来探索数据,推荐各位实验本书示例的同时也可以尝试练习一些别的内容,和其他键盘控制的 命令行环境一样,练就常用命令的肌肉记忆也是学习曲线的一部分。
2.1 Python解释器IPython是一个加强版的python解释器。
2.2 IPython基础安装Anaconda后,在终端输入ipython即可进入,输入exit()即可退出。在IPython中仅输入一个变量名,它会返回一个表示该对象的字符串,相较于print语句可读性更好一些。Tab补全:在IPython中,适时按下tab键,可以对方法、属性补全;此外也支持搜索交互命名空间、上下文场景。内省:在IPython中,变量名或函数名后面输入一个问号后,可以显示一些关于该对象的概要信息;如果在函数名后输入双问号,可以显示函数的源代码。“?”也可以用户搜索IPython命名空间,把一些字符和通配符(*)结合在一起,会显示所有匹配通配符表达式的命名。%run命令:当你使用%run命令时,IPython会在同一个进程内执行指定文件中的代码;如果你想让待运行的脚本使用交互式IPython命名空间中已有的变量,可以使用%run -i替代普通的%run命令。中断运行:Ctrl-C剪贴:%paste或%cpaste,后者会给出提示用于确认被粘贴的代码。其他魔术命令:%timeit可以检查一段python语句的执行时间;%debug可以从最后发生报错的底部进入交互式调试器。matplotlib集成:%matplotlib可以生成多个绘画窗口,而无需干扰控制台的会话。Jupyter notebook既可以作为本地计算环境,也可以部署在服务区端,远程访问(不再赘述)。
2.3 Python语言基础一切皆为对象。在python中,对一个变量赋值时,就相当于创建了一个指向等号右边对象的引用,再将变量赋值给一个新的变量,新的变量实际上是指向了相同的对象,对原变量的更改对同步更改新的变量。Python为强类型语言,这意味着所有的对象都拥有一个指定的类型(或类),隐式的转换只在某些特定、明显的情况下发生。字符串、元组是不可变对象。标量类型:None、str、bytes、float、bool、int整数除法会将结果自动转型为浮点数。字符串定义时,引号内所有信息(包括引号内的空行),都会赋值到字符串中。list[:3]这种语法被称为切片。字符串前面加一个前缀符号r,表明这些字符是原生字符。字符串格式化format方法。str、int、float、bool之间支持类型转换。如果一个函数没有显式地返回值,则它会隐式地返回None。for循环与while循环中,应用continue,也可以应用break跳出最内层的循环。pass代表什么也不做的占位符,经常用于if语句中。range函数可以指定起始与步进。三元表达式结合if语句的灵活应用。
第三章 内建数据结构、函数及文件
3.1 数据结构和序列
3.1.1元组:固定长度、不可变的对象序列。你可以使用tuple函数将任何序列或迭代器转换为元组。元组的元素可以通过中括号来获取。元组一旦创建,各个位置上的对象是无法被修改的,如其中一个元素可变,可以内部修改。可以使用加号连接元组生成更长的元组。元组乘以整数,会和列表一样,生成含有多份拷贝的元组。元组支持拆包。特殊语法*rest用于在函数调用时获取任意长度的位置参数列表。更多情况下,编程者会使用下划线(_)来表示不想要的变量。元组一个常见的方法是count,用于计算某个数值在元组中的出现次数。
3.1.2列表:长度可变、内容可以修改的对象。你可以使用中括号或list函数来定义列表。使用append方法可以将元素插入到列表尾部,使用insert方法可以将元素插入到指定的列表位置。使用pop会将特定位置的元素移除并返回,使用remove方法会定位第一个符合要求的值并移除它。使用in检查一个值是否在列表中。列表与元组类似,两个列表可以使用+号连接,可以使用*号(不再示例)。如果你有一个已经定义的列表,你可以用extend方法向该列表添加多个元素,此方法比使用+号连接列表更高效。你可以使用sort方法对列表进行内部排序。使用切片符号可以对大多数序列类型选取其子集,它的基本形式是将start: stop传入到索引符号[]中。步进值step可以在第二个冒号后面使用,意思是每隔多少个数取一个值。
3.1.3内建序列函数python内建了enumerate函数,返回(i, value)元组的序列,其中value是元素的值,i是元素的索引。sorted函数返回一个根据任意序列中的元素新建的已排序列表。zip将列表、元组或其他序列的元素配对,新建一个元组构成的列表。zip可以处理任意长度的序列,它生成列表长度由最短的序列决定。zip还可以结合enumerate使用。不知道为什么我自己敲的有报错,书里是这样写的,且可以返回[('foo', 'one', 'False'), ('bar', 'two', 'True')]reversed函数将序列的元素倒序排列,但其本身是一个生成器,因此如果没有实例化(例如使用list函数或for循环),它并不会产生一个倒序的列表。
3.1.4字典:使用大括号{}创建的键值对集合。你可以访问、插入、设置字典中的元素,就像访问列表和元组中的元素一样。你也可以用检查列表或元组中是否含有一个元素的相同语法来检查字典是否含有一个键。同样,也可以使用del关键字或pop关键字删除值,pop方法会在删除的同时返回被删除的值并删除键。keys方法和values方法会分别为你提供字典键、值的迭代器,然而键值对并没有特定的顺序。你可以使用update方法将两个字典合并。带有默认值的get方法会在key参数不是字典的键时返回None。value = some_dict.get(key, default_value)字典的setdefault方法可以用于设置特定的值。尽管字典的值可以是任何python对象,但键必须是不可变的对象。
3.1.5集合:一种无序且元素唯一的容器,其内容不可变。集合有两种创建方式:通过set函数或者用字面值集与大括号的语法。两个集合的联合就是两个不同元素的并集,可以使用union方法或|二元操作符完成。交集包含了两个集合中同时包含的元素,可以使用&或intersection方法获得交集。
3.1.6列表、集合和字典的推导式列表推导式的基本形式为:[expr for val in collection if condition]字典推导式如下:dict_comp = {key-expr : value-expr for value in collection if condition}集合推导式如下,只是中括号变成了大括号:set_comp = {expr for value in collection if condition}需要注意的时,列表推导式的for循环部分是根据嵌套的顺序排列的(与正常的for循环嵌套一致)。
3.2 函数函数声明时使用def关键字,返回时使用return关键字。有多条返回语句是没有问题的,如果python达到函数的尾部时仍然没有遇到return语句,就会自动返回None。每个函数都可以有位置参数和关键字参数(用于指定默认值或可选参数)。函数参数的主要限制在于关键字参数必须跟在位置参数后面。
3.2.1命名空间、作用域和本地函数函数有两种连接变量的方式:全局、本地。在python中,有一种更贴切描述变量作用域的名称是命名空间。函数内部的任意变量都是默认分配到本地命名空间的,本地命名空间是在函数被调用时生成的,并立即由函数的参数填充,当函数执行结束后,本地命名空间就会被销毁。在函数外部给变量赋值是可以的,但是那些变量必须使用global关键字声明为全局变量。
3.2.2返回多个值实质上是返回了一个对象,也就是元组,而元组又被拆包为多个结果变量。
3.2.3函数是对象
3.2.4匿名函数匿名函数是一种通过单个语句生成函数的方式,其结果是返回值。
3.2.5柯里化:部分参数应用柯里化是计算机科学术语,它表示通过部分参数应用的方式从已有的函数中衍生出新的函数。使用一个原先已经定义好的函数add_numbers(x, y),可以衍生出一个只有一个变量的新函数。
3.2.6生成器通过一致的方式遍历序列,这一特性是通过迭代器协议来实现的,迭代器协议是一种令对象可遍历的通用方式。当你写下for key in some_dict时,python解释器会首先根据some_dict生成一个迭代器。生成器是构建新的可遍历对象的一种非常简洁的方式,它可以返回一个多结果序列,在每一个元素生成后暂停,知道下一个请求。如需创建一个生成器,只需要在函数中将返回关键字return替换为yield关键字。当你实际调用生成器时,代码并不会立即执行;直到你请求器中的元素时,它才会执行它的代码。用生成器表达式来创建生成器更为简单。gen = (x**2 for x in range(10))标准库中的itertools模块是适用于大多数数据算法的生成器集合。例如,groupby可以根据任意的序列和一个函数,通过函数的返回值对序列中连续的元素进行分组。
3.2.7错误和异常处理优雅地处理异常函数运行失败情况时,可以使用try-except代码块。try-except语句中,也可以使用else来执行当try代码块成功执行时才会执行的代码;使用finally关键字来执行异常判断处理后最后都需要执行的代码。
3.3 文件与操作系统打开文件进行读取或写入,需要使用内建函数open和绝对、相对路径。f = open(path)for line in f: passf.close()另一种更简单的关闭文件的方式就是使用with语句。with open(path) as f: lines = [x.rstrip() for x in f]使用with语句,文件会在代码块结束后自动关闭。对于可读文件,最常用的方法就是read、seek和tell。read返回文件中一定量的字符:f.read(10)tell方式可以给出句柄当前的位置:f.tell()seek方法可以将句柄位置改变到文件中特定的字节:f.seek(3)python文件模式:r表示只读模式。w表示只写模式,将创建新文件(清除路径下的同名文件中的数据!)。x表示只写模式,创建新文件,但如果存在同名路径时会创建失败。a将添加到已经存在的文件,如果不存在就创建。写入文件可以使用write或writelines方法,读行可以使用readlines方法。3.3.1字节与Unicode文件UTF-8是一种可变长度的Unicode编码,必要是需要对提取的完整的字节解码:data.decode('utf-8')