3Python基础 【本章摘要】 数学内容: 无。 编程内容: 介绍Python编程最基本知识,集成开发环境Eclipse的使用,Python基本数据类型和基本语句介绍。 3.1计算机如何执行Python程序 Python安装成功以后,它包含一些最基本的组件,如一个解释器和支持的库。解释器最基本的功能就是逐行理解我们写的程序,并顺序执行,如果出错,就停止执行并报错。这是我们程序员看到的执行过程,实际上,当程序执行时,Python解释器会先将我们的一行行代码编译成字节码指令(通常为.pyc扩展名),然后把字节码发送给一个Python虚拟机(Python Virtual Machine)去执行。 为什么要翻译成字节码?为什么要由虚拟机去执行?CPU不可以直接执行吗?好问题! (1) 为什么要翻译成字节码? 就像两个语言不同的人在交流时需要翻译,Python是为方便人和机器交流而研发的一种语言,显然它一定要让人类好写,好懂,这样一来,人类是方便了,效率也高了,但机器不喜欢这种形式的语言,因此有了翻译成字节码的过程,翻译好了,这个字节码就是Python虚拟机能读懂的东西。 (2) 为什么要虚拟机? 计算机有很多种类,家里可能有台式机、笔记本电脑、平板电脑, 这些不同种类的计算机使用了不同的CPU芯片,性能不同,价格差异很大,这就像汽车厂商会有各自不同的发动机一样,这些CPU上运行的操作系统也有很大不同,比如苹果电脑使用 Mac OS,大部分台式机使用Windows。为了让Python在这些不同的操作系统上都能运行起来,定义了一个工作方式统一的虚拟机,不管底层的操作系统和CPU如何千变万化,虚拟机的工作方式保持不变,把具体底层CPU的适配交给操作系统。这就是虚拟机的作用。回过头来看,我们安装的时候,强调一定要选择和操作系统匹配的安装程序,也就是这个原因! 3.2程序员如何执行Python程序 3.2.1交互式执行语句 在Windows的开始菜单中找到Python IDLE,双击就会出现以下界面。 可以在这里面直接执行Python语句,只要符合Python语法,都可以执行,按回车键就能立即得到结果, 例如,输入print(“hello world”),立即就返回“hello world”。这种方法不好之处就是它不会把代码保存到一个文件中,但是可以作为尝试代码合法性的一种好方法,通过交互提示模式尝试代码,通常是搞清楚一段代码到底起到什么作用的最快方式,比如: ‘what’*7,看起来很费解,马上尝试一下: 3.2.2使用命令行执行文件 可以使用任何编辑器编辑一个Python文件,比如a.py,注意扩展名一定要是.py,然后在系统自带的命令行中 输入python a.py.,就会执行这个python 文件。这种方法很有用,尤其是如果你用Python写了一些文件处理的程序,比如递归地删除文件夹内的某一类文件等,基本上都会使用这种方式执行。使用这种方式执行时有几个需要注意的地方: (1) 文件扩展名一定要用.py。 (2) 执行Python的环境变量PATH一定要设置到指向python.exe文件。这个环境变量的设置,我们在安装Python时,强调了要勾选Add Python 3.7 to PATH复选框。如果没有自动添加,也不复杂,可以通过“控制面板”→“系统”→“关于”→“系统信息”→“高级系统设置”→“环境变量”把python.exe的路径手动添加到PATH中,python.exe到哪里去找呢?当然是你当时把Python 3.7安装到哪里,就到哪里去找。 3.2.3在集成开发环境里面执行文件 本书推荐使用PyCharm和Eclipse+Pydev,在前面章节安装集成开发环境时介绍过。 3.3Python程序初体验 我们现在来执行一小段程序,打开集成开发环境,创建一个PyDev Project,命名为lab1,然后在lab1这个Project中创建一个新文件,名字叫test.py,注意事项如下。 (1) 总是先创建Project,然后往Project中添加文件。Project是工程、项目的意思,创建一个项目就好比建一栋房子,当然需要很多模块,这一个个文件就是独立的模块,如门、窗、墙等。 (2) 创建Project时有很多选择,我们为什么要创建Pydev项目而不是Java、Maven,等等?我们在一开始安装Eclipse时就提到,Eclipse是一个可以进行Java、C/C++以及Python开发的集成开发环境,创建 Pydev项目就是告诉Eclipse接下来的项目种类是Python项目,请用Python的解释器来执行创建的程序。 (3) 在创建Pydev项目时,会出现下面的选项(见图31),我们选什么呢?答案是选Python,那么Jython、IronPython 是什么?简单地说,Python语言有 Cpython、Jython、IronPython三种实现方式,我们用的是Cpython,即通常说的Python。Jython是为了与Java语言集成而实现的一种Python语言,IronPython是为了与Windows的.Net框架集成而实现的一种Python语言,可以把这三者的关系理解成: Python是普通话,Jython和IronPython是两种方言。 (4) 创建好Project以后,在Eclipse最左边会看到一个“Pydev Package Explorer”(见图32),里面有我们所创建的所有Project,其中包含“lab1”,因为这个窗口上有一个“×”,有时候也会不小心把它整个关了,这时只要选择主菜单栏的“Window→Show→Pydev Package Explorer”就能把它恢复。 图31Pydev项目类型 图32Pydev包资源管理器 我们在test.py 中输入三行代码如下,保存之后发现几个奇怪的地方(见图33): ① import、print变成蓝色了。 ② import os前面有一个惊叹号。 ③ c=os.getcwd()前面出现了一个红叉。 ④ 单击Run按钮,试图执行这个程序,则出现了下面的错误(见图34)。 图33保存代码 图34程序执行报错 解答1: import、print还有很多别的词在Python中都有特殊含义,叫保留字,编程时不能重新定义,只能使用,变成蓝色就是提醒开发人员,这是保留字,这样的字还有如下几十种(见表31)。 表31Python的保留字 falseclassfinallyisreturn Nonecontinueforlambdatry Truedeffromnonlocalwhile anddelglobalnotwith aselififoryield assertelseimportpass breakexceptinraise 解答2和3: 前两句话的惊叹号和红叉是相关联的,都是因为没有对齐的原因。在Python中,代码块中使用相同的缩进来标明一段代码块的开始和结尾(也就是它们会左对齐)。把它们左对齐以后,就没问题了。 解答4: 单击Run按钮报错,这是因为我们还未对这个文件设置如何执行,解决办法有两种。办法1,选择 Run as→Python Run菜单就可以执行,而且再单击Run按钮时就可以执行了,这是因为我们已经手动设置了应该选择哪种执行方式来执行这个程序。办法2,在Python Package explorer中选择要设置的文件,右击, 在弹出的快捷菜单中,选择“properties”中的Run/Debug Settings选项,手动指定哪个项目中的哪个文件需要执行,并且命名以后,再单击apply and close,可以达成一样的目的。 解答5: 这个程序在干什么? import os#导入os这个模块 c=os.getcwd()#用os模块内的getcwd()函数获取当前工作路径, #然后赋给c这个变量,因此c是一个字符串变量 print(c)#用系统自带的打印函数打印这个字符串 3.4Python的数据类型 Python有如表32所示的一些内置基本数据类型,可以定义也可以赋值。 表32Python基本数据类型 对象类型例子解释 数字i=123,j=3.14等号在Python中是赋值的意思,例子中定义了一个变量i,它的值是123 字符串a='google'把字符串google赋给a 列表A=[1,'google',2]定义了一个列表A,A[0]=1,A[1]='google' 字典D={'food':'spam','tasete':'yum'}定义了一个字典,可以通过D['food']='spam'来访问 元组E=(1,"Google",33)一个元组中包含三个元素,分别是数字1,字符串Google,数字33 集合set('abc')包含三个字符a,b,c的集合,集合可以运算 其他布尔型,None 后续章节会细讲这些内容,如果你现在看了有点懵,也不要紧,以后可以翻回来再查。 3.5Python基本语句和控制语句 (1) Python程序由模块构成。 (2) 模块包含语句。 (3) 语句包含表达式。 (4) 表达式建立并处理对象(上一节介绍的基本数据类型都是对象)。 模块我们前面已经接触过了,import os 就是把os整个模块导入进来,简单来说,每一个以扩展名 py 结尾的Python源代码文件都是一个模块。其他的文件可以通过导入一个模块读取整个模块的内容。从更宏观的角度来看,模块扮演了一个工具库的角色,它往往就是变量名以及一些特定函数的封装,可以通过引入模块来使用这个模块里的变量和函数。 可以用生活中一个具体的例子来类比一下,家中通常会购买螺丝刀、扳手、卷尺等日常工具,并们把它们收到一个工具箱中,当需要时,我们会把工具箱搬出来(就是import toolbox),如果需要刀就把刀拿出来用(在Python中用toolbox,knife来使用它),我们暂时讲到这个深度。后面有时候我们需要用到一些尚未安装在本机的模块,这时需要用到pip 这个工具来安装模块。 表33列出了Python所有的语句形式,读者现在看可能会觉得莫名其妙,这个表可以先不管,用于以后待查。 表33Python语句总结 语句角色例子 赋值被变量赋值,后面程序可以直接用A,B,C='Monday','Tuesday','Wednesday' 打印打印一个对象print('input a number') 调用调用模块中的一个函数os.getcwd() if/elif/else通过判断条件,选择分支if "python"in text: print(text) for/else序列迭代,循环控制for x in range(1,9): print(x) while/else一般循环while X>Y: print('hello') 续表 语句角色例子 pass空占位符while True: pass break循环退出while True: ifx<8: break continue循环继续while True: if skipTest() : continue def函数和方法deff(a,b,c=1,*d): print(a+b+c+d[0]) return函数结果defadd(a,b): return a+b yield生成器函数defgen(n): for i in n: yield i*2 global命名空间globalx import导入模块importsys from部分属性访问from sys import stdin class创建一个类对象class subclass(SuperClass): def method(self):pass try/except/ finally异常捕获try: action() except: print("error") raise促发异常raise EndSearch(location) assert检查是否符合条件assert X>Y,"X too small" del删除引用del data[k] 3.6简短实例 打开Eclipse,按3.3节的方法在lab1这个工程里创建一个新文件,命名为Test2.py,然后把上面代码输入到文件中,注意,每行的前面的数字不需要输入。 第1行,i=0 我们定义了一个变量i,把它的初始值设为0。 Python中变量定义的规则如下: (1) 语法: (下画线或字母)+(任意数目的字母、数字或下画线)。 (2) 变量名只能是字母、数字或下画线的任意组合。 (3) 区分大小写,比如ii=0,II=1,这是两个不同的变量。 (4) 变量名的第一个字符不能是数字,比如3Com=0,这个变量定义是非法的。 (5) 保留字不能声明为变量名。 ['and','as','assert','break','class','continue','def','del','elif','else','except','exec','finally','for','from','global','if','import','in','is','lambda','not','or','pass','print','raise','return','try','while','with','yield'] 第2行while True: 开始了一个循环体,while后面是一个循环测试条件,测试条件之后是冒号“:”,每执行循序体一次就要再测试一下条件是否还满足,这个循序后面跟的是一个常数 True,即永远满足的条件,那么这个循序体如果 不通过break跳出,就会是一个一直执行下去的死循环。 第3~7行,全部以4个空格并左对齐,构成一个循环体,这就是前面提到过的对齐规则,在执行完第7行最后一句 print之后就会回到第二行继续执行。 第3行 reply=input("Enter text:") 第3~7行构成循序体,第3行调用了系统的输入函数 input(),它的函数参数是一个字符串"Enter text:",这个函数会在Console(命令行窗口)上把输入的字符串打印出来后,等待用户输入,一旦按回车键(Enter),输入结束,把输入的字符串赋给 reply这个变量。之所以要有"Enter text:",就是为了提醒用户,如果不输入提示字符串,用户完全不知道计算机在等待用户的输入。 第4行if reply=="stop": break 判断用户刚才输入的字符串是否等于"stop",如果是就 break,break就会立即跳出循环体而不再执行后面的语句。if是分支判断,reply=="stop"是判断条件,这种语句的句型通常是: if分支判断条件: 语句片段 else: 语句片段 else:可以没有 第5行 print(reply.upper()) 打印 reply这个字符串,在打印之前会调用字符串的函数upper()把字符串转换成大写。注意这个优先级,括号()里面的优先级最高,会首先执行。 第6行i=i+1 把i+1赋给 i,每循环一次就增加1,统计退出前循环了多少次。 第7行 print("you have tried",i,"times") 打印一共循环了多少次。 这个程序里面出现了字符串,字符串的使用比较复杂,我们总结一下: (1) 可以用单引号、双引号(如"anything"、'anything')定义字符串,二者等效。 (2) 反斜杠进行转义,比如我们需要一个字符串'its him',字符串中本身出现了一个单引号和第一个单引号配对,造成字符串被截断了,这时可以通过在那个需要转义的单引号前加“\”,告诉Python解释器,那个单引号是字符串的一部分: 'it\s him'。 (3) 三重引号做注释,三个双引号或单引号配对之间的所有内容都是注释,而且可以跨多行,比如下面的内容就全是注释,不会执行: """ what you are you do not see, What you see is your shadow """ (4) 字符串可以分片访问,其中的“1:3”,就是从第1个到第3个,不包括第3个,[:-1]就是到倒数第一个为止的意思。大家可以打开Python的命令行,仿照看看下面的实例,自己做一下实验。 (5) 字符串还有很多方法可以调用(见表34),比如如果我们已经定义了T="hello"。 表34方法调用及返回结果 方 法 调 用返 回 结 果解释 T.upper()HELLO转换成大写 T.lower()hello T.isdigit()False是否是数字 T.count('e')1统计有几个e 还有很多其他的函数,可以在Python 的Console里通过输入help(str)获得关于字符串的全部文档。也可以通过搜索引擎获得字符串的详细解释。后面我们用到的时候再讲解一些知识点。 从下一章开始我们逐步进行一些简单编程。