1、Python 程序设计语言 笔记第一周 基本程序设计1. 1 程序设计的基本方法 IPO(输入、输出、 处理(算法)(1)理解问题的计算部分:抽象问题 使用 IPO 从多种方法中选择一种解决问题(2)程序编写步骤: 分析 问题:分析问题的计算部分 确定 问题:将计算部分划分为 IPO 三部分 设计 算法 编写程序 调试测试 升级维护例:温度转换问题【问题描述】对于摄氏度和华氏度,存在以下 转换:气压 结冰点 沸点摄氏度 1 标 准大气 压 0 度 100 度华氏度 1 标 准大气 压 0 度 212 度请利用 python 程序完成以上 转换。【解题步骤】 分析问题的计算部分 简化为三个步骤:
2、 确定功能,利用 IPO 方法进一步分析: 确定 IPO输入:华氏度(F)/ 摄氏度(C) 编写程序处理:温度转化公式 调试程序输出:摄氏度(C)/华氏度(F ) 设计算法 编写程序 测试调试 升级维护1.2 python 程序元素分析程序 1:# TempConvert.pyval = input(“请输入带温度表示符号的温度值( 例如: 32C): “)if val-1 in C,c: # in 判断左侧内容是否在右侧集合中f = 1.8 * float(val0:-1) + 32 # float() 将括号中的字符串转换为浮点数print(“转换后的温度为: %.2fF“%f) # .2
3、 表示输出的浮点数 f 有两位小数elif val-1 in F, f:c = (float(val0:-1) - 32) / 1.8print(“转换后的温度为: %.2fC“%c)else:print(“输入有误“)(1)缩进:标明代码层次关系、表明程序框架(2)注释:辅助说明,不被执行也不受 语法约束,可以写入任何内容,用以提高可 读性注释方法: 单行注释:# 开头; 多行注释: 开头和结尾;(3)变量:能够表示值的一个名称, 值可以变化命名:给自定义元素关联名字的过程(唯一性)命名规则: 大小写字母、数字、下划线(大小写不统一)首字母只能是大小写字母或下划线,不能使用空格 中文等非字母
4、符号也可以作为名字 不能与 python 定义的保留字相同(4)表达式:产生/计算数据值 的一行代码(通过保留字和操作符)(5)空格的使用: 表示每行缩进关系的空格不能改变 空格不能分割命名(6)input()函数:从控制台获得用户的输入。使用方法为:= input()获得的用户输入以字符串的形式保存在中如果 val = “28C”,则 val-1 = “C”,val0:2 = “28” 表示从区间0,2)的一个子字符串可以通过 val0:-1来获取除了最后一个字符以外的字符串(7)分支语句:根据判断条件, 执行不同的路径。使用方法:If elif elif else: (8)赋值:同步赋值:
5、同时给多个变量赋值。使用方法:, = ,例:若要使变量 x 和 y 的值实现交换,则只需一行代码:x, y = y, x(9)print()函数:用来 输出字符信息,或以字符的形式输出变量的值,通过%选择要输出的变量(10)循环语句:控制程序循环运行的语句,根据判断 /计数条件确定循环次数。使用方法:for I in range():函数编写模板(1)input print 模板: (2)initial print 模板: 用户输 入: input() 初始变量:运算需要的初始值 运算部分:算法实现 运算部分:算法实现 结果 输出: print() 结果输出:print()1.3 python
6、 蟒蛇程序的实现 分析:程序 2:import turtle # (乌龟)轨迹描绘函数库def drawSnake(rad,angle,len,neckrad): # 绘制蟒蛇函数for i in range(len):turtle.circle(rad,angle) # 圆形轨迹函数,参数 rad 描述圆形半径的位置turtle.circle(-rad,angle) # rad 为负值,半径在乌龟右侧turtle.circle(rad,angle/2) # 参数 angle 表示乌龟沿圆形爬行的弧度值turtle.fd(rad) # 也称为 turtle.forward()函数# 表示轨 迹
7、直线 移动,参数表示移动距离turtle.circle(neckrad+1,180)turtle.fd(rad*2/3)def main():turtle.setup(1300,800,0,0) # 启动图形窗口,参数分别为窗口的宽度、高度# 窗口左上角点的横、 纵坐标位置pythonsize = 30turtle.pensize(pythonsize) # 轨迹的宽度,参数 为 像素大小,这里为 30turtle.pencolor(“blue“) # 轨迹颜色,参数 为字符串(英文或 16 进制颜色代码)turtle.seth(-40) # 轨迹运动方向,参数为角度(逆时针,以正东方向为 0
8、 度)drawSnake(40,80,5,pythonsize/2) # 绘制蟒蛇函数,用以绘制 python 蟒蛇main()def 定义 函数: 函数是一组代码的集合,用以完成特定的功能,这组代码的名字就叫函数名 def 所定义的函数,必须要通过函数名对函数进行调用才能执行函数库的引用:方式一:import 如:import turtle方式二:from import from import * 调用函数时不需要使用库名,直接使用如:from turtle *fd(100)注意:方式一可调用不同库中的同名函数,方式二 则不可第二周 类型及应用2.1 类型 编程语言对数据的划分数字类型、字符
9、串类型、元组类型列表类型、文件类型、字典类型(1)数字类型:数字类型对 python 语言中的数字的表示和使用进行了定义和规范1 分类: 整数类型 浮点数类型 复数类型 整数 类型概念与数学一致,没有取值范围限制例:1010(十进制数),0x9a (十六进制数,以 0x/0X 开头),0b010(二进制数,以 0b/0B 开头)0o123(八进制数,以 0o/0O 开 头) 浮点数 类型是 带有小数点及小数的数字,数值范围和小数精度有一定限制,因系统而异例:0.0(与整数 0 不同),96e4(科学计数法, e/E 代表 10 的次幂, e/E 后的数字为指数) 复数类型概念与数学一致, z=
10、a+bj(j/J 代表虚数部分)例:12.3+4j对于一个复数,如 z = 1.1+9j,可以使用 z.real 和 z.imag 来获得复数的实部和虚部2 数字类型的关系: 特例 特例整数 浮点数 复数 (范围逐渐扩大) 整数 浮点数 浮点数因此这三种数字类型可以进行混合运算,生成 结果为最宽类 型 例: 3 + 4.2 = 7.23 类型转换:利用 int(), float() 和 complex() 三个函数实现 例:int(4.5) = 4; float(4) = 4.0; complex(4) = 4 + 0j;【注意】不能将复数转成整数和浮点数!(但可以间接利用取实部虚部的方法实现
11、)4 数字类型的判断 type(x); 例:type(4.5) 得到 5 数字类型的运算:运算符和运算函数 操作含义x+y x 与 y 之和x-y x 与 y 之差x*y x 与 y 之积x/y x 与 y 之商x/y 不大于 x 和 y 之商的最大整数x%y x 与 y 之商的余数+x x-x x 的 负值x*y x 的 y 次幂abs(x) x 的绝对值divmod(x,y) (x/y,x%y)pow(x,y) x 的 y 次幂(2)字符串类型 用双引号“”或单引号括起来的一个或多个字符 可以保存在变量中,也可以 单独存在1 判断字符串类型:输入:type(str1) 输出:2 可以使用
12、转义字符输出“”或之类的字符也可以用同样的方法 输出转义字符,n 输出换行符等例:print(“”大家好 ”);输出:”大家好”3 字符串是一个字符序列,字符串最左端位置标示为 0,向右递增,字符串中字符位置的标示称为“索引” ,例如:可以使用单个索引访问字符串的特定位置。格式如下:其中索引可以为常量和表达式4 python 中字符串(设长度为 L)索引从 0 开始,最后一个字符索引为 L-1同时也允许使用负数,对字符串从右至左 进行反向检索,最右索引值为-1可以通过两个索引值来确定一个范围,从而返回 这个范围 内的子字符串。格式如下:,其中 start 和 end 都为整型,索引范围为sta
13、rt, end)程序实例:【题目描述】输入一个月份数字,返回 对应月份名称的缩写【分析】IPO 模式: 输入:输入一个表示月份的数字(1-12) 处理:利用字符串基本操作实现功能 输出:输出数字对应月份名称缩写【解答】程序 3:# month.pymonths=“JanFebMarAprMayJunJulAugSepOctNovDec“n=input(“请输入月份数(1-12):“)pos=(int(n)-1) * 3monthAbbrev=monthspos:pos+3print(“月份简写是“+monthAbbrev+“.“)输入: 输出:7 月份简写是 Jul.(3)元组类型(Tuple
14、) 包含 0 个至多个元素的类型,元素之间用逗号分割例:t1 = 123, 45.6, “hello”; t2 = (); t3 = 12;元组外部可以使用或不使用括号1元组类型的三个特点: 元组中的元素可以是不同类型的,可以嵌套(用括号区分)H e l l o J h o n0 1 2 3 4 5 6 7 8 9 元组中的各个元素存在先后关系,可以通 过索引来访问元组中的元素例:t10; 元组定义后不能更改和删除 安全2 与字符串类型类似,可以通过索引区间来访问元组中的部分元素也可以对元组进行+和*的运算 例:t21:;(4)列表类型( List ) 有序的元素集合1 与元组类似,列表的每个
15、元素类型可以不同,可以通 过索引访问列表的单个元素 例:a = 0,1,2 print(a) 输出:0,1,22 与元组不同,列表的大小没有限制,可以随时修改(5)小结:1 序列(字符串、元组、列表)类型的操作:序列操作符 操作的含义+ 连接两个序列+ 对序列进行整数次重复 索引序列中的元素: 取序列的一个子序列len() 序列中元素个数for in 对序列进行循环列举in 成员检查,判断是否在序列中2 方法,格式如下:.func() 字符串方法:字符串方法 含义.upper() 字符串中字母大写.lower() 字符串中字母小写.strip() 去掉两边空格和指定字符.split() 按指定
16、字符分割字符串为数组.join() 连接两个字符串序列.find() 搜索指定字符串.replace() 字符串替换 列表方法:列表方法 含义.append(x) 将元素 x 增加到列表最后.sort() 将列表元素排序.reverse() 将列表元素反转.index(x) 返回第一次出现元素 x 的索引值.insert(i,x) 在位置 i 处 插入新元素 x.count(x) 返回元素 x 在列表中的数量.remove(x) 删除列表中第一次出现的元素 x.pop(i) 取出列表中位置 i 的元素并删除2.2 math 库和 random 库的使用及实例:(1)math 库:函数 数学表示
17、 含义圆周率 pi 的近似值,15 位小数自然常数 e e e 的近似 值, 15 位小数ceil(x) x 对浮点数向上取整floor(x) x 对浮点数向下取整pow(x,y) x 的 y 次幂log(x) lnx 以 e 为底的对数log10(x) 10 以 10 为底的对数sqrt(x) 平方根exp(x) e 的 x 次幂degrees(x) 弧度转角度radians(x) 角度转弧度sin(x) sinx x 的正弦值cos(x) cosx x 的余弦值tan(x) tanx x 的正切值asin(x) arcsinx x 的反正弦值acos(x) arccosx x 的反余弦值a
18、tan(x) arctanx x 的反正切值x-1.0, 1.0(2)random 库:函数 含义seed(x) 给 随机数一个种子值,默认随机种子是系统时钟random() 生成一个0, 1.0之间 的随机小数uniform(a,b) 生成一个 a 到 b 之间的随机小数randint(a,b) 生成一个 a 到 b 之间的随机整数randrange(a,b,c) 随机生成一个从 a 开始到 b 以 c 递增的数choice() 从列表中随机返回一个元素shuffle() 将列表中元素随机打乱sample(,k) 从指定列表随机获取 k 个元素【注意】seed()函数用来设置随机种子,随机种
19、子相同,随机序列相同 伪随机数实例: 的计算 蒙特卡洛方法(随机抽样/统计实验方法) 先构造 单位正方形和 1/4 圆 向正方形内抛洒大量点 统计落入圆内的点占所有点的比例【分析】IPO: 输入:抛点的数量 处理:对于每个抛洒点, 计算点到圆心的距离通过判断该点在圆内或圆外。 统计圆 内点的数量 输出: 值程序 4:# pi.pyfrom random import randomfrom math import sqrtfrom time import clockDARTS = 1200hits = 0clock()for i in range(1,DARTS): # 抛洒 DARTS 次x,
20、 y = random(), random() # 给出随机坐标 (x,y)dist = sqrt(x*2 + y*2) # 计算抛点到原点的距离if dist 75打印空气污染警告If PM2.5 值 75:print(“Unhealthy. Be careful!“)if PM :【注】是条件表达式, 是一个或多个语句序列先判断条件,若 true,则执行 ,再转向下一条语句;若 false,则直接跳 过, 转向下一条语句(2)简单条件构造 简单条件基本形式 是关系操作符=, , != 使用“=” 表示赋值语句,使用 “=”表示等于 除数字外,字符或字符串也可以按照字典顺序用于条件比较 是布
21、尔表达式,为 bool 类型布尔值的真假以 True 和 False 表示(3)二分支语法结构If :else:程序 6:# quadratic.py# 计算二次方程的实数根程序import mathdef main():print(“This program finds the real solutions to a quadraticn“)a,b,c = eval(input(“Please enter the coefficients(a,b,c): “)delta = b*b - 4*a*cif delta = 0:discRoot = math.sqrt(delta)root1 =
22、(-b + discRoot) / (2*a)root2 = (-b - discRoot) / (2*a)print(“nThe solutions are:“, root1, root2)else:print(“The equation has no real roots!“)main()【运行结果】输出:This program finds the real solutions to a quadratic输入:Please enter the coefficients(a,b,c): 1,2,3The equation has no real roots!3.3 多分支(1)多分支决策
23、要解决双根问题,就需要 对 delta 等于 0 的情况进行处理。语句的结构上要引入嵌套结构: 当 delta 0,处理双根情况一种方案是在程序中使用两个 if-else 语句。把一个复合语句放到另一个语句的结构之中称为嵌套。1. 多分支决策是解决复杂问题的重要手段之一2. 一个三分之决策可以由两个二分支结构嵌套实现3. 使用 if-else 描述多分支决策时,实现更多分支需要更多嵌套,影响程序易读性Python 使用 if-elif-else 描述多分支决策, 简化分支结构的嵌套问题。格式如下:If :elif :elif :else:例:程序 7:# quadratic.pyimport
24、mathdef main():print(“This program finds the real solutions to a quadraticn“)a,b,c = eval(input(“Please enter the coefficients(a,b,c): “)delta = b*b - 4*a*cif a = 0:x = -b/cprint(“nThere is an solution“, x)elif delta except :except :except:else:finally:tryexcept 可以捕捉任何类型的错误对于二次方程,还会有其他可能的 错误如:输入非数值类
25、型(NameError)输入无效的表达式(SyntaxError)等此时可以用一个 try 语句配多个 except 来实现程序 8:# 异常处理测试def main():try:number1,number2 = eval(input(“Enter two numbers,separated by a comma:“)result = number1/number2except ZeroDivisionError:print(“Division by zero!“)except SyntaxError:print(“A comma may be missing in the input“)e
26、lse:print(“No exceptions, the result is“, result)finally:print(“executing the final clause“)main()【运行结果】输出: 输入:Enter two numbers, separated by a comma: 1 2A comma may be missing in the inputexecuting the final clauseEnter two numbers, separated by a comma: 3,2No exceptions, the result is 1.5executin
27、g the final clauseEnter two numbers, separated by a comma: 3,0Division by zero!executing the final clause【实例】三者最大值【IPO】输入:三个数值处理:三者最大算法输出:打印最大值【算法比较】 通盘比较 将每一个值与其他所有值比较 以确定最大值三个值的情况比较简单,如果是五 值比较复杂,而且效率低(因为表达式没有被充分利用) 决策树 避免冗余比较结构更加复杂! 顺序处理 逐个扫描每个值,保留最大者【程序】程序 9:# program: maxn.py# 寻找一组数中的最大值def main
28、():n = eval(input(“How many numbers are there?“)# 将第一个值赋值给 maxmax = eval(input(“Enter a number “)# 连续与后面 n-1 值进行比 较for i in range(n-1):x = eval(input(“Enter a number “)if x max:max = xprint(“The largest value is“, max)main()【运行结果】输出: 输入:How many numbers are there? 5Enter a number 9Enter a number 6En
29、ter a number 3Enter a number 10Enter a number 20The largest value is 20 使用 Python 内置函数 max()3.5 基本循环结构(1)for 循环 Python 可以使用 for 语句循 环遍历整个序列的值格式如下:for in :在 for 循环中,循环变量 var 遍历了队列中的每一个值,循环变量 var 遍历了队列中的每一个值,循环语句体 为每个值执行一次例:for 循环求平均数IPO: 输入:待输入数字个数,数字处理:平均数算法输出:平均数通用设计方案: 输入数字的个数 n 将 sum 初始化为 0 循环 n
30、次:输入数字 x将 x 加入 sum 中 将 sum/n 作为平均数输出出来程序 10:#average1.pyn = eval(input(“How many numbers?“)sum = 0.0for i in range(n):x = eval(input(“Enter a number “)sum = sum + xprint(“nThe average is“, sum/n)【运行结果】输出: 输入:How many numbers? 3Enter a number 5Enter a number 7Enter a number 6The average is 6.0for 循环的
31、缺点:程序开始时必须提供输入数字总数以提供固定循 环次数大规模数字则需要用户数清楚个数为此,Python 提供了另一种循 环模式即无限循 环,不需要提前知道循环次数(2)while 循环, 语句格式:while 条件总是在循环体执行之前被判断, 这种结 构又被称为前测循环(当型循环)如果循环体没有对 i 初始化或循 环体没有累加,条件判断一直为真,循环体将一直执行,即为死循环程序,这时通常使用+C 来终止一个程序(3)break 退出循环例:程序 11:#TestBreak.pysum = 0number = 0while number 100:breakprint(“The number i
32、s“, number)print(“The sum is“, sum)【运行结果】The number is 14The sum is 105(4)continue 用于结束本次循环,即跳出循环体中下面尚未执行的语句,对于 while 循环,继续求解循环条件;对于 for 循环, 继续遍历循环列表continue 语句和 break 语句的区别:continue 语句只结束本次循环,而不终止整个循环的执行,而 break 语句则是直接结束整个循环 流程,不再判断循环条件是否成立(5)循环语句中的 else 当不满足循环条件时,执行该语句3.6 通用循环构造方法(1)交互式循环:交互式循环是无限
33、循环的一种,允 许用户 通过交互的方式重复程序特定部分(2)哨兵循环:执行循环直到遇到特定的值,循 环语句才终 止执行的循环结构设计方法: 设定一个哨兵值作为循环终止的标志 任何值都可以做哨兵,但要与实际数据有所区 别(3)文件循环:面向文件的方法是数据处理的典型应用,可以事先将数据录入到文件,便于编辑修改,python 中采用 readline()方法中的 end of file循环模式(4)循环嵌套:决策和循环互相嵌套可以实现复杂算法,假设数字以逗号分隔出现在文件的同一行上(3)(4)整合程序如图:3.7 死循环和循环嵌套(1)死循环 无法靠自身的控制中止的循环死循环的使用:通过死循环可以
34、一直检测捕捉特定异常(2)后测循环(直到型循环):先接受输入,再判断循 环条件是否 满足。在 Python中没有后测循环语句,但可以通 过 while 和 break 语句间接 实现,如:(3)半路循环 循环判断条件在循环体的中部,例:3.8 布尔表达式条件语句和循环语句都使用布尔表达式作为条件布尔值为真(True)或假(Flase)(1)布尔操作符:and,or ,notand 和 or 用于组合两个布尔表达式,并产生一个布尔结果and or not 运算符计算一个布尔 表达式的反值not (2)布尔操作符的优先级:not and or例:壁球比赛计分:假设 scoreA 和 scoreB
35、代表两个壁球选手的分数规则 1:只要一个选手达到了 15 分,本 场比赛就结束即: scoreA = 15 or scoreB = 15在程序中构造一种循环条件, 对游戏结束条件取反,只要比赛还没有结束游戏就一直进行下去即: while not( scoreA = 15 or scoreB = 15 ) # 比赛继续规则 2:如果一方打了七分而另一方一分未得时,比 赛也结 束即:scoreA = 15 or scoreB = 15 or (a = 7 and b = 0) or (b = 7 and a = 0)需要一个团队赢得至少两分才算赢,即其中一个 队已经达到了 15 分,且分数差异至少
36、为 2 时比赛结束(排球)即:(a = 15 or b = 15) and abs(a-b)=2(3)布尔代数: 布尔表达式遵循特定的代数定律,这些 规律被称为布尔逻辑或布尔代数代数 布尔代数a*0 = 0 a and false = falsea*1 = a a and true = aa+0 = 0 a or false = a 任何数据和 true 进行 or 操作都是真 and 和 or 操作符都符合分配率 not 操作符可负负抵消 德摩根定律:not 放进表达式后, and 和 or 发生变化如:not(a or b) = (not a) and (not b)not(a and b
37、) = (not a) or (not b) 布尔代数的应用 用德摩根定律分析和简化表达式(4)布尔表达式作为决策 判断退出循环条件 对于数字(整数和浮点数)的零值被认为是 false,任何非零值都是 true bool 类 型是特殊的整数 布尔表达式具有短路求值的特性第四周 函数4.1 函数的定义、调用与返回(1)函数定义 def 语句,格式如下:def ():【说明】函数名:任何有效的 Python 标识符参数列表:调用函数时传递给函数的值(个数 = 0,多个参数用”,”分隔)形式参数(形参):定义函数时给函数传递的参数形参只在函数内部有效实际参数(实参):调用函数时给函数传递的参数(可以
38、是实数,变量,函数;必须要初始化)函数体:函数被调用时执行的代 码,由一至多个 语句组成函数调用的一般形式:()函数返回: return 语句 结束函数调用并返回结果 return 语句是可选的,可以出现在函数体的任意位置 若无 return 语句,函数结束后将控制权返回给调用方函数接口 返回值和参数函数传递信息的主要途径: 通过函数返回值的方式传递信息 通过参数传递信息例:打印生日快乐歌歌词程序 4.1.1def happy():print(“Happy birthday to you!“)def sing(person):happy()happy()print(“Happy birthda
39、y to“, person + “!“)def main():sing(“Mike“)print()main()【运行结果】Happy birthday to you!Happy birthday to you!Happy birthday to Mike!(2)函数的调用和返回值 调用过程: 函数的返回值: 函数的返回值可以是变量或表达式三种形式 无返回值,单值 和多值(用逗号分隔)无返回值 等价于 return None(None 是表示没有任何 东西的特殊类型)例:设计两点距离函数,求三角形周 长程序 4.1.2import mathdef square(x):return x*xdef
40、 distance(x1,y1,x2,y2):dist = math.sqrt(square(x1 - x2) + square(y1 - y2)return distdef isTriangle(x1,y1,x2,y2,x3,y3):flag = (x1 - x2) * (y3 - y2) - (x3 - x2) * (y1 - y2) != 0return flagdef main():print(“Please enter (x,y) of three points in turn:“)#获取用户输入的三个坐标点x1, y1 = eval(input(“Point1: (x, y) =
41、“)x2, y2 = eval(input(“Point2: (x, y) = “)x3, y3 = eval(input(“Point3: (x, y) = “)# 判断三个点是否构成三角形if (isTriangle(x1,y1,x2,y2,x3,y3):# 计算三角形周长perim = distance(x1,y1,x2,y2) + distance(x2,y2,x3,y3) + distance(x1,y1,x3,y3)print(“The perimeter of the triangle is : 0:0.2f“.format(perim)else:print(“Kidding m
42、e? This is not a triangle!“)main()【运行结果】Please enter (x,y) of three points in turn:Point1: (x, y) = 1,3Point2: (x, y) = 2,2Point3: (x, y) = 3,4The perimeter of the triangle is : 5.89(3)改变参数值的函数: 函数的形参只接受了实参的值,给形参赋值并不影响实 参 Python 的参数是通过值来传递的(赋值) 如果 变量时 可变对象(如列表) 返回到调用程序后,该对象会呈现被修改后的状态4.2 函数与程序结构/递归(1
43、)函数和程序结构: 函数可以简化程序,使程序模块化 函数可将较长程序分割成短小程序段,提高可 读性(2)递归函数: 递归 函数定义中使用函数自身的方法。例:阶乘 递归的定义特征:1. 有一或多个基例是不需要再次递归的2. 所有的递归链都要以一个基例结尾 注意:1. 递归每次调用都会引起新函数的开始2. 递归有本地值的副本,包括该值的参数3. 阶乘递归函数中:每次函数调用中的相关 n 值在中途的递归链暂时存储,并在函数返回 时使用【例 1】计算 5!程序 4.2.1def fact(n):if n = 0: return 1else:return n * fact(n-1)【例 2】字符串反转P
44、ython 列表有反转的内置方法方法 1:字符转换为字符列表,反 转列表,列表 转换回字符串方法 2:递归【IPO】输入:字符串处理:用递归的方法反转字符串输出:反转后的字符串【注意】 构造 递归函数,需要基例 基例不 进行 递归,否则递归就会无限循环执行程序 4.2.2def reverse(s):if s = “”:return selse:return reverse(s1:) + s04.3 函数实例分析【例】绘制如下图的“二叉树”【思路】(1)首先学习简单图形绘制的指令(2)其次为树的绘制设计算法(1)Turtle 库:turtle.forward(15) # 乌龟沿直线前行 15
45、个单位长度# (默认绘制方向为 x 轴正半轴)turtle.left(90) # 乌龟角度逆时针旋转 90 度(顺时针为 right)turtle.penup() # 乌龟提笔(落笔为 pendown)turtle.goto(x,y) # 乌龟到达指定坐标位置turtle.home() # 乌龟返回初始坐标turtle.circle(r) # 乌龟以 r 为半径画圆turtle.speed(x) # 设置乌龟速度turtle.pensize(x) # 设置画笔粗细turtle.pencolor(str1,str2) # 设置画笔线条颜色和填充色turtle.begin_fill() # 开始填
46、充颜色(完成填充用 end_fill)【例】绘制并填充五角星程序 4.3.1from turtle import Turtlep = Turtle()p.speed(3)p.pensize(5)p.color(“black“, “yellow“)p.begin_fill()for i in range(5):p.forward(200)p.right(144)p.end_fill()(2)代码如下:程序 4.3.2# drawtree.pyfrom turtle import Turtle, mainloopdef tree(plist, l, a, f):if l 5: lst = for
47、p in plist:p.forward(l) # 沿着当前的方向画画q = p.clone()p.left(a) q.right(a)lst.append(p) # 将元素增加到列表的最后lst.append(q)tree(lst, l*f, a, f)def main():p = Turtle()p.color(“green“)p.pensize(5)p.hideturtle()p.speed(100)p.left(90) # 调整画笔p.penup()p.goto(0,-200)p.pendown() # 这三条语句是一个组合相当于先把笔收起来# 再移动到指定位置,再把笔放下开始画# 否
48、则 turtle 一移动就会自动的把线画出来t = tree(p, 200, 65, 0.6375)main()【运行结果】第五周 文件与字典5.1 文件的基础(1)Python 中的字符串类型未编码 使用 encode()编码, decode()解码(2)多行文本:【注意】如果在 shell 中直接输入带有换行符n 的字符串, 则保持原样输出(3)二进制文件:照片、音 乐、 视频、计算机程序等优点: 更加节省空间; 采用二进制无格式存储 更精确; 编码是变长的,灵活利用率高不同的二进制文件,解 码方式不同5.2 文件的基本处理(1)打开文件 open() 建立磁盘上的文件与程序中的对 象相关联通过相关的文件对象获得= open(, )磁盘文件名 打开模式字符表示 打开模式描述r 只读。如果文件不存在,则输出错误w 只写(如果文件不存在,则自动创建文件)a 附加到文件末尾rb 只读二进制文件,如果文件不存在,则输出错误wb 只写二进制文件,如果文件不存在,则自动创建文件ab 附加到二进制文件末尾r+ 读写例:打开“numbers.dat” 文本文件: i