第 3 章 Python语言初步 3.1Python语言概述 3.1 Pyhn语言简介 1.to 什么是Python?Python是一种灵活多用的计算机程序设计语言,使用 Python进行的编程语法特色更强,具有更高的可读性。Python对于初级程序 员来说非常友好,语法简单易懂,应用广泛,实用性强。Python是一种解释型语 言,解释型语言指的是源代码先被翻译成中间代码,再由解释器对中间代码进 行解释运行,这就意味着Python的跨平台性很好,所有支持Python语言的解 释器都可以运行Python。Python是交互式语言,它可以在交互界面直接执行代 码,大多数Linux系统都使用Python语言作为基本配置。Python是面向对象 语言,这意味着Python支持面向对象的风格或代码封装在对象的编程技术。 1.Python的发展历史 Python由荷兰人GuidovanRosum于1989年创造,并于1991年发布第 一个公开发行版。自2004年以后,Python的使用率大幅增长,Python2于 2000年10月发布,稳定版本是Pyhn2.to不 完全兼容Python2 。 to7。Pyhn3于2008年12月发布, 2.Python的特点 Python语言简单易学,有较为简单的语法,也很容易入门与上手操作。免 费、开源,Python的一个很重要的优点是它是免费开源的,开发者可以自由地发 布这个软件的复制版、阅读它的源代码、对它加以改动、取其部分用于新的自由 软件中。可移植性,由于它的开源本质,Python有很强的可移植性能,如果避免 使用了依赖于系统的特性,那么所有Python程序无须修改就可以在多个平台 上面运行。 3.为什么使用Python Python提供了很多的重要库,包括NumPy、Pandas、Matplotlib、SciPy、 第3章 Python语言初步 71 scikit-learn等。这些库为Python提供了数值计算需要的多种数据结构、算法、接口及多 种机器学习库函数,以及用于制图和可视化的必备操作等。这些功能都使得Python用 起来更为方便,也因此成为了解决数据挖掘、数据分析和机器学习问题的必备工具。同时 Python编写小型程序、脚本也十分方便,能够快速处理各种类型的数据,在服务器命令行 环境上运行简单明了。因此,综合考虑Python的各个方面的优点,我们选择使用Python 作为本书分析与挖掘数据的首要语言。 3.1.2 Python语言环境搭建 1.Python的下载与安装 Python的版本有2.x和3.x两大类,其中比较常用的是Python2.7和Python3.6。 由于Python不支持向下兼容,在Python3.x的环境下,Python2.x版本的代码不一定能 正常运行。因此,在使用Python进行开发与移植时,需要了解对于Python版本的需求。 另一方面,Python的使用通常需要与多种附加包结合,而且应用场景也多种多样。 因此,需要附加的安装操作也多种多样,没有统一的解决方案。在本书中推荐使用免费的 且集成较多安装包的Anaconda软件来安装Python3.6以及相应的环境。 下面分别对3个系统上的Anaconda安装过程进行简述。 Windows:先从(http://anaconda.com/downloads)下载Anaconda安装器,并按照官 网下载页上的安装说明进行安装。安装结束后需要确定所有的设置是否都正确,确认方 法如下:打开命令行应用(cmd.exe),输入Python来启动Python解释器,如果能够正确 输出符合你下载的Anaconda版本的信息,则证明安装成功。 C:\Windows\system32> Python Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10: 22: 32) [MSC v.1900 64 bit (AMD64)] on win32 > > > MacOS:下载OSX版的Anaconda安装器,命令如Anaconda3-4.1.0-MacOSX-x86_ 64.pkg。双击.pkg文件运行安装器。安装器运行时,会自动将Anaconda执行路径添加 到.bash_profile文件中,该文件位于/Users/$USER/.bash_profile。确认安装正常,可 以尝试在系统命令行(打开终端应用得到命令提示符)中运行IPython: $iPython 要退出命令行,按下Ctrl+D键,或输入命令exit()后按回车。 Linux:Linux下的安装细节取决于所用的Linux版本,安装器是一段Shell脚本,安 装时需要使用一个文件名类似于Anaconda3-4.1.0-Linux-x86_64.sh的文件,并在bash命 令行中输入: $bash Anaconda3- 4.1.0- Linux- x86_64.sh 72 数据科学导论 在接受许可后,通常选用默认安装设置就可以成功安装。 2.集成开发环境 Python开发环境的基准是“IPython加文本编辑器”。通常会在IPython或Jupyter notebook中写一段代码,然后迭代测试、调试。这种方法有助于在交互情况下操作数据, 并可以通过肉眼确认特定数据集是否做了正确的事。 然而,当开发软件时,使用者可能倾向于使用功能更为丰富的集成开发环境(IDE)而 不是功能相对简单的文本编辑器。常用的IDE如下。 (1)PyDev(免费),基于Eclipse平台的IDE。 (2)PyCharm,Jetbrains公司开发,对商业用户收费,对开源用户免费。 (3)Spyder,Anaconda集成的IDE。 (4)PythonToolsforVisualStudio,适合Windows用户。 具体的选择,则需要读者根据自己的需求进行自行判断。在本书中,使用Anaconda 自带的Spyder和Jupyternotebook进行编程。 3.2 Python的基本用法 3.2.1 列表与元组 1.序列概述、常用的序列操作 在Python中,最常用且最基础的数据结构是序列,英文为sequence。序列中的每个 元素都设有对应的编号,并且使用这些标号来查找这些元素,因此也通常称编号为这些元 素的位置或索引。另外一点非常重要的是,序列的索引从0开始,即第一个元素的索引为 0,第二个元素的索引为1,以此类推。 Python中有多种序列,但最常见的是列表和元组两类,它们除了最基本的操作相同 外,也会有一定的区别:列表中的元素是可以修改的,而元组不可以修改。 适用于所有序列的操作包括索引、切片、相加、相乘和成员资格检查等,下面通过举出 一些例子来对这些内容进行详细讲解。 1)索引 使用索引来查找序列中的元素,索引的描述方式为“[]”。方框中的元素表示索引的 元素位置,它可以取正数,也可以取负数。当使用负数-n 时,表示从右(即从最后一个元 素)开始往左数,查找第n 个元素。 【例3-1】 In[1]: number_list = [0,1,2,3,4,5,6,7,8,9] In[2]: number_list[3] Out[2]: 3 In[3]: number_list[- 1] Out[3]: 9 第3章 Python语言初步 73 2)切片 索引通常用来访问单个元素,而当想要访问多个元素时,通常采用切片(Slicing)的方 式。使用方括号截取特定范围内的元素,这种操作就是切片。切片本质上是被冒号间隔 的两个索引,用来截取从第一个索引下标到第二个索引下标之间的元素。其中第一个索 引指定的元素包含在切片内,但第二个索引指定的元素不包含在切片内。 【例3-2】 In[4]: number_list = [0,1,2,3,4,5,6,7,8,9] In[5]: number_list[3:7] Out[5]: [3, 4, 5, 6] 同样,当要从列表末尾开始访问元素时,可以使用负数索引。 【例3-3】 In[6]: number_list[- 3:- 1] Out[6]: [7, 8] 省略第一个索引时表示切片开始于序列开头,省略第二个索引时表示切片结束于序 列末尾,而当两个索引都省略时,则选取整个序列。 【例3-4】 In[7]: number_list[- 5:] Out[7]: [5, 6, 7, 8, 9] In[8]: number_list[:5] Out[8]: [0, 1, 2, 3, 4] 除此之外,在索引1和索引2之间可以设置步长来指定访问时跳跃的幅度。步长为 正表示从前向后访问,步长为负表示从后向前访问。 【例3-5】 In[9]: number_list[1:7:2] Out[9]: [1, 3, 5] In[10]: number_list[8:2:- 2] Out[10]:[8, 6, 4] 3)序列相加 可以使用加法运算符“+”来拼接序列。 【例3-6】 In[11]: list1= [1,2,3] list2= [4,5,6] In[12]: list1 + list2 Out[12]: [1, 2, 3, 4, 5, 6] 74 数据科学导论 4)乘法 在序列中,乘法用*表示,当序列与数x 相乘时,将重复这个序列x 次来创建一个新 序列。 【例3-7】 In[13]: [1,2] * 8 Out[13]: [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2] 5)成员资格检查 通过使用in运算符来检查特定的值是否包含在序列中。in用来检查满足某条件的 元素是否存在,如果存在,返回True;不存在,则返回False。 【例3-8】 In[14]: name_list = ['Tom','Jerry','Mickey','Mike'] In[15]: 'Tom' in name_list Out[15]: True In[16]: 'Marry' in name_list Out[16]: False 2.列表概述、常用的列表操作 列表是序列的一种,可以对列表执行所有的序列操作,但是不同之处在于列表是可以 修改的。因此,接下来会介绍一些修改列表的方法:给元素赋值、删除元素、给切片赋值 以及使用列表的方法。 1)列表的修改操作 (1)给元素赋值:给元素赋值之前,需要使用索引法找到特定位置的元素,然后使用 赋值号“=”给元素赋值。但需要注意的是,不能对超出列表长度范围的元素进行赋值。 【例3-9】 In[17]: lst = [1,10,20,30,40] In[18]: lst[3]= 35 In[19]: lst Out[19]: [1, 10, 20, 35, 40] In[20]: lst[5]= 50 Out[20]: IndexError: list assignment index out of range (2)删除元素:使用下标索引并结合del语句来删除元素。 【例3-10】 In[21]: lst = [1,10,20,30,40] In[22]: del lst[3] In[23]: lst Out[23]: [1, 10, 20, 40] 第3章 Python语言初步 75 (3)使用切片可以同时对多个元素进行赋值,甚至可以实现序列的长度改变。不仅 如此,使用切片赋值还可以在不替换原有元素的情况下更新元素。 【例3-11】 In[24]: number_list = [1,2,3,4,5,6] In[25]: number_list[2:]= [20,30,40] In[26]: number_list Out[26]: [1, 2, 20, 30, 40] In[27]: number_list[1:1]= [5,10,15] In[28]: number_list Out[28]: [1, 5, 10, 15, 2, 20, 30, 40] In[29]: number_list[1:4] = [] In[30]: number_list Out[30] [1, 2, 20, 30, 40] 2)列表方法 首先,我们要了解什么是方法,所谓方法(Method)通常会加上对象(Object)和句点 来调用:object.method(arguments),方法用来实现某些功能。列表中包含一些常用的方 法,可以用来查看或修改内容,下面则给出一些常用的例子来说明。 (1)append方法:使用append()函数,将某一个对象附加到列表的末尾。 【例3-12】 In[31]: number_list.append(50) In[32]: number_list Out[32]: [1, 2, 20, 30, 40, 50] (2)clear方法:使用clear()函数来清空列表中的所有内容。 【例3-13】 In[33]: number_list.clear() In[34]: number_list Out[34]: [] (3)copy方法:复制列表。 【例3-14】 In[35]: number_list = [1,2,3,4,5,6,7] In[36]: nl = number_list.copy() In[37]: number_list[3] = 40 In[38]: number_list Out[38]: [1, 2, 3, 40, 5, 6, 7] In[39]: nl Out[39]: [1, 2, 3, 4, 5, 6, 7] 76 数据科学导论 (4)insert方法:将一个对象插入到列表中。 【例3-15】 In[39]: number_list.insert(2,7) In[40]: number_list Out[40]: [1, 2, 7, 3, 40, 5, 6, 7] (5)remove方法:用于删除第一个为指定值的元素。 【例3-16】 In[41]: sentence = ['how','do','you','do'] In[42]: sentence.remove('do') In[43]: sentence Out[43]: ['how', 'you', 'do'] (6)count方法:统计某个元素在列表中出现的次数。 【例3-17】 In[44]: ['to', 'be', 'or', 'not', 'to', 'be'].count('to') Out[44]: 2 (7)extend方法:在列表末尾一次性追加另一个序列中的多个值。 【例3-18】 In[45]: a1 = ['a','b','c'] b1 = ['d','e','f'] In[46]: a1.extend(b1) In[47]: a1 Out[47]: ['a', 'b', 'c', 'd', 'e', 'f'] (8)index方法:在列表中查找指定值第一次出现的索引。 【例3-19】 In[48]: sentence = ['how','do','you','do'] In[49]: sentence.index('do') In[50]: 1 In[51]: sentence.index('who') Out[52]: ValueError: 'who' is not in list (9)reverse方法:对列表元素倒序排列。 【例3-20】 In[53]: name = ['M','i','c','k','e','y'] In[54]: name.reverse() 第3章 Python语言初步 77 In[55]: name Out[55]: ['y', 'e', 'k', 'c', 'i', 'M'] 3.特殊的列表———元组 元组与列表一样,也是序列的一种,而区别就在于元组是不能修改的。创建元组方法 很简单,只要将一些值用逗号分隔,就能自动创建。 【例3-21】 In[56]: 1,2,3 Out[56]: (1, 2, 3) 同样还可以用圆括号括起定义元组。 【例3-22】 In[57]: (1,2,3) Out[57]: (1, 2, 3) 当定义只包含一个值的元组时需要在它的后面加上逗号。 【例3-23】 In[58]: 31 Out[58]: 31 In[59]: 31, Out[59]: (31,) In[60]: (31,) Out[60]: (31,) 元组并不太复杂,它的创建和访问与序列一致,除此之外可对元组执行的操作不多。 3.2.2 字符串 1.字符串的概述 字符串在Python语言中很常见,它是一种最常用的数据类型。创建字符串很简单, 只需要在引号(''或"")内赋值一个由字符数字等组成的变量即可。 【例3-24】 In[1]: name1 = 'Kitty' In[2] name1 Out[2]: 'Kitty' In[3] name2 = "Tom" In[4] name2 Out[4] 'Tom' 78 数据科学导论 除此之外,字符串本身也是一种序列。因此,适用于序列的操作也同样适用于字符 串,可以通过下标索引以及方括号截取字符串的方式访问字符串。对字符串的更新、修改 和删除等操作,这里仅通过表3-1进行简单的说明。 表3-1 字符串的基本操作 操作符描 述实 例 + 字符串连接 In[5]: name1+ name2 Out[5]: 'KittyTom'* * 重复输出字符串 In[6]: name2 * 2 Out[6]: 'TomTom'[] [] 通过索引获取字符串中的字符 In[7]: name2[2] Out[7]: 'm'[:] [:] 截取字符串中的一部分 In[8]: name1[2:4] Out[8]: 'tt'in in 如果字符串中包含给定的字符返 回True In[9]: 'K' in name1 Out[9]: Truenot in notin 如果字符串中不包含给定的字符返 回True In[10]: 'K' not in name2 Out[10]: True 2.字符串用法 由于字符串很常用,因此字符串的使用方法也非常多,这里列一些较为常用的字符串 使用方法来举例说明。 (1)find方法:使用find()函数在字符串中查找子串,如果找到,就返回子串的第一 个字符的位置,未找到则返回-1。当出现返回值为0时,表明恰巧在最开始处找到了指 定的子串。 【例3-25】 In[11]: sentence = 'Actions speak louder than words.' In[12] sentence.find('speak') Out[12]: 8 In[13] sentence.find('pick') Out[13] - 1 In[14] sentence.find('Actions') Out[14] 0 同时,find方法的第二个和第三个参数分别代表搜索的起点与终点,通过起点与终 点,指明了搜索范围。需要注意的是,范围包含起点但不包含终点。 【例3-26】 In[15] sentence.find('s',3,10) Out[15] 6 第3章 Python语言初步 79 (2)join方法:join方法用于合并字符串,需要注意的是所有合并的序列元素都必须 是字符串。 【例3-27】 In[16]: number_list = ['1','2','3','4','5'] In[17] add = '+ ' In[18]: add.join(number_list) Out[18] '1+ 2+ 3+ 4+ 5' (3)split方法:split是非常重要的字符串方法,它的作用与join方法相反,用于将字 符串按照分隔符拆分为序列。如果没有指定分隔符,则在单个或多个连续的空白字符处 进行拆分。 【例3-28】 In[19]: '1+ 2+ 3+ 4+ 5'.split('+ ') Out[19] ['1', '2', '3', '4', '5'] In[20]: "I am a student from BUPT".split() Out[20] ['I', 'am', 'a', 'student', 'from', 'BUPT'] (4)strip方法:使用strip方法将字符串开头和末尾的空白删除,并返回删除后的结 果,需要注意的是strip()函数删除并不会删除字符串中间的空格。同样,在strip()函数 中指定字符则可以删除在开头或末尾的对应字符,而中间的字符不会被删掉。 【例3-29】 In[21]: " I am a student from BUPT ".strip() Out[21] 'I am a student from BUPT' In[22]: '*****!!!!!Something important!!!!!*****'.strip('*!') Out[22] 'Something important' strip()函数在处理数据中十分常见,当进行比较或切分操作之前,通常使用strip() 去掉不小心在尾部加上的空格,以免出现错误。 (5)lower方法:用于将字符串中的大写字符全部替换为小写,当用户不想区分字符 串大小写时很重要。例如用户名字、地址等信息往往大小写多样,而转换为字符串在存储 与查找时,应先将它们全部处理为小写后,再进行操作。 【例3-30】 In[23]: 'My favourite character is Mickey Mouse'.lower() Out[23] 'my favourite character is mickey mouse' 3.2.3 字典 我们都知道序列使用索引来访问各个值,而Python中还提供一种数据结构,可以通 80 数据科学导论 过名称来访问其各个值,这种数据结构就是映射(Mapping)。在映射中,较常用的就是字 典,字典通过“键-值”对进行索引,这里的键可能是数、字符串或元组等。 字典的“键-值”对是它的特点,而“键-值”对也被称为项(Item)。每个键与其值之间 都用冒号(:)进行分隔,各个项之间用逗号分隔,同时被包括在花括号内,类似于{key1: value1,key2:value2}的格式。为了实现字典中的快速查找,键必须是独一无二的,这样 给定键就能直接找到该键对应的值,而值是可以重复的。 空字典中没有任何项,用两个花括号表示,类似于{}的格式。 下面详细介绍如何创建以及使用字典。 1.创建字典 创建字典的最简单方式就是直接赋值,但需要注意的是保持键的唯一性,否则会导致 后赋值的一个“键-值”对替换掉前面的。键的数据类型必须是不可变的,如字符串、数字 或元组等,而值可以取任何数据类型。 【例3-31】 In[1]: number_dict = {'a':1,'b':2,'c':3,'c':4} In[2] number_dict Out[2] {'a': 1, 'b': 2, 'c': 4} 可以使用dict方法从其他的映射或“键-值”对来转换创建字典。 【例3-32】 In[3]: student = [('name','Mickey'),('age',24)] In[4] d = dict(student) In[5] d Out[5] {'age': 24, 'name': 'Mickey'} 2.字典操作 字典也有索引、删除、修改对应项的值等操作,操作的基本思想与序列很像。下面通 过举例说明。 【例3-33】 In[6]: student_dict= {'Tom':24,'Mickey':23,'Marry':15,'Abel':18} In[7] student_dict Out[7] {'Abel': 18, 'Marry': 15, 'Mickey': 23, 'Tom': 24} 使用len方法可以计算字典中包含的“键-值”对数目。 【例3-34】 In[8] len(student_dict) Out[8] 4 第3章 Python语言初步 81 索引时使用键做下标来找到相应的值。 【例3-35】 In[9] student_dict['Marry'] Out[9] 15 对字典的值进行修改时,常使用赋值的方法。 【例3-36】 In[10] student_dict['Tom'] = 28 In[11] student_dict Out[11] {'Abel': 18, 'Marry': 15, 'Mickey': 23, 'Tom': 28} 使用del命令删除字典中对应的“键-值”对。 【例3-37】 In[12] del student_dict['Mickey'] In[13] student_dict Out[13] {'Abel': 18, 'Marry': 15, 'Tom': 28} 通过in命令来判断某一关键字是否在字典中。 【例3-38】 In[14] 'Mickey' in student_dict Out[14] False 从这些基本的操作来看,字典和列表的操作有很多相同之处,但也存在一些重要的不 同之处。 首先,列表的索引只能对应于相应的位置,而字典中的键可以多种多样,并不是一定 要设置为整数,只要保证字典的键是不可变的,则实数、字符串、元组等类型都可以。 其次,通过赋值列表无法增加新的项,即不能给列表中没有的元素赋值。但是即便是 字典中原本没有的“键-值”,也可以通过赋值来创建新项。 【例3-39】 In[15] student_dict['Alan'] = 24 In[16] student_dict Out[16] {'Abel': 18, 'Alan': 24, 'Marry': 15, 'Tom': 28} 3.字典方法 介绍了字典的操作后,接下来就介绍一些很有用的字典方法。 (1)clear方法:使用该方法进行彻底地清除,删除所有的字典项,清除成功后返回值 为None。当然,除了使用clear方法外,还可以通过给字典赋空值来清空此字典。 82 数据科学导论 【例3-40】 In[17] student_dict = {'Abel': 18, 'Alan': 24} In[18] student_dict.clear() In[19] student_dict Out[19] {} (2)copy方法:使用该方法进行复制,返回一个新字典,其包含与原来的字典相同的 “键-值”对。 【例3-41】 In[20] x = {'username': '201820091', 'grades': [90,87,10]} In[21] y = x.copy() In[22] y Out[22] {'grades': [90, 87, 10], 'username': '201820091'} (3)get方法:get方法是用来快速访问字典的项。访问get指定的键,与普通的字典 查找结果一样,而使用get访问不存在的键是不会引发异常的,只是返回None值。 【例3-42】 In[23] d = {} In[24] print(d['name']) Out[24] KeyError: 'name' In[25] print(d.get('name')) Out[25] None In[26] d['name'] = 'Eric' In[27] d.get('name') Out[27] 'Eric' 同时,get方法还可以指定“默认”值,这样当未找到时,返回的将是指定的默认值而 不是None。 【例3-43】 In[29] d.get('name', 'N/A') Out[29] 'N/A' (4)keys方法:函数keys()返回一个字典的“键-值”视图,列出字典中的所有键。 【例3-44】 In[30] x = {'username': '201820091', 'grades': [90,87,10]} In[31] x.keys() Out[31] dict_keys(['username', 'grades']) (5)pop方法:该方法首先找出指定“键-值”对,然后将它们从字典中删除。 第3章 Python语言初步 83 【例3-45】 In[32] d = {'x': 1, 'y': 2} In[33] d.pop('x') Out[33] 1 In[34] d Out[34] {'y': 2} (6)items方法:函数items()将字典转换成列表,返回一个包含所有字典项的列表, 其中每个元素都为(key,value)的形式。字典项在列表中的排列顺序不确定。返回值的 类型为字典视图,可以对其执行成员资格检查。 【例3-46】 In[35] student = {'year': '2015', 'grades': [90,87,10]} In[36] student.items() Out[36] dict_items([('year', '2015'), ('grades', [90, 87, 10])]) In[37] len(student.items()) Out[37] 2 In[38] ('year', '2015') in student.items() Out[38] True 3.2.4 条件与循环语句 1.条件与条件语句介绍及用法 目前为止的语句都是逐条执行的,而Python的条件语句通过某些条件是True或 False来决定是否选择执行或是跳过某些特定的语句块。通常来说,False、None、各种类 型(包括浮点数、复数等)的数值0、空序列(如空字符串、空元组和空列表)以及空映射(如 空字典)这些都被视为假,其他各种值都被视为真。 Python中的条件语句用if和else来控制程序的执行,基本形式为 if 判断条件: 执行语句段1…… else: 执行语句段2…… 当判断条件为真时,执行紧接着的语句段,这部分内容可以为多行,以缩进来区分。 else部分为可选语句,当有需要在条件不成立时执行的内容可以在此处写下。 if语句的判断条件可以用>(大于)、<(小于)、==(等于)、>=(大于或等于)、<= (小于或等于)、!=(不等于)来表示。 Python与C语言的条件语句有些不同,Python不支持switch语句,所以多个条件判 断,只能使用elif来实现。因此,当判断条件为多个值,可以使用以下形式。 if 判断条件1: 84 数据科学导论 执行语句段1… elif 判断条件2: 执行语句段2… elif 判断条件3: 执行语句段3… else: 执行语句段4… 如果多个条件需要同时判断时,可以使用or(或),表示两个条件只要有一个成立时 值即为真;使用and(与)时,表示只有两个条件同时成立的情况下,值才为真。同时可使 用圆括号来区分判断的先后顺序,圆括号中的判断优先执行,此外and和or的优先级低 于>(大于)、<(小于)等符号,即大于和小于在没有括号的情况下会比and和or要优先 判断。除 此之外,if语句还可以实现嵌套,可将if语句放到其他if语句中,来实现判断后的 再次判断。 下面通过一个使用条件语句的程序例子来说明。 【例3-47】 程序3-1 条件语句的应用实例 num = 9 if num < 0: print('负数!') elif num > 0: # Python 3 中,下面式子括号里可合并为0< = num < = 100 if (num > = 0 and num < = 100) or (num > = 100 and num < = 150): print(num) else: print('大于150!') 2.循环语句介绍及用法 当了解了条件语句如何使程序在条件为真(或假)时执行特定的操作,接下来则进一 步了解如何重复执行某些操作,这里通过循环语句来解决这个问题。 Python的基本循环语句是while循环和for循环,在这些基础上加入一些跳出循环 的语句就可以使得整个程序的流程更为多样,可能性更为丰富。 下面对这些一一进行介绍。 1)while循环 while循环的基本形式为 while 判断语句: 执行语句… 第3章 Python语言初步 85 执行语句可以是单个语句或语句段,判断语句可以是任何表达式,结果为真时就执行 语句,当判断条件为假时,循环结束。 不仅如此,while语句后还可以加else语句,表示在循环条件为假时执行另一段程 序,形式为 while 判断语句: 执行语句1… else: 执行语句2… 【例3-48】 程序3-2 while循环的应用实例 numbers = [12,23,34,45,56,67,78,89] even = [] odd = [] while len(numbers) > 0: number = numbers.pop() if(number % 2) = = 0: even.append(number) else: odd.append(number) else: print(even) print(odd) 输出结果 [78, 56, 34, 12] [89, 67, 45, 23] 2)for循环 for循环的基本思想是在遍历某一序列的每一个项目时执行一段语句,序列可以是一 个列表或字符串,也可以是一个范围。 for循环的基本形式为: for 迭代变量in 序列: 执行语句… 当for循环遍历的是一个范围时,迭代变量相当于一个计数器,序列则通常是使用 len()函数获取的列表长度和range()函数返回的元素范围等。 与while循环相类似,for循环也可以同else结合表示跳出循环后执行的内容。 86 数据科学导论 【例3-49】 程序3-3 for循环的应用实例 books = ['math','chinese','computer science'] for index in range(len(books)): print("book about "+ str(index)+ ":", books[index]) else: print("Bye") 输出结果 book about 0: math book about 1: chinese book about 2: computer science Bye 3)嵌套循环 Python允许在一个循环体中嵌入另一个循环,例如同类型的,在for循环中嵌入for 循环,在while循环中嵌入while循环。不仅如此,在while循环中也可以嵌入for循环, 在for循环中也可以嵌入while循环等。 break跳出循环:Python的break语句用来终止循环语句,即使循环条件没有False 条件或者序列还没被完全递归完,也会停止执行循环语句。它在while和for中都可以被 使用,当使用嵌套循环时,break语句将停止执行最深层的循环,并开始执行下一行代码。 【例3-50】 程序3-4 break跳出循环的应用实例 for letter in 'Python': if letter = = 'h': break print('这是break 块') print('当前字母:', letter) print('break') 输出结果 当前字母: P 当前字母: y 当前字母: t break continue跳出循环:相比于break跳出整个循环,continue语句用来跳出本次循环。 言下之意是,continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下 一轮循环。它可以在while和for循环中使用。 第3章 Python语言初步 87 【例3-51】 程序3-5 continue跳出循环的应用实例 for letter in 'Python': # 第一个实例 if letter = = 'h': continue print('这是continue 块') print('当前字母:', letter) print('continue') 输出结果 当前字母: P 当前字母: y 当前字母: t 当前字母: o 当前字母: n continue pass跳出循环:Python的pass是空语句,为了保持程序结构的完整性而设计的。 pass不做任何事情,一般用作占位语句。 【例3-52】 程序3-6 pass跳出循环的应用实例 for letter in 'Python': if letter = = 'h': pass print('这是pass 块') print('当前字母:', letter) print('pass') 输出结果 当前字母: P 当前字母: y 当前字母: t 这是pass 块 当前字母: h 当前字母: o 当前字母: n pass 88 数据科学导论 3.2.5 函数 1.定义函数 函数是预先设计好的、可重复使用的、能够实现单一或多种功能的综合代码段。使用 了函数的Python代码,模块性较强,代码的重复利用率较高。目前为止我们可能或多或 少地也使用过Python自带的函数,如print()等。 当然,除了使用Python提供的函数以外,用户也可以自己定义,但是首先要知道的 是,定义函数有如下几条规则。 首先,定义函数的标志关键字是def,在它之后应该紧接着用户想要设计的函数名称。 其次,用户想要传入的参数用圆括号括起放在函数名后,并且在圆括号结束的位置之 后加上冒号作为函数内容的开始。 同时,当开始定义函数内容时,要时刻保持缩进的使用是正确的。 最后,使用return语句表示函数结束时返回给调用者的值,不带return则相当于返 回None。 示例的结构如下: def 函数名(参数列表): 函数执行语句段… return [表达式] 2.函数调用 当使用如上规则定义了一个函数,指定了函数名称、传递的参数以及代码块内容后, 需要通过另外的语句调用函数,才能使这个函数在适当的时间与位置执行相应的功能。 函数的调用可以嵌套在任何用户设定的位置里,如另外的函数中、命令行中等。下面举例 说明函数的定义与调用过程。 【例3-53】 程序3-7 函数的定义与调用实例 def printstr(string): print(string) printstr("函数的定义与调用!") 输出结果 函数的定义与调用! 3.参数传递 Python的变量是没有特定类型的,定义的函数参数列表中的变量类型取决于参数传 第3章 Python语言初步 89 递时所赋值的类型。同时根据函数传递的参数是否可以修改,将它们分成不可变类型与 可变类型。 不可变类型参数传递本质上就是传值,常用的有数字、字符串等。当使用传值时,即 使在函数内部对这些参数进行修改,它们的变化也不会影响函数外的值。因为当它们被 传入函数后,相当于生成了另外一个复制的对象,使得函数内部语句在复制对象上进行 操作。可 变类型参数传递本质上是传引用。传引用传入的是变量的地址,而当函数内部得 到变量的地址后,再进行的操作相当于对原变量进行修改,修改后函数外部的变量也会受 到影响。 【例3-54】 程序3-8 传不可变对象的应用实例 def ChangeInt(a): a = 10 b = 3 ChangeInt(b) print(b) 输出结果 3 【例3-55】 程序3-9 传可变对象的应用实例 def ChangeList(mylist): "修改传入的列表" mylist.append([1,2,3,4]) print("函数内取值: ", mylist) mylist = [10,20,30] print("更改前取值: ", mylist) ChangeList(mylist) print("更改后取值: ", mylist) 输出结果 更改前取值: [10, 20, 30] 函数内取值: [10, 20, 30, [1, 2, 3, 4]] 更改后取值: [10, 20, 30, [1, 2, 3, 4]]