Python程序设计(卫颜俊 仇国巍 郑义)_第1页
Python程序设计(卫颜俊 仇国巍 郑义)_第2页
Python程序设计(卫颜俊 仇国巍 郑义)_第3页
Python程序设计(卫颜俊 仇国巍 郑义)_第4页
Python程序设计(卫颜俊 仇国巍 郑义)_第5页
已阅读5页,还剩314页未读 继续免费阅读

下载本文档

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

文档简介

Python程序设计(卫颜俊仇国巍郑义)第1章Python入门.ppt第2章数据类型和基本运算.ppt第3章控制结构与异常处理.ppt第4章函数.ppt第5章复杂数据类型.ppt第6章复杂数据类型.ppt第7章面向对象程序设计.ppt第8章图形界面程序设计.ppt第9章数据库程序设计.ppt第10章网络程序设计.ppt全套可编辑PPT幻灯片课件(共10章)第1章Python入门本章内容1.1计算机语言的发展1.2Python简介1.3Python编程环境1.4Python基础西安交通大学计算机教学实验中心31.1计算机语言的发展1机器语言指令指令编码机器语言机器语言程序2.汇编语言指令助记符汇编格式指令汇编语言汇编语言程序、汇编语言源程序、源程序汇编程序汇编目标程序西安交通大学计算机教学实验中心4低级语言机器语言、汇编语言3高级语言高级语言编译执行编译器编译可执行文件解释执行解释西安交通大学计算机教学实验中心51.2Python简介1.Python的特点简单高级面向对象可扩展免费和开源可移植丰富的库丰富的接口西安交通大学计算机教学实验中心62.Python的版本2.X3.X不兼容3.Python语言的实现CPythonJPythonIronPythonPyPy西安交通大学计算机教学实验中心71.3Python编程环境(1)环境搭建编译器下载、文档地址:/版本3.X西安交通大学计算机教学实验中心82.3.1Python编程环境的安装和使用西安交通大学计算机教学实验中心9启动(运行)开始菜单所有程序安装双击文件夹:C:\Python341.使用交互式解释器西安交通大学计算机教学实验中心102.使用Windows命令行命令执行python程序西安交通大学计算机教学实验中心11西安交通大学计算机教学实验中心123.使用集成开发环境编写和执行python程序Windows开始菜单->->Python3.4|>IDLE(Python3.4GUI-64bit)”西安交通大学计算机教学实验中心13File->SaveAs->py02.py注意:扩展名一定写.pyRun->Runmodule(F5)西安交通大学计算机教学实验中心141.4Python基础1.实例新年快乐编写程序,输入<人名1>和<人名2>,在屏幕上显示如下的新年贺卡:西安交通大学计算机教学实验中心152.输入input

输入的基本格式是:input([promt])得到的是一个字符串西安交通大学计算机教学实验中心163.输出print基本格式是:print([objects])print("Yours",name2)西安交通大学计算机教学实验中心17实例2求直角三角形的斜边长度输入直角三角形的两个直角边的长度a、b,求斜边c的长度西安交通大学计算机教学实验中心18数学函数包含在名字叫math的模块中,导入math模块的方法是写:frommathimport*其中的开方的函数是sqrt(),使用格式是:sqrt(x)其中x可以是实数或整数,必须大于等于0。常见数学函数sin()#三角函数cos()、tan()acos#反三角函数asin()、atan(x)atan2(y,x)#y/xsinh#双曲函数cosh、tanhacosh、asinh、atanhexp(x)#e的指数pow(x,y)#指数函数log#自然对数log10#常用对数sqrt()#开方fabs()#绝对值factorial(n)#n的阶乘fmod(x,y)#x%y求余ceil(x)#上取整floor()#下取整trunc#四舍五入degrees(x)#转角度radians()#转弧度e#自然常数pi#圆周率西安交通大学计算机教学实验中心194.标识符标识符是程序中用来表示变量、函数、类、模块和其他对象的名称由字母、数字和下划线“_”组成,第一个字符不能是数字标识符不限长度,但区分大小写西安交通大学计算机教学实验中心205.关键字>>>help() help>keywordshelp>return 西安交通大学计算机教学实验中心216.预定义标识符预定义的内置类、异常、函数等,如float,input,print等dir(__builtins__)可以查看所有的内置异常名和函数名西安交通大学计算机教学实验中心227.保留标识符类_*代表最后的计算结果>>>100+200300>>>_+200500__*__系统定义的函数的名字如__new__()是创建新对象的函数,__init__()是构造函数等西安交通大学计算机教学实验中心238.

Python的语句常量变量运算符表达式语句能表达完整意义的命令形成一条语句=赋值语句一个物理行就是一条语句一行也可以写多条语句,中间用分号隔开一条语句也可分多行来写,用反斜杠(\)表示续行如果数据是元组、列表、字典,数据元素可以分多行书写不需续行符西安交通大学计算机教学实验中心24简单语句符合语句复合语句的构造块必须缩进采用缩进格式标记一组语句不限制空格数量,对齐就行,但一般使用4空格缩进量注释程序中“#”开始的内容为注释空语句西安交通大学计算机教学实验中心259.函数和模块函数是能完成一定功能的有名程序段sqrt(x)模块多个函数及变量的定义可以组成模块,多个模块组成包,多个包组成库模块和函数的使用import模块名模块名.函数名(参数)

模块名.变量名>>>>importmath>>>math.sqrt(2)#>>>math.sin(0.7)#西安交通大学计算机教学实验中心26from...import...from模块名

import函数名或变量名表函数名(参数)>>>frommathimportsqrt,sin>>>sqrt(2)#>>>sin(0.7)#>>>frommathimport*西安交通大学计算机教学实验中心2710.输入和输出输入整数和实数a=int(input("请输入整数"))b=float(input("请输入实数"))输出print("Helloworld")print("z=",z)print("Helloworld");print("Helloworld")print("Helloworld",end='');print("Helloworld")输出的多个项目之间用逗号隔开!有特殊意义的符号都要是英文符号,如运算符,引号,括号等格式西安交通大学计算机教学实验中心28格式输出print("%d%d%d"%(1,2,3))print("%d%d%d"%(1.1,2.5,3.6))print("%e%e%e"%(1.1,2.5,3.6))print("%f%f%f"%(1.1,2.5,3.6))print("%5.2f%5.3f%6.7f"%(1.1,2.5,3.6))print("%10.2f%5.3f%6.7f"%(12345.12345,2.5,3.6))西安交通大学计算机教学实验中心29作业习题1编程题1-4西安交通大学计算机教学实验中心30第2章数据类型和基本运算本章内容2.1常量、变量和对象2.2数据类型2.3运算符2.4内置函数2.5实例西安交通大学计算机教学实验中心322.1常量、变量和对象1.常量常量指在程序的执行过程中不变的量字面量1,2,3,4;1.1,1.2,1.0'abc',"Python"True,False符号常量>>>frommathimport*>>>pi#显示3.141592653589793>>>e#显示2.718281828459045西安交通大学计算机教学实验中心332.对象一切皆对象,1,2,3,a,b,c,

sin(x)对象是某个类型事物的一个具体的实例每一个对象都有一个唯一的身份标识对象的id号>>>id(11)1680123280>>>id("anecdote")55109040对象的类型

>>>type(12)<class'int'>>>>type(1.2)<class'float'>西安交通大学计算机教学实验中心34可变对象不可变对象西安交通大学计算机教学实验中心353.变量指向对象的值的名称就是变量变量是一个标识符,通过等号(=)赋值运算创建西安交通大学计算机教学实验中心36多个变量可以引用同一个对象,一个变量也可以引用不同的对象。引用不同的对象时,id也就不同的id相同,就是相同的对象西安交通大学计算机教学实验中心37Python中的变量不需要声明可以随时赋不同类型的值4.对象和数据的不同数据纯粹是数据,而对象包含属性和功能数据4、3直角边分别是4和3的直角三角形直角边长4、3周长面积位置对象5,a=5对象的方法<变量名>.<方法>(<参数>)西安交通大学计算机教学实验中心38>>>a=5>>>a.bit_length()#显示3>>>a=254>>>a.bit_length()#显示8对象具有属性和方法,不同类型的对象具有的属性和方法是不同的2.2数据类型2.2.1数字类型(数值类型)1.整数类型开头是0X或0x,被认为是十六进制的常量如0x22,表示的数是十进制的34开头是0O或0o,则被认为是八进制的常量如0O22,表示的数是十进制的18开头是0B或0b,则被认为是二进制的常量如0B1101,表示的数是十进制的13标准整型长整型长整型能表示的数的范围是无限的,只与机器的内存有关(Python很容易计算大数的阶乘!!!)西安交通大学计算机教学实验中心392.浮点型表示实数3.14、2.78128、9.08科学记数法<实数>E<整数>1.2E3,1.2E-3E大小写均可IEEE754双精度标准每个浮点数占8个字节西安交通大学计算机教学实验中心403.复数类型表示复数,如3+5j、8-7j、-1.2-6.8j等一个复数至少有虚部>>>1+1j(1+1j)>>>1+2J(1+2j)>>>1+0j(1+0j)>>>(1+2j)*(3+4j)(-5+10j)西安交通大学计算机教学实验中心414.布尔型(bool)即逻辑型,用于表示逻辑判断的结果True---1False---00---False非0–True>>>True+False1西安交通大学计算机教学实验中心425.其他数字类型Decimal类型>>>fromdecimalimportDecimal>>>a=1/3#float>>>b=5/6>>>print(a+b)1.1666666666666667>>>a=Decimal(1)/Decimal(3)#decimal>>>b=Decimal(5)/Decimal(6)>>>print(a+b)1.166666666666666666666666667西安交通大学计算机教学实验中心43分数类型fromfractionsimportFractionFraction(numberator=0,denonminator=1)#通过指定分子、分母创建Fraction(other_fraction)#通过其他分数创建Fraction(float)#通过浮点数创建Fraction(decimal)#通过高精度数创建Fraction(string)#通过字符串创建西安交通大学计算机教学实验中心44>>>fromfractionsimportFraction>>>Fraction(12,48)#结果为:Fraction(1,4)>>>Fraction(1.2)#结果为:Fraction(5404319552844595,4503599627370496)>>>Fraction(1.25)#结果为:Fraction(5,4)>>>Fraction("1.5")#结果为:Fraction(3,2)>>>Fraction("1/5")#结果为:Fraction(1,5)>>>Fraction(Decimal('1.2'))#结果为:Fraction(6,5)>>>a=Fraction(1,3)#a为分数1/3>>>b=Fraction(1,3)#b为分数1/3>>>print(a+b)2/3西安交通大学计算机教学实验中心452.2.2序列类型若干有序的数据不可变序列、可变序列1.字符串写在一对单引号、双引号或三单引号、三双引号之间的符号是字符串类型的数据三引号——三个单引号!!!:'abode'、'2015.2.16'、"scrupulous"、'''diverse'''、"""Xi'sNewYearvisitmarksvillagehomecoming"""西安交通大学计算机教学实验中心46内容中有单引号时可以用双引号,内容中有双引号时可以用单引号。三引号的内容可以分多行书写,而单引号和双引号都不行a="""Xi'sNewYearvisitmarksvillagehomecoming"""print(a)西安交通大学计算机教学实验中心472.元组类型写在一对圆括号中,用逗号隔开的一组数据称为一个元组任意类型的数据(1,2,3)、('zhao','qian','sun','li')(1,2,4,'one','two','three')西安交通大学计算机教学实验中心483.字节序列以"b"开头的字符串b'attentive'字符串转换为字节序列str="abcd字节序列"a=str.encode("utf-8")a=str.encode("gb2312")a=str.encode("gbk") a=str.encode("utf-16") 西安交通大学计算机教学实验中心49

西安交通大学计算机教学实验中心50解码字节序列

解码字节序列str="abcd字节序列"a=str.encode("utf-8")print(a)s=a.decode("utf-8")结果:西安交通大学计算机教学实验中心514.列表在一对方括号中的用逗号隔开的若干数组是一个列表[][1,2,3]["January","February","March"]、[1,2,3,[4,5,6]]可变序列西安交通大学计算机教学实验中心525.字节数组

表示可修改的字节序列bytes生成的字节序列是不可修改的>>>str="abcd字节序列">>>a=bytes(str,"utf-8")>>>a[0]=101???bytearray生成的也是字节序列,但它是可变的>>>str="abcd字节序列">>>a=bytearray(str,"utf-8")>>>a[0]=101#OK西安交通大学计算机教学实验中心532.2.3其他类型1.集合数据类型集合数据类型表示若干数据的集合,集合中的项目没有顺序,且不重复{1,2,3}集合数据是可变的写在frozenset()圆括号中的序列、集合变成不可变集合a=frozenset((1,2,3))西安交通大学计算机教学实验中心542.字典数据类型字典中的每一项数据包括两部分,一个是键,一个是值。{name:"zhangsan",addr:"Xi'an,Shaanxi",tel:"826397"}3.Python一切皆有类型type(对象)

>>>type(123)<class'int'>>>>type([1,2,3])<class'list'>西安交通大学计算机教学实验中心55类型转换a=532b=float(a)s=str(a)d=int(s)a=[1,2,3,4,5]b=list(a)c=tuple(b)d=set(c)西安交通大学计算机教学实验中心562.3运算符运算运算符操作数(运算数、操作对象)一元运算、二元运算符表达式值、变量和操作符的组合运算符优先级结合顺序等号运算符的结合顺序是个例外,它是自右向左结合的西安交通大学计算机教学实验中心57582.3.3运算符1.运算符+ 加a=2- 减b=3* 乘,a*b->6** 幂a**b->8/ 除,2/3->0.66666// 整除,2//3->0% 取模,5%2->1int(x)#对x下取整<< 左移>> 右移& 按位与| 按位或^ 按位异或~ 按位翻转< 小于> 大于<= 小于等于>= 大于等于== 等于!= 不等于a<=b结果Truea>b结果Falsenot 布尔“非”and 布尔“与”or 布尔“或”a<1anda>-1Falsea>0anda<10True关系运算符逻辑运算符算术运算符位运算符赋值运算a=3结果是TrueFalse表达式中的乘号不能省略如2pir应写为2*pi*r比较运算通常比较的是值。在Python中,值相同不一定是同一个对象判断两个变量是否同一个对象使用is或isnot当一个变量参加运算又将运算结果赋值给这个变量时,常使用复合赋值运算符x=x+a写为x+=a;x=x*a写为x*=a西安交通大学计算机教学实验中心592.4内置函数直接使用,不需import>>>int("124")#结果是整数的124>>>ord('A')#结果65>>>chr(66)#结果'B'>>>a=4>>>b=10>>>eval("a+b")#结果14西安交通大学计算机教学实验中心60内置函数西安交通大学计算机教学实验中心612.5实例1.判断4位回文数回文数的判别。用户输入一个4位的整数,如果是回文数显示True,如果不是回文数显示False回文数,就是反过来的数字和正着的数字是相同的西安交通大学计算机教学实验中心622.判断闰年【例2-2】判断闰年。用户输入年份,如果为闰年输出True;如果不是,输出False。判断闰年的规则为:(1)能被4整除且不能被100整除的为闰年。(如2004年是,1900年不是);(2)能被400整除的是闰年。(如2000年是,1900年不是)。西安交通大学计算机教学实验中心633.大小写转化和ASCII值【例2-3】将大写字母转换为小写字符串,并显示ASCII值。输入一个字母,如果是小写,不变,如果是大写,转换为小写,显示转换前后的字符和对应的ASCII值(即使不转换,也要显示这些信息)。西安交通大学计算机教学实验中心64作业习题2编程题3,、4、5、6西安交通大学计算机教学实验中心65第3章控制结构与异常处理本章内容3.1顺序结构3.2分支控制语句3.3循环程序设计3.4异常处理西安交通大学计算机教学实验中心673.1顺序结构最简单的一种程序结构程序按照语句书写的次序自上而下顺序执行西安交通大学计算机教学实验中心683.2分支控制语句1.单分支2.双分支3.多重分支4.分支嵌套西安交通大学计算机教学实验中心693.2.1一路分支

一路分支单分支结构流程图单分支结构if语句格式if<条件表达式>:<if块>西安交通大学计算机教学实验中心703.2.2二路分支

二路分支双分支结构流程图双分支结构if语句格式if<条件表达式>:<if块>else:<else块>西安交通大学计算机教学实验中心713.2.3多路分支

多路分支多路分支结构流程图西安交通大学计算机教学实验中心723.2.3多路分支

多路分支多路分支结构if语句格式if<条件表达式1>:<if块1>elif<条件表达式2>:<if块2>…elif<条件表达式n>:<if块n>else:<else块>

西安交通大学计算机教学实验中心733.2.4分支嵌套

分支嵌套if块,else块中可以有分支语句分支嵌套结构if语句格式示例if<条件表达式1>:if<条件表达式2>:<语句块1>else:<语句块2>else:<语句块3>西安交通大学计算机教学实验中心743.3循环程序设计1.for循环2.while循环3.循环与分支嵌套4.循环中特殊语句1.pass语句2.break语句3.continue语句4.循环中的else分句

西安交通大学计算机教学实验中心753.3.1for循环for循环用来遍历序列对象内的元素,并对每个元素运行循环体。for循环的常用格式:for<variable>inrange(begin,end,step):<循环体>/<语句块>for循环的一般格式:for<变量>in<可迭代对象集合>:<循环体>/<语句块1>else:<语句块2>

西安交通大学计算机教学实验中心763.3.2while循环while循环当不知道重复次数,但知道重复条件时,常用while循环语句。while循环的一般格式:while<循环条件>:<循环体>/<语句块1>else:<语句块2>while循环的流程图:

西安交通大学计算机教学实验中心773.3.3循环和分支的嵌套循环和分支的嵌套在一个循环的循环体中,可以包含另一个循环或分支语句。在分支语句的语句块中,也可以包含另一个分支或循环语句。

西安交通大学计算机教学实验中心783.3.3循环中的特殊语句循环中的特殊语句pass语句pass语句的作用是什么也不做,当对有些情况不做处理时有用。break语句break语句的作用通常是跳出循环,执行循环后面的程序。continue语句continue语句的作用是结束当前的一次循环,继续进入下一次循环。循环的else分句循环的else分句是Python特有的,其作用是捕捉循环的“另一条”出路。

西安交通大学计算机教学实验中心793.4异常处理1.什么是异常?2.异常捕捉3.自定义异常类西安交通大学计算机教学实验中心803.4.1什么是异常?什么是异常?异常是指程序运行错误,或者是出现不希望发生的情况,从而导致程序运行终止的情况。在Python程序中,如果出现异常,而异常对象并未被处理或捕捉,程序就会用自动的回溯,返回一种错误信息,并终止执行。例如:

>>>num#变量没有赋值错误Traceback(mostrecentcalllast):File"<pyshell#4>",line1,in<module>numNameError:name'num'isnotdefined

西安交通大学计算机教学实验中心813.4.2异常捕捉异常捕捉为了防止程序运行中遇到异常,而意外终止,编程时应对可能出现异常进行捕获并处理。在Python程序中,使用try/except:复合语句来实现异常的捕捉。异常捕获与处理的一般格式:

try:<statements1>except<name1>:#捕获异常name1<statements2>else:#无异常<statements3>finally:#不管是否发生异常,保证执行<statements4>

西安交通大学计算机教学实验中心823.4.2异常捕捉异常捕捉按异常类名捕获异常。例如:

exceptZeroDivisionError:#捕捉除零错误的异常一个except语句中可以处理多种异常情况,异常名写在圆括号中用逗号隔开。例如:

except(ValueError,ZeroDivisionError):#捕捉除零与赋值错误的异常如果希望在except语句中访问异常对象本身,就可使用异常实例处理。例如:

except(ValueError,ZeroDivisionError)ase:#捕捉除零与赋值错误的异常,并返回异常对象的实例。

西安交通大学计算机教学实验中心833.4.2异常捕捉异常捕捉如果想捕捉所有异常,可以在except分句中省略任何异常类名。例如:

except:#捕捉所有异常

这样捕捉所有异常是危险的,因为它会隐藏所有程序员未想到并且未做好准备处理的错误。

西安交通大学计算机教学实验中心843.4.3自定义异常类自定义异常有些时候,程序员需要根据自己的需要设置异常。编写一个自定义异常类格式:

classSomeCustomException(Exception):pass抛出异常(引发异常),显式地触发异常,可以使用raise语句。其使用形式如下:

classSomeCustomException(Exception):passtry:

┇raiseSomeCustomException

exceptSomeCustomException:

西安交通大学计算机教学实验中心853.4.3自定义异常类自定义异常assert语句(断言),它是当用户定义的约束条件不满足时触发AssertionError异常,所以assert语句可视为条件式的raise语句。assert语句格式:assert<test>,<data>#The<data>partisoptional

执行效果类似如下的代码。ifnot<test>:raiseAssertionError(<data>)

西安交通大学计算机教学实验中心86第4章函数1.内建函数和库函数函数名功能len()计算一个序列或集合的元素数目abs()计算某个数字绝对值pow(x,y)计算x的y次方min()、max()、sum()计算一些数字的最小值、最大值或它们的和float()、int()将数据转换为浮点数、整数input()、print()输入函数、输出数据chr()将整数(ASCII码)转换为字符ord()将字符转换为整数(ASCII码)reversed()、sorted()对一个序列进行反序、排序id()得到一个对象的唯一标识这些函数都可以直接使用还有些函数包含在一些Python的标准模块中,比如一些数学函数包含在math模块中。>>>importmath>>>math.log(100,10)2.0上面的log函数计算以10为底100的对数。2.自定义函数定义函数的一般格式为:def函数名(<形式参数表>)<函数体>①def为关键字,它和函数名以空格分开。②函数名不应与内建函数或变量重名,不能以数字开头。③形式参数表可以有多个,也可以没有。④函数体所有语句必须相对于第一行缩进。⑤如果函数有返回值,可在函数体内部使用return语句将数据反馈给调用者,其格式为:return

<表达式>#执行此语句后函数结束⑥函数运行结束后,会回到调用此函数的程序段。lambda函数是用单行的表达式定义的函数。定义lambda函数的形式如下:

lambda参数:表达式

函数默认返回表达式的值。可接受多个参数,可包括默认参数,表达式只能有一个。下面的lambda函数实现两个变量相加:>>>g=lambdax,y:x+y>>>g(5,4)93.lambda函数的定义下面的lambda函数使用了默认参数:>>>g=lambdax,y=0,z=0:x+y+z

>>>g(5)54.函数调用格式一般格式为:

函数名(<实际参数表>)在定义函数时函数名后面圆括号中的变量名称叫做“形式参数”,或简称为“形参”;在调用函数时,函数名后面圆括号中的变量名称叫做“实际参数”,或简称为“实参”。5.函数出现的位置作为单独的语句出现。假定函数MyPrint输出Hello,Professor***

MyPrint('Wang')出现在表达式中。mySum是求1-100的和的函数: C=2*mySum(1,100)作为实际参数出现在其他函数中。max函数计算5000和mySum(1,100)结果的最大值:

M=max(5000,mySum(1,100))

6.函数参数传递方式:位置绑定

调用函数时,实际参数的数量、顺序都和形式参数一致,实参和形参从左到右一一对应。下列函数用于输出姓名和年龄:

definfo(name,age,sex):print('name:',name,'age:',age,'sex:',sex)如果按照位置传递参数,就可以这样调用:

info('张三',30,'男')7.函数参数传递方式:关键字绑定调用时在括号内写成“参数名=数值”。比如可以用下面语句调用前面的info函数:

info(age=25,name="王五",sex='男')

这样就将25传递给了age,将"王五"传递给了参数name。

位置绑定参数和关键字绑定参数可以在满足特定条件时混和使用,该条件是:所有关键字绑定参数必须出现在位置绑定参数之后。比如可以这样使用info函数:

info("王五",sex='男',age=23)

8.为形参指定默认值如果调用方没有为该参数传递数值的话,则使用默认值;若要用默认值调用上面函数,直接使用fun()

如果调用该函数的时候为该参数传递了数值的话,则使用传递的值。下列函数为参数arg1、arg2和arg3指定默认值。deffun(arg1=1,arg2=2,arg3=3):print('arg1=',arg1)print('arg2=',arg2)print('arg3=',arg3)如果函数的某个参数指定了默认值,则这个参数后的所有参数都必须指定默认值。例如,下面的定义是合法的

deffun(arg1,arg2=2,arg3=3)deffun(arg1,arg2,arg3=3)

而下面的定义是错误的

deffun(arg1,arg2=2,arg3)8.为形参指定默认值举例:在屏幕上输出m行n列的由某种符号构成的空心矩形。其中m、n及

组成矩形的符号

由用户输入。#在字符界面下输出一个字符矩形defdrawRect(m,n=5,char='*'):foriinrange(0,n): #输出第一行连续n个字符print(char,end="")print() #换行foriinrange(1,m-1): #输出中间m-2行print(char,end="") #输出本行第一个字符,不换行forjinrange(1,n-1):#输出本行n-2个空格print('',end="")print(char) #输出本行最后一个字符,换行foriinrange(0,n): #输出最后一行连续n个字符print(char,end="")print()defmain():drawRect(3)drawRect(n=8,m=3,char='@')main()【运行结果】************@@@@@@@@@@@@@@@@@@9.使用变长参数含有变长参数的函数定义方式是:def函数名(arg1,arg2,…,*tuple_args,**dic_arg)这里的arg1、arg2表示普通的形式参数*tuple_args表示一个元组变长参数,该参数可以接收一组任意长的数据;**dic_arg表示一个字典变长参数,该参数可以接受多个关键字形式的参数,即按照“参数1=数据1,参数2=数据2,……”的形式赋值的参数。元组和字典都是python中的内置数据类型,元组表示为包含在()括号中的一组数据,比如(1,2,'a');而字典可表示为包含在{}括号中若干形式为“key:value”的数据,比如{name:'张三',age:23}。9.使用变长参数假设有下面这样一个函数:defvarArg(arg,other_arg='default',*tuple_arg,**dic_arg):print("无默认值参数:",arg)print("有默认值参数:",other_arg)print("元组变长参数:",tuple_arg)print("字典变长参数:",dic_arg)>>>varArg(1,'second')无默认值参数:1有默认值参数:second元组变长参数:()字典变长参数:{}执行情况一:9.使用变长参数假设有下面这样一个函数:defvarArg(arg,other_arg='default',*tuple_arg,**dic_arg):print("无默认值参数:",arg)print("有默认值参数:",other_arg)print("元组变长参数:",tuple_arg)print("字典变长参数:",dic_arg)>>>varArg(1,'second','a','b','c')无默认值参数:1有默认值参数:second元组变长参数:('a','b','c')字典变长参数:{}执行情况二:9.使用变长参数假设有下面这样一个函数:defvarArg(arg,other_arg='default',*tuple_arg,**dic_arg):print("无默认值参数:",arg)print("有默认值参数:",other_arg)print("元组变长参数:",tuple_arg)print("字典变长参数:",dic_arg)>>>varArg(1,'second',u=1,v=2,w=3)无默认值参数:1有默认值参数:second元组变长参数:()字典变长参数:{'u':1,'v':2,'w':3}执行情况三:9.使用变长参数假设有下面这样一个函数:defvarArg(arg,other_arg='default',*tuple_arg,**dic_arg):print("无默认值参数:",arg)print("有默认值参数:",other_arg)print("元组变长参数:",tuple_arg)print("字典变长参数:",dic_arg)>>>varArg(1,'second','a','b','c',u=1,v=2,w=3)无默认值参数:1有默认值参数:second元组变长参数:('a','b','c')字典变长参数:{'u':1,'v':2,'w':3}执行情况四:函数的return语句可以返回多个数值,比如:【例】编写函数计算三门课分数总和和平均值。defcalc_grade(math,english,chinese):Sum=math+english+chineseAvg=float(Sum/3)returnSum,AvgsumOfGrade,GPA=calc_grade(88,76,85)print('成绩总和:',sumOfGrade)print('平均成绩:',GPA)【运行结果】成绩总和:249平均成绩:83.010.返回多个数值11局部变量和全局变量在一个函数中定义的变量一般只能在该函数内部使用,这种只能在程序的特定部分使用的变量称为局部变量。在一个文件中所有函数之外定义的变量可以供该文件中的任何函数使用,这种变量称为全局变量。下面代码测试变量的局部性和全局性globalInt=9 #定义全局变量defmyAdd():localInt=3#在函数中定义一个局部变量returnglobalInt+localIntprint(myAdd()) #正确输出12print(globalInt) #正确输出9print(localInt) #错误localInt是局部变量由于局部变量localInt只能在函数myAdd()中使用,因此print(localInt)错误。如果定义了一个全局变量,然后又在函数中用同样的名字定义了一个局部变量,那么,在局部变量的作用范围内(也就是该函数内),全局变量不起作用,只有局部变量起作用。比如下列代码:g=9 #定义全局变量deftest():g=3#定义局部变量,并且与全局变量重名print('g=',g)test() #输出g=3print(g) #输出9只要在函数中对某个变量赋值,不论赋值语句在哪个位置,都是在函数中创建了一个局部变量。而任何变量不可能在创建之前被使用,因此下面程序段错误:g=9 #定义全局变量deftest():print('g=',g) #错误,局部变量在赋值前被使用g=3#定义局部变量,且与前面定义的全局变量重名下面的代码也是错误的:g=9 #定义全局变量deftest():g=g+1#错误,局部变量在赋值前被使用12.用global声明全局变量为了在函数中对全局变量进行赋值、修改,需要在函数中声明该变量是全局变量。请看下列代码:g=0 #定义全局变量defbindVar():globalg #在函数中声明g是全局变量g=g+1returngprint(bindVar()) #输出1print('g=',g)#输出g=1将g=0放到语句globalg后面,效果不变关于在函数中与全局变量重名的变量:如果该变量没有在函数中用global声明为全局变量,则:如果在函数内部对该变量进行了赋值操作,此变量就是一个局部变量。其他任何使用该变量的语句一定要在赋值语句之后。如果在函数内部从未对该变量进行赋值操作,那么对于该函数来说,此变量是全局变量。如果该变量在函数中用global语句声明为全局变量,那么无论是否在函数中对其进行了赋值操作,该变量都将作为全局变量。13.内嵌函数及其作用域内嵌函数是在一个函数内部嵌套定义一个或多个函数【例】内嵌函数的例子deff1():x=y=2deff2():y=3print('f2函数内x=',x)print('f2函数内y=',y)f2()print('f1函数内x=',x)print('f1函数内y=',y)f1()【运行结果】f2函数内x=2f2函数内y=3f1函数内x=2f1函数内y=2x是函数f1的变量,同时在函数f2中仍然有效,类似于一个全局变量;函数f2中局部变量y取代了函数f1中的同名变量y。14.递归函数一个函数在内部调用其自身,这个函数就是递归函数。【例】

编程求n!的值,其中n为正整数。当n>1时,求n!的可以转化为求n*(n-1)!的新问题。设函数f(n)=n!,则有f(n)=n*f(n-1)。于是函数f调用了自身(只是参数不同而已)。

所以可以定义阶乘的递归函数形式要计算f(4),根据函数定义计算过程如图所示:==>f(4)==>4*f(3)==>4*(3*f(2))==>4*(3*(2*f(1)))==>4*(3*(2*1))==>4*(3*2)==>4*6==>24f(4)f(4)f(4)f(4)f(4)f(4)f(4)f(3)f(3)f(3)f(3)f(3)f(2)f(2)f(2)f(1)调用调用调用返回1返回2返回6返回24调用编程求n!的值【源程序】deff(n):ifn==1:return1returnn*f(n-1)n=int(input('输入正整数n:'))print('n!=',f(n))【运行结果】输入正整数n:20n!=2432902008176640000使用递归算法需要两个条件:能通过递归调用来缩小问题规模。存在一种简单情境,使递归在简单情境下退出(递归出口)15.递归函数的应用A座B座C座汉诺(Hanoi)塔问题有A、B、C三个基座,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有人想把这64个盘子从A座移到B座,但每次只允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用任何一个基座,请打印移动的步骤。汉诺(Hanoi)塔问题借助B将n个盘从A移到C=借助C将n-1个盘从A移到B借助A将n-1个盘从B移到C将一个盘从A移到Cn>1将一个盘从A移到Cn=1比较等式左右两边相似操作,会发现:1)盘的数量从n变化到n-1,显然n是一个可变的参数2)盘的初始位置是变化的,等式左侧是A,右侧是A或B3)盘的最终位置是变化的,等式左侧是C,右侧是B或C4)同样被借助的位置也是变化的因此,递归函数共有盘数、初始位置、借助位置和最终位置4个变量,因此函数有4个可变参数。#下列函数中,n-盘数、ch1-初始位置、ch2-借助位置、#ch3-最终位置defHanoi(n,ch1,ch2,ch3): ifn==1:#盘子数量为1,打印结果后,不再进行递归print(ch1,'->',ch3)#移动一个盘从ch1到ch3else:#盘子数量大于1,继续进行递归过程Hanoi(n-1,ch1,ch3,ch2)print(ch1,'->',ch3)#移动一个盘从ch1到ch3Hanoi(n-1,ch2,ch1,ch3)Hanoi(3,'A','B','C')【运行结果】A->CA->BC->BA->CB->AB->CA->C有3个盘时函数执行过程Hanoi(2,B,A,C)PrintA->CPrintA->BPrintA->CHanoi(3,A,B,C)Hanoi(1,A,B,C)Hanoi(1,C,A,B)PrintC->BPrintB->APrintA->CHanoi(1,B,C,A)Hanoi(1,A,B,C)PrintB->CHanoi(2,A,C,B)2194356871011191214131715161816结构化设计方法

基本思想是“自顶向下、逐步求精,模块化设计”,采用从大到小,从粗到细,从总体到细节的策略将复杂问题化为简单问题进行求解案例:输出某个月的日历顶层分解结束输出完整日历信息(模块1.1)输入年月(模块1.0)

开始模块1.1输出日历主体(模块2.3)输出日历头部(模块2.0)

1号是星期几?(模块2.1)当月有几天?(模块2.2)第二层分解第5章复杂数据类型西安交通大学计算机教学实验中心仇国巍除了基本的数据类型,在python中还预定义了许多更为复杂的数据类型,包括字符串(Strings)、列表(Lists)、元组(Tuples)、字典(Dictionaries)、集合(Sets)等类型。每种类型都有很多预定义的方法,例如添加元素、删除元素、查找、排序等等。通过使用这些数据类型,可以大大简化编程过程。1.什么是序列序列是指包含若干元素的一个容器,其元素排列是有先后顺序的,元素依次对应下标0、1、2、…,并且可以通过下标访问每个元素。在Python中有六种内建的序列,最常用的三种是字符串、列表、元组。所有序列类型都可以进行某些通用的操作,例如:索引——按下标取值分片——取一部分内容加——连接两个序列乘——重复连接同一个序列检查某个元素是否属于这序列计算序列长度找出最大元素和最小元素操作代码含义xins若x在s中返回True,否则返回Falsexnotins若x不在s中返回True,否则返回Falses+t连接s和t,返回连接后的结果s*n将s重复n次并连接起来,将结果返回s[i]返回s中下标为i的元素(从0开始)s[i:j]截取s中下标从i到j-1的部分s[i:j:k]截取s中下标从i到j-1的部分(间隔为k取元素)len(s)计算s的长度min(s)计算s中最小值(序列可比较大小时有效)max(s)计算s中最大值(序列可比较大小时有效)s.index(x[,i[,j]])在s中下标>=i且下标<j的范围内找x,返回其下标s.count(x)计算x在s中出现次数forxins:

循环体迭代遍历s2.字符串是一个字符序列,可包含字母、数字、标点符号等字符。2.1字符串的创建

字符串可用一对单引号(')或双引号(")来创建。例如:

LetterStr='E' #等价于LetterStr="E" numStr="3.1415“#等价于numStr='3.1415' ChStr='西安市' #汉字字符串,也可用(")定义

若字符串的中带有单引号('),则要用双引号(")创建:

S1="Xi'an"

#串的内容为Xi'an

如果字符串的中有单引号("),则创建时要用单引号('):

S1='Xi"an'

#串的内容为Xi"an>>>S3='Xi\'anJiaotongUniversity.\n\tWangTao2010.10.9'>>>print(S3)Xi'anJiaotongUniversity. WangTao2010.10.9转义字符转义字符表示的字符\''\""\\\\n换行符\tTab键\b退格2.2作为序列操作字符串“字符串名[下标]”形式>>>s='abcdef‘>>>s[0]'a‘>>>s[5]'f‘>>>s[-1] #为倒数第一个元素'f's[i:]

>>>s[2:]'cdef's[:j+1]

>>>s[:3]'abc's[i:j+1]

>>>s[1:4]'bcd's[i:j+1:k] >>>s[1:5:2]'bd'字符串的连接连接字符串用加号,例如:>>>s1='abc'>>>s2='123'>>>s1+s2'abc123'2.2作为序列操作字符串字符串之间比较大小可以用使用'<'、'<='、'>'、'>='、'=='、'!='比较大小。

>>>s1='abc'>>>s2='abxz‘>>>s1>s2False判断某个字符串是当前串的子串使用in或notin,比如:>>>s='abc123'>>>'bc12'insTrue>>>'a123'notinsTrue>>>'a'notinsFalse求串的长度用len()函数求串中的最大字符用max()求串中的最小字符用min()例如:>>>s3='欢迎Jack来中国!'>>>len(s3)10(汉字算一个字符)>>>s1='abc‘>>>max(s1)'c‘>>>min(s1)'a‘字符按各自的ASCII码比较大小遍历字符串每个元素可以用for循环依次访问每个元素,举例:>>>s1='abc‘>>>forchins1: print(ch)abc这里ch依次取s1的每个字符2.2作为序列操作字符串2.3字符串字特有的操作数字与字符串相互转化str()函数可以将数字转化为字符串,比如:>>>N1=3>>>N2=9>>>N1+N212>>>str(N1)+str(N2)'39'转换字符串表示的含义%[m]s将字符串写入宽为m的串%[m]d将整数写入宽为m的串%[m.n]f将实数写入宽为m的串(其中有n位小数)%[.n]e将实数按科学计数法写入串(其中有n位小数)%%将一个百分号写入串常见的数据向字符串转换格式>>>n=62>>>f=5.03>>>s='string'>>>'n=%d,f=%f,s=%s'%(n,f,s)'n=62,f=5.030000,s=string‘>>>'%d%f%s'%(n,f,s)'625.030000string' #将n,f,s写入结果串,中间有一个空格>>>'%10d%10f%10s'%(n,f,s)'625.030000string'#将变量写入,各占10个字符宽>>>'%-10d%-10f%-10s'%(n,f,s)'625.030000string'#将变量左对齐写入,各占10个字符宽>>>'%-10d%-7.2f%-10s'%(n,f,s)'625.03string'#f的值占7个字符宽(含2位小数)2.3字符串字特有的操作2.4字符串本身的函数子串查找与替换函数str.find(sub)

在str中从左向右查找子串sub,若找到则返回找到的第一个子串在str中的起始位置的下标;若没有找到返回-1。str.rfind(sub)

在str中从右向左查找子串sub,若找到则返回找到的第一个子串在str中的下标;若没有找到返回-1。str.replace(old,new)

返回一个新串,其中在原串中为old的子串被子串new取代。

>>>s="WelcometoXi'an“ >>>s.find('Xi\'an') 11 >>>s.rfind("Xi'an") 11 >>>s.replace("Xi'an",'Beijing') #这里s本身没改变 'WelcometoBeijing‘ >>>s.rfind("Beijing") -1查找子串的位置

使用index()函数:>>>s='Beijing'>>>s.index('ing')4

2.4字符串本身的函数统计元素出现次数用count()统计:>>>s='abc123abc'>>>s.count('abc')2裁掉特定字符str.lstrip([chars])从左向右去除str中包含于[chars]中的字符,遇到不属于[chars]中字符停止str.rstrip([chars])从右向左去除str中包含于[chars]中的字符,遇到不属于[chars]中字符为止str.strip([chars])从两侧向中间去除str中包含于[chars]中的字符。>>>''.lstrip('cmowz.')''>>>''.rstrip('cmowz.')'www.example'>>>''.strip('cmowz.')'example'2.4字符串本身的函数分割字符串成若干子串 str.split(sep)

该函数用字符串sep将原始串str分解为若干子串,将这些子串合并为列表返回>>>s='Jack@'>>>s.split('@') #以@做分隔符['Jack','']>>>'1<>2<>3'.split('<>')#以'<>'分隔['1','2','3']>>>"20110121王强80\n90\t78".split()['20110121','王强','80','90','78']字符串大小写相关函数在python中,下列函数与字符的大小写转换有关:str.lower() 将str所有字符转换为小写str.upper() 将str所有字符转换为大写str.swapcase()

将str所有字符大小写互换str.capitalize() 将str的首字母大写str.islower() 若str中字母都是小写,则返回True,否则返回Falsestr.isupper() 若str中字母都是大写,则返回True,否则返回False【例5-2】输入两个字符串,求两个字符串共有的最长子串。所谓子串是原字符串中的一段连续的字符。defmain():s1=input("字符串1:")s2=input("字符串2:")r="" #r存放最长的公共子串m=0 #m为最长的子串的长度foriinrange(0,len(s2)):forjinrange(i+1,len(s2)+1):ifs2[i:j]ins1andm<j-i:r=s2[i:j]m=j-i #设m为新的子串的长度print("最长共有的子串:",r)main()【运行结果】字符串1:ThesecretarytoldmethatMrHarmswouldseeme字符串2:TomHarmsJacksecretary最长共有的子串:secretary3列表和元组列表是包含多个元素的序列,其元素位置固定,可以是数字、字符、字符串等任何一种数据类型,甚至是另一个列表、元组等等。元组的结构和列表一样,它

温馨提示

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

最新文档

评论

0/150

提交评论