Python入门教程.doc_第1页
Python入门教程.doc_第2页
Python入门教程.doc_第3页
Python入门教程.doc_第4页
Python入门教程.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

运行环境1. 运行环境 要用python写程序,你必须先安装一个python的解释器。它可以存在于大多数平台(包括Macintosh、Unix和Windows)。更多与此有关的信息可以在python的网站上找到。你还应该有一个文本编辑器(象emacs、notepad或者类似的东西)。 编程是什么?2. 编程是什么? 为计算机写程序其实就是给它一系列的指令告诉它去做什么。计算机程序在某些方面就象是菜谱,指导我们如何做菜的那种。例如1: 假日火腿沙拉 原料: 腌泡汁: 1/4杯酸橙汁 1/4杯低钠大豆酱油 1/4杯水 1大汤匙植物油 3/4茶匙小茴香 1/2茶匙牛至 1/4茶匙热胡椒粉 2片丁香、大蒜,捣碎 沙拉: 1份(12盎司)罐装少钠午餐肉火腿切成条状 1个洋葱,切片 胡椒粉,切好的生菜 12个樱桃西红柿,切半 方法: 把腌泡汁装在有合适盖子的广口瓶里摇匀。用塑料袋装上火腿,泼上腌泡汁,封住袋口。在电冰箱里腌制30分钟。从塑料袋里取出火腿;准备2大汤匙腌泡汁,在煮锅里煮一下。加上火腿、洋葱、绿色的胡椒。烧3到4分钟直到火腿熟了为止 当然,没有一台计算机会懂这个而且即便是懂,大多数计算机也不可能烧制出一份沙拉。那么,我们该如何让这些变得对计算机来说更为友好一些呢?从根本上说依赖于两点:首先,我们必须以计算机可以理解的方式与之交流;其次还要和它谈论它能够做到的事情。 第一点意味着我们必须使用一种语言一种已经为之准备好了解释器的程序设计语言,第二点意味着我们不能期望计算机为我们做一份沙拉但是我们可以让它做数字累加或者在屏幕上打印东西之类的事情。Hello3. Hello 程序设计教程有一个传统,通常以在屏幕上打印“Hello, world!”这样的程序做为开始。对python来说,这非常简单: print Hello, world!它从根本上说很象上面的菜谱(尽管要短得多!)。它告诉计算机做什么:打印“Hello, world!”。如果让它打印更多的废话该怎么做呢?很简单: print Hello, world!print Goodbye, world!不比上一个难,是不是?但是不怎么有趣我们希望它可以处理更多的元素,就象沙拉菜谱那样。那么,我们都有哪些元素呢?首先,有字符串,象“Hello, world!”,除此之外还有数字。假设我们打算让计算机为我们计算矩形的面积。我们可以给它如下的菜谱: # The Area of a Rectangle# Ingredients:width = 20height = 30# Instructions:area = width * heightprint area你大概可以看出它同火腿沙拉菜谱的相似性(尽管有些细微的差别)。但它是如何工作的呢?首先,以#开始的行叫做注释事实上会被计算机忽略。然而插入象这样小段的注释对于增强你程序的可读性来说是很重要的。 接下来,看起来象 foo = bar 这样的行叫做赋值。对于 width = 20 这样的情况来说就是告诉计算机从这里开始width就代表20了。它还意味着一个名字为“width”的变量从此被创建了(如果它先前已经存在,那么会被重新覆盖)。所以,我们以后使用这个变量的时候,计算机就知道了它的值。因此, width * height 本质上同 20 * 30 一样会计算出600这个结果,然后赋给名称为“area”的变量。程序的最后一句在屏幕上打印出变量“area”的值,所以你看到这个程序运行的最终结果仅仅是 600 注意:在某些程序设计语言中,你必须在程序开始的时候告诉计算机你将会用到哪些变量(就象沙拉中的元素)而python足够聪明,所以你可以根据需要随时创建。反馈4. 反馈 现在,你可以执行一些简单,或者再复杂一点的计算了。比方说,你或许打算写一段程序来计算圆形的面积而不是矩形的: radius = 30print radius * radius * 3.14然而,这事实上并不比计算矩形面积的那个程序更有意思。至少在我看来是这样。它有些僵硬。如果我们看到半径为31的圆该怎么办?怎样让计算机知道?这有点象沙拉菜谱中的:“烧3到4分钟直到火腿熟了为止。”要知道何时烧熟,我们必须检查。我们需要反馈,或者提示。计算机如何知道我们圆形的半径?同样需要输入资料我们可以做的是告诉计算机半径是多少: radius = input(What is the radius?)print radius * radius * 3.14现在程序变得漂亮一些了input是个被称为函数的东西。(很快你将学习创建你自己的函数。而input是python内建的函数。)仅仅写下 input 什么也不会做你必须在它的后面放上一对括号。所以input()可以工作它会简单的要求用户输入半径的长度。而上面的那个版本对用户来说也许更友好一些,因为它首先打印出了一个问题。当我们将诸如提问字符串“What is the radius?”之类的东西放在函数调用的括号中时,这个过程被称为函数的参数传递。括号中的内容被称为参数。在上个例子中我们传递了一个提问作为参数以便input知道在获得答案前应该先打印什么。 但是获得的答案如何到达radius变量呢?函数input,调用时,会返回一个值(象许多其它函数一样)。你不一定非要使用这个值,但象我们这种情况,我们要使用它。这样,下面这两个表达式有着很大的差别: foo = inputbar = input()foo现在包含input函数本身(所以它事实上可以象foo(What is your age?)这样使用;这被称为动态函数调用)而bar包含用户键入的值。 流程5. 流程 现在我们可以编写程序执行简单的任务(运算和打印)并且可以获得用户输入了。这很有用,但仍然局限在按顺序执行命令,也就是说它们必须按照事先安排好的顺序执行。大多数火腿沙拉菜谱是象这样顺序或者线性叙述的。但是如果我们打算让计算机检查沙拉是否烧好该怎样告诉它呢?如果烧好了,那么应该从烘箱里把它取出来否则的话,应该接着让它烧更长一段时间什么的。我们如何表达这个? 我们想做的,其实是控制程序的流程。它可以从两个方向执行要么拿开火腿,要不继续让它留在烘箱里。我们可以选择,条件是它是否烧好。这被称为条件执行。我们可以这样写: temperature = input(What is the temperature of the spam?)if temperature ; 50: print The salad is properly cooked.else: print Cook the salad some more.意思很明显:如果温度超过50(摄氏度),那么打印出信息告诉用户烧好了,否则,告诉用户再烧制一段时间。 注意:缩进在python中很重要。条件执行(还有循环执行以及函数定义见后面)中的语句块必须被缩进(而且要缩进同等数量的空格;一个键相当于8个空格)以便解释器可以知道它们从哪里开始到哪里结束。这同时也使程序变得更加可读。 让我们回到先前的面积计算问题。能看出来这段程序做什么吗? # Area calculation programprint Welcome to the Area calculation programprint -print# Print out the menu:print Please select a shape:print 1 Rectangleprint 2 Circle#Get the users choice:shape = input(; )#Calculate the area:if shape = 1: height = input(Please enter the height: ) width = input(Please enter the width: ) area = height *width print The area is , areaelse: radius = input(Please enter the radius: ) area = 3.14 * (radius*2) print The area is , area这个例子中的新东西: 1. 只使用print本身将打印出一个空行 2. =检查两个值是否相等,与=不同,后者把表达式右侧的值赋给左侧的变量。这是一个非常重要的差别! 3. *是python的幂运算符因此半径的平方被写成radius*2 4. print能够打印出不止一个东西。只要用逗号把它们分开就可以了。(它们在输出时会用单个空格分开。) 这个程序很简单:它要一个数字,告诉它用户打算让它计算矩形或是圆形的面积。然后,使用一个if语句(条件执行)来决定应当执行哪个语句块计算面积。这两个语句块同先前面积计算例子中使用的语句块本质上是一样的。留意注释是如何使代码变得更加可读的。编程的第一条戒律就是:“你应当注释!”无论如何它都是一个应该养成的好习惯。 练习1: 扩展上面的程序使它包括正方形面积的计算,用户只要输入它一条边的长度就可以了。做这个练习之前你需要了解一件事:如果你有两个以上的选择,你可以象这样写: if foo = 1: # Do something.elif foo = 2: # Do something else.elif foo = 3: # If all else fails.这里的elif是意思为“else if”的神秘代码:)。所以,如foo等于1,做某件事;否则,如果foo等于2,那么做另外的一些事,等等。你也可以在程序中加入其它的选项象三角形以及任意多边形。随你的便。 循环6. 循环 顺序执行和条件执行仅仅是程序设计三个基本语句块架构方式中的两个。第三个则是循环执行。在上个段落中我假设了一种情况,检查火腿是否烧好,但很明显它并不适用。如果下次检查时火腿仍然没烧好该怎么办?我们怎么知道需要检查多少次?事实上,我们不知道。而且我们也没必要知道。我们可以要求计算机持续检查直到烧好了为止。怎么表达这个?你猜到了我们使用循环,或者说是重复执行。 python有两种循环类型:while循环和for循环。for循环大概是最简单的。举个例子: for food in spam, eggs, tomatoes: print I love, food它的意思是:对于列表spam, eggs, tomatoes中的每个元素,都打印出你喜欢它。循环中的语句块为每个元素执行一次,而且每次执行,当前的元素都被赋给变量food(在这个例子中)。另外一个例子: for number in range(1, 100): print Hello, world! print Just, 100 - number, more to go.print Hello, worldprint That was the last one. Phew!函数range返回给定范围的数字列表(包括第一个数字,不包括最后一个这个例子中是199)。所以,这样解释它: 循环体为1(包括)到100(不包括)之间的数字每个执行一次。(哪个是循环体以及随后的表达式事实上做什么留下来做为练习。) 但这对我们的烧菜问题并没有实质的帮助。如果我们打算检查火腿一百次,那么这是个很好的解决方案;但是我们不知道这是否够或者太多了。我们只是希望它在温度达不到(或者,直到它足够热大致某个状态)的时候持续检查。所以,我们使用while: # Spam-cooking program# Fetch the function sleepfrom time import sleepprint Please start cooking the spam. (Ill be back in 3 minutes.)# Wait for 3 minutes (that is, 3*60 seconds).sleep(180)print Im baaack :)# How hot is hot enough?hot_enough = 50temperature = input(How hot is the spam?)while temperature hot_enouth: print Not hot enough. Cook it a bit more. sleep(30) temperature = input(OK, How hot is it now?)print Its hot enough - Youre done!这个例子中的新东西 1. 有些有用的函数被存储在模块中而且可以被导入。此例中我们从python自带的time模块中导入了函数sleep(它休止给定的多少秒的时间)。(做你自己的模块当然也是可能的) 练习2: 写一个程序,持续从用户获得数据然后相加,直到它们的和为100。再写一个程序,从用户那里获得100个数据,打印出它们的和。 Bigger Programs - Abstraction 如果想知道一本书的大致内容,你不会翻遍所有的页你只是看看目录,是不是?它会列出书的主要内容。现在想像写一本菜谱。许多菜谱,像“奶油火腿通心面”和“瑞士火腿馅饼”很可能包含相同的东西,比如火腿,在这种情况下你肯定不会打算在每个菜谱里都重复叙述如何制作火腿。(好了你事实上可能不做火腿但是为了做例子,请忍受一下:))。你会把制作火腿的菜谱单独放在一个章节,而仅仅在其它章节里引用它。这样代替在每个菜谱里都完整的描述,你只要引用章节的名称就可以了。在计算机编程中这被称为抽象化。 我们是不是已经象这样运行了某些东西?是的。我们没有详细的告诉计算机如何从用户那里获得一个答案(好了我们没有真的这样做同样地我们也没有真正的在做火腿:))而是简单的使用了input一个函数来代替。我们事实上可以构造我们自己的函数,来应用于这种类型的抽象化中。 假设我们希望找到小于给定正数的最大整数。例如,给定2.7,这个数应当是2。这往往被称为给定数的“底线(floor)”。(这事实上可以用python的内建函数int来处理,但是,请再次忍受我拿它作例子)我们该怎样做?一个简单的解决办法是从0开始试每一个可能的数: number = input(What is the number?)floor = 0while floor = number: floor = floor + 1floor = floor - 1print The floor of , number, is , floor注意当floor不再小于(或者等于)给定数时循环结束了;我们加了太多1给它。因此我们必须为它减去1。如果我们希望把它应用于完整的数学运算该怎么办呢?我们不得不为求每个数的基数(floor-ing)而写一次完整的循环。这很不舒服你可能猜到了我们代之以什么:把它放在我们自己的函数中,命名为“floor”: def floor(number): result = 0 while result = number: result = result + 1 result = result - 1 return result这个例子中的新东西 1. 函数用关键字def定义,函数名紧随其后并且要用括号把需要的参数括起来。 2. 如果要求函数返回一个值,要使用关键字return来处理(它同时也自动结束函数定义)。 定义了函数之后,我们可以象这样使用它: x = 2.7y = floor(2.7)执行后,y的值应该是2。定义拥有多个参数的函数也是可以的: def sum(x, y): return x + y练习3 写一个函数,用欧几里德方法寻找两个数的一个共同因数。工作过程是这样的: 1. 假设两个数,a和b,a大于b 2. 重复以下步骤直到b变成0: 1. a变为b的值 2. b变成没有改变值之前的a除以没有改变值之前的b的余数 3. 返回a的最后一个值 提示: * 使用a和b作为函数的参数 * 简单的设定a大于b * x除以z的余数用表达式 x % z 来计算 * 两个变量可以象这样一起赋值:x, y = y, y+1。这里x被赋以值y(这意味着,y的值此前已经指定)而且y被递增了1。 深入函数7. 深入函数 上面的练习怎么做?难吗?还不太清楚函数?别担心我还没完成我的话题呢。 我们构建函数时使用的萃取方法称为过程抽象,许多编程语言把关键字过程同函数一样使用。事实上,这两个概念是不一样的,但是在python中它们都被称为函数(因为它们或多或少以同样的方式定义和使用)。 函数和过程(在其它语言中)的区别在哪里呢?嗯就像你在前面的段落里看到的那样,函数可以返回一个值。区别就是过程并不返回这样的值。许多时候,用这种方法把函数划分为两种类型返回值的和不返回值的是很有用的。 不返回值的函数(过程)可以用作子程序或例行程序。我们调用这些函数,它们制造某些原料,就象泡沫鲜奶之类的。我们可以在很多地方使用这个函数而不需要重写它的代码(这被称为代码再利用以后你还会知道,它意义不仅仅在这里)。 这样的函数(或过程)的另一个有用性体现在它改变了环境(例如,把糖和奶油混在一起搅拌,它们的整个外部状态就变化了)让我们看个例子: def hello(who): print Hello, , whohello(world)# Prints out Hello, world打印出内容是它一方面的作用,因为这是这个函数唯一需要做的事,它其实是一个典型的所谓过程。但是它事实上没有改变它的运行环境,是不是?它怎样才能改变呢?让我们试一下: # The *wrong* way of doing itage = 0def setAge(a): age = asetAge(100)print age# Prints 0错在哪儿?错在函数setAge创建了它自己的也被命名为age的局部变量,它只在setAge函数内部可用。那如何才可以避免出现这个问题呢?我们可以使用全局变量。 注意:全局变量在python中不常用。它们容易引起不好的代码组织结构,被称为意大利面代码。我这里使用它们是为了引出更复杂一点的技术问题如果你可以请尽量避免使用它们。第 8 章通过告诉解释器一个变量是全局的(用象global age这样的表达式做),我们事实上 告诉了它在函数之外使用这个变量,而不是重新创建一个新的局部变量。(所以,和局部 相反它是全局的。)因此上面的程序可以象这样重写: # The correct, but not-so-good way of doing itage=0def setAge(a): global agesetAge(100)print age# Prints 100了解对象(随后谈到)后,你会发现更好的解决这个问题的办法是使用一个有age属 性和setAge方法的对象。在数据结构那段,你也将会发现一些函数改变它的环境的更好的 例子。 好了那么真正的函数是什么样?什么是函数呢,事实上?数学函数象一种“机 器”,获得输入然后计算结果。它会每次返回同样的结果,如果每次提供它同样的输入。 例如: def square(x):return x*x这和数学上的函数f(x)=x*x 一样。它的行为象一个精确的函数,仅仅依赖于它的输 入,在任何情况下都不改变它的环境。 所以我这里描绘了两种构造函数的方法:一种类型更象是过程,不返回任何结 果;另一种更象是数学上的函数,(几乎)什么也不做就是为了返回一个结果。当然,在 这两种极端事物之间做某些事情是可能的,尽管当函数改变事物的时候,它应该清楚它改 变了。你可以通过标记它们的名字区分它们,例如为“纯粹”的函数使用象square这样的 名词而对类似过程那样的函数使用象setAge这样命令式的名字。 更多类型数据结构9. 更多类型数据结构 现在你已经知道了不少:怎样输入输出,怎样设计复杂的运算法则(程序)来执 行数学运算,但是好戏还在后头呢。 截止目前我们都在程序中使用了哪些成份呢?数字和字符串,对不对?没意思的种 类现在让我们引入两三个其它的成份来让事情变得更有意思些。 数据结构是种组织数据的成份。(惊奇,吃惊)单个的数据没有什么真正的数据 结构,是不是?但是假设我们需要很多数放在一起做为一个成份那就需要某种结构。 例如,我们可能想要一个数据列表。那很容易: 3, 6, 78, 93 在循环那段我提到了列表,但没真正描述它。好这里说的就是你如何创建它。只 需要列出元素,用逗号分开,再加上方括号就行了。 来看一个计算素数(只能被1和它本身整除的数)的例子: # Calculate all the primes below 1000# (Not the best way to do it, but.)result = 1candidates = range(3, 1000)base = 2product = basewhile candidates: while product ),如果需要续行系统用次提示提示输入,缺省为三个小数点(.)。在主提示下键入文件尾符号(在UNIX中为Control-D,在DOS或Windows中为Control-Z)可以正常退出解释程序。 Python解释程序的有些版本支持命令行编辑和命令历史,使用用Emacs或vi的键组合。第三章基本使用下面我们用例子来介绍Python的基本用法。在例子中,用户输入和系统输出靠有没有提示(和.)来分别。如果要试这些例子的话,需要键入提示后的所有命令,例子中没有提示的行是系统的输出。注意只有次提示的行意味着需要键入一个空行,这用于结束多行命令。3.1 用Python作计算器使用启动解释程序,等待主提示出现。解释程序可以作为计算器使用。键入一个表达式,解释程序就可以输出结果。表达式的写法很直观:+,-,*,/, %, *等算符的作用和其它大多数语言(如Pascal或C)没什么差别,括号可以用来组合。例如:2+24# 这是一个注释. 2+242+2 # 和代码在同一行的注释4(50-5*6)/45# 整数除法得下面的整数. 7/327/-3-3和C中一样,等于号用来给变量赋值,赋值的结果不显示:width = 20height = 5*9width * height900可以同时给几个变量赋同一个值:x = y = z = 0 # 把 x, y 和 z赋零x0y0z0Python完全支持浮点数,混合类型的运算会把整数先转换成浮点数:4 * 2.5 / 3.33.03030303037.0 / 23.5Python也提供了复数,方法是用j和J作为虚数单位,如1+1j,3.14e-10j,等等。3.2. 字符串 Python除处理数字外还可以处理字符串,字符串用单撇号或双撇号包裹:spam eggsspam eggsdoesntdoesntdoesntdoesntYes,he said.Yes,he said.Yes,he said.Yes,he said.Isnt,she said.Isnt,she said.字符串输出格式与输入的样子相同,都是用撇号包裹,撇号和其它特殊字符用用反斜杠转义。如果字符串中有单撇号而没有双撇号则用双撇号包裹,否则应该用单撇号包裹。后面要介绍的print语句可以不带撇号或转义输出字符串。字符串可以用+号连接起来,用*号重复:word = Help + AwordHelpA字符串可以象在C中那样用下标索引,字符串的第一个字符下标为0。Python没有单独的字符数据类型,一个字符就是长度为一的字符串。象在Icon语言中那样,可以用片段(slice)记号来指定子串,片段即用冒号隔开的两个下标。word4Aword0:2Heword2:4lp片段有很好的缺省值:第一下标省略时缺省为零,第二下标省略时缺省为字符串的长度。word:2 # 前两个字符Heword2: # 除前两个字符串外的部分lpA注意s:i + si: 等于 s 是片段运算的一个有用的恒等式。word:2 + word2:HelpAword:3 + word3:HelpA不合理的片段下标可以很好地得到解释:过大的下标被换成字符串长度,上界小于下界时返回空串。word1:100elpAword10:word2:1下标允许为负数,这时从右向左数。例如:word-1 # 最后一个字符Aword-2 # 倒数第二个字符pword-2: # 最后两个字符pAword:-2 # 除最后两个字符外的部分Hel但要注意的是 -0 实际还是 0,所以它不会从右向左数!word-0 # (因为 -0 等于 0)H超出范围的片段下标被截断,但在非片段的情况下不要这样:word-100:HelpAword-10 # 错误Traceback (innermost last):File, line 1IndexError: string index out of range记住片段意义的最好方法是把下标看成是字符之间的点,第一个字符的左边界号码为0。有n个字符的字符串的最后一个字符的右边界下标为n,例如:+-+-+-+-+-+| H | e | l | p | A |+-+-+-+-+-+0 1 2 3 4 5-5 -4 -3 -2 -1第一行数字给出字符串中下标0到5的位置,第二行给出相应的负下标。从i到j的片段由在边界i和j之间的字符组成。对于非负下标,如果下标都在界内,则片段的长度为下标的差。例如,word1:3 的长度为 2。内置函数len()返回字符串的长度:s = supercalifragilisticexpialidociouslen(s)34多行的长字符串也可以用行尾反斜杠续行,续行的行首空白不被忽略,如hello =This is a rather long string containingnseveral lines of text just as you would do in C.nNote that whitespace at the beginning of the line issignificant.nprint hello结果为This is a rather long string containingseveral lines of text just as you would do in C.Note that whitespace at the beginning of the line is significant.对于特别长的字符串(比如包含说明的几段文字),如果用上面的方式每行都用n结尾是很麻烦的,特别是这样无法用象Emacs这样的功能强大的编辑器重新编排。对这种情况,可以使用三重撇号,例如hello =This string is bounded by triple double quotes (3 times).Unescaped newlines in the string are retained, though it is still possiblento use all normal escape sequences.Whitespace at the beginning of a line issignificant. If you need to include three opening quotesyou have to escape at least one of them, e.g. .This string ends in a newline.三重撇号字符串也可以用三个单撇号,没有任何语义差别。多行的字符串常量可以直接连接起来,字符串常量之间用空格分隔则在编译时可以自动连接起来,这样可以把一个长字符串连接起来而不需要牺牲缩进对齐或性能,不象用加号连接需要运算,也不象字符串串内的换行其行首空格需要保持。3.3 列表Python中有几种复合数据类型,用来把其它值组合到一起。其中最灵活的是列表,可以写成在方括号之间用逗号隔开的若干值(项)。列表的项不必取同一类型。a = spam, eggs, 100, 1234aspam, eggs, 100, 1234象字符串下标那样,列表下标从0开始,列表可以取片段,可以连接,等等:a0spama31234a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论