Python语言程序设计_ 函数设计初步_
- 格式:pdf
- 大小:2.57 MB
- 文档页数:32


python程序设计第三版Python程序设计第三版是一本面向初学者和中级程序员的编程教材,它以Python语言为基础,介绍了编程的基本概念、原理和实践技巧。
这本书不仅适合作为大学计算机科学课程的教材,也适合自学者和编程爱好者阅读。
第一章:Python简介Python是一种高级编程语言,以其清晰的语法和代码可读性而闻名。
Python的设计哲学强调代码的简洁性,使得Python代码几乎可以像伪代码一样易于理解。
Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。
第二章:Python环境搭建在开始编程之前,需要安装Python解释器和集成开发环境(IDE)。
常见的Python IDE有PyCharm、VSCode和Eclipse with PyDev插件。
此外,还可以使用Python自带的IDLE进行简单的编程练习。
第三章:基础语法Python的基础语法包括变量声明、数据类型、运算符、控制结构(如if语句、for循环和while循环)等。
本章将详细介绍这些基础语法的使用方法,并提供相应的示例代码。
第四章:数据结构Python提供了丰富的内置数据结构,如列表(list)、元组(tuple)、字典(dict)和集合(set)。
本章将讲解这些数据结构的特点、操作方法以及它们在实际编程中的应用。
第五章:函数函数是编程中实现代码复用的重要手段。
Python中的函数定义、参数传递、返回值以及匿名函数(lambda表达式)的使用都将在本章进行讲解。
第六章:模块和包Python的模块和包机制允许程序员将代码组织成可重用的单元。
本章将介绍如何创建模块、导入模块、使用包以及处理模块和包的依赖关系。
第七章:面向对象编程面向对象编程是一种编程范式,它使用“对象”来设计软件,将数据和处理数据的方法封装在一起。
本章将介绍类和对象的概念、继承、封装和多态性等面向对象编程的基本概念。
第八章:异常处理异常处理是程序设计中处理错误和异常情况的重要机制。
python语⾔程序设计-北京理⼯⼤学-嵩天等课件代码整理1. #TempConvert.py2. TempStr = input("请输⼊带有符号的温度值: ")3. if TempStr[-1] in ['F', 'f']:4. C = (eval(TempStr[0:-1]) - 32)/1.85. print("转换后的温度是{:.2f}C".format(C))6. elif TempStr[-1] in ['C', 'c']:7. F = 1.8*eval(TempStr[0:-1]) + 328. print("转换后的温度是{:.2f}F".format(F))9. else:10. print("输⼊格式错误")1. #PythonDraw.py2. import turtle3. turtle.setup(650, 350, 200, 200)4. turtle.penup()5. turtle.fd(-250)6. turtle.pendown()7. turtle.pensize(25)8. turtle.pencolor("purple")9. turtle.seth(-40)10. for i in range(4):11. turtle.circle(40, 80)12. turtle.circle(-40, 80)13. turtle.circle(40, 80/2)14. turtle.fd(40)15. turtle.circle(16, 180)16. turtle.fd(40 * 2/3)17. turtle.done()天天向上的⼒量第⼀问1. #DayDayUpQ1.py2. dayup = pow(1.001, 365)3. daydown = pow(0.999, 365)4. print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))天天向上的⼒量第⼆问1. #DayDayUpQ2.py2. dayfactor = 0.0053. dayup = pow(1+dayfactor, 365)4. daydown = pow(1-dayfactor, 365)5. print("向上:{:.2f},向下:{:.2f}".format(dayup, daydown))天天向上的⼒量第三问1. #DayDayUpQ3.py2. dayup = 1.03. dayfactor = 0.014. for i in range(365):5. if i % 7 in [6,0]:6. dayup = dayup*(1-dayfactor)7. else:8. dayup = dayup*(1+dayfactor)9. print("⼯作⽇的⼒量:{:.2f} ".format(dayup))天天向上的⼒量第四问1. #DayDayUpQ4.py2. def dayUP(df):3. dayup = 14. for i in range(365):5. if i % 7 in [6,0]:6. dayup = dayup*(1 - 0.01)7. else:8. dayup = dayup*(1 + df)9. return dayup10. dayfactor = 0.0111. while dayUP(dayfactor) < 37.78:12. dayfactor += 0.00113. print("⼯作⽇的努⼒参数是:{:.3f} ".format(dayfactor))⽂本进度条简单的开始1. #TextProBarV1.py2. import time3. scale = 104. print("------执⾏开始------")5. for i in range(scale+1):6. a = '*' * i7. b = '.' * (scale - i)8. c = (i/scale)*1009. print("{:^3.0f}%[{}->{}]".format(c,a,b))10. time.sleep(0.1)11. print("------执⾏结束------")⽂本进度条单⾏动态刷新1. #TextProBarV2.py2. import time3. for i in range(101):4. print("\r{:3}%".format(i), end="")5. time.sleep(0.1)⽂本进度条实例完整效果1. #TextProBarV3.py2. import time3. scale = 504. print("执⾏开始".center(scale//2, "-"))5. start = time.perf_counter()6. for i in range(scale+1):7. a = '*' * i8. b = '.' * (scale - i)9. c = (i/scale)*10010. dur = time.perf_counter() - start11. print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')12. time.sleep(0.1)13. print("\n"+"执⾏结束".center(scale//2,'-'))14.版本11. #CalBMIv1.py2. height, weight = eval(input("请输⼊⾝⾼(⽶)和体重(公⽄)[逗号隔开]: "))3. bmi = weight / pow(height, 2)4. print("BMI 数值为:{:.2f}".format(bmi))5. who = ""6. if bmi < 18.5:7. who = "偏瘦"8. elif 18.5 <= bmi < 25:9. who = "正常"10. elif 25 <= bmi < 30:11. who = "偏胖"12. else:13. who = "肥胖"14. print("BMI 指标为:国际'{0}'".format(who))版本21. #CalBMIv2.py2. height, weight = eval(input("请输⼊⾝⾼(⽶)和体重\(公⽄)[逗号隔开]: "))3. bmi = weight / pow(height, 2)4. print("BMI 数值为:{:.2f}".format(bmi))5. nat = ""6. if bmi < 18.5:7. nat = "偏瘦"8. elif 18.5 <= bmi < 24:9. nat = "正常"10. elif 24 <= bmi < 28:11. nat = "偏胖"12. else:13. nat = "肥胖"14. print("BMI 指标为:国内'{0}'".format(nat))版本31. #CalBMIv3.py2. height, weight = eval(input("请输⼊⾝⾼(⽶)和体重(公⽄)[逗号隔开]: "))3. bmi = weight / pow(height, 2)4. print("BMI 数值为:{:.2f}".format(bmi))5. who, nat = "", ""6. if bmi < 18.5:7. who, nat = "偏瘦", "偏瘦"8. elif 18.5 <= bmi < 24:9. who, nat = "正常", "正常"10. elif 24 <= bmi < 25:11. who, nat = "正常", "偏胖"12. elif 25 <= bmi < 28:13. who, nat = "偏胖", "偏胖"14. elif 28 <= bmi < 30:15. who, nat = "偏胖", "肥胖"16. else:17. who, nat = "肥胖", "肥胖"18. print("BMI 指标为:国际'{0}', 国内'{1}'".format(who, nat))公式法1. #CalPiV1.py2. pi = 03. N = 1004. for k in range(N):5. pi += 1/pow(16,k)*( \6. 4/(8*k+1) - 2/(8*k+4) - \7. 1/(8*k+5) - 1/(8*k+6) )8. print("圆周率值是: {}".format(pi))蒙特卡罗⽅法1. #CalPiV2.py2. from random import random3. from time import perf_counter4. DARTS = 1000*10005. hits = 0.06. start = perf_counter()7. for i in range(1, DARTS+1):8. x, y = random(), random()9. dist = pow(x ** 2 + y ** 2, 0.5)10. if dist <= 1.0:11. hits = hits + 112. pi = 4 * (hits/DARTS)13. print("圆周率值是: {}".format(pi))14. print("运⾏时间是: {:.5f}s".format(perf_counter() - start))第五周可变参数#⼀def fact(n,*b):s = 1for i in range(1,n+1):s *= ifor item in b:s *= itemreturn sprint(fact(10,3,5,8))#⼆函数调⽤时,可以按照位置或名称⽅式传递,函数可以返回0个或多个结果def fact(n,m=1):s = 1for i in range(1,n+1):s *= ireturn s//m,n,mprint(fact(10,5)) #以元组类型返回print(fact(m=5,n=10)) #以元组类型返回a,b,c = fact(10,5) #分别复制给变量,然后返回print(a,b,c)#三globaln,s = 10,100def fact(n):global sfor i in range(1,n+1):s *= ireturn sprint(fact(n),s)#四#局部变量为组合数据类型且未创建,等同于全局变量ls = ["F",'f']def func(a):ls.append(a)returnfunc('C')print(ls)#五#创建局部变量ls = ["F",'f']def func(a):ls = [] #创建了局部变量,在函数运⾏后被释放了,所以函数的运⾏结果是['F', 'f'] ls.append(a)returnfunc('C')print(ls)#六#lambdaf = lambda x,y:x+yprint(f(10, 15))#lambda接受没有参数的函数f = lambda : "lambda函数"print(f())七段数码管版本⼀import turtledef drawLine(draw): #绘制单段数码管turtle.pendown() if draw else turtle.penup()turtle.fd(40)turtle.right(90)def drawDigit(digit): #根据数字绘制七段数码管drawLine(True) if digit in [2,3,4,5,6,7,8,9] else drawLine(False)drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False) drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)drawLine(True) if digit in [0,2,6,8] else drawLine(False)turtle.left(90)drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)turtle.left(180)turtle.penup() #为绘制后续数字确定位置turtle.fd(20) #为绘制后续数字确定位置def drawDate(date): #获得要输出的数字for i in date:drawDigit(eval(i)) #通过eval()函数将数字变为整数def main():turtle.setup(800,350,200,200)turtle.penup()turtle.bk(300) #turtle.fd(-300)turtle.pensize(5)drawDate('20181010')turtle.hideturtle()turtle.done()main()七段数码管版本⼆#SevenDigitsDrawV2.pyimport turtle,timedef drawGap(): #绘制数码管间隔turtle.penup()turtle.fd(5)def drawLine(draw): #绘制单段数码管drawGap()turtle.pendown() if draw else turtle.penup()turtle.fd(40)drawGap()turtle.right(90)def drawDigit(digit): #根据数字绘制七段数码管drawLine(True) if digit in [2,3,4,5,6,7,8,9] else drawLine(False)drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False) drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)drawLine(True) if digit in [0,2,6,8] else drawLine(False)turtle.left(90)drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)turtle.left(180)turtle.penup() #为绘制后续数字确定位置turtle.fd(20) #为绘制后续数字确定位置def drawDate(date): #data为⽇期,格式为 '%Y-%m=%d+'turtle.pencolor("red")for i in date:if i == '-':turtle.write('年',font=("Arial",18,"normal"))turtle.pencolor("green")turtle.fd(40)elif i == '=':turtle.write('⽉',font=("Arial",18,"normal"))turtle.pencolor("blue")turtle.fd(40)elif i == '+':turtle.write('⽇',font=("Arial",18,"normal"))else:drawDigit(eval(i))def main():turtle.setup(800,350,200,200)turtle.penup()turtle.bk(350) #turtle.fd(-300)turtle.pensize(5)# drawDate('2018-10=10+')drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))turtle.hideturtle()turtle.done()main()第六周:基本统计值计算#CalStatisticsV1.pydef getNum():nums = [] #获取⽤户不定长度的输⼊iNumStr = input("请输⼊数字(回撤退出):")while iNumStr != "":nums.append(eval(iNumStr))iNumStr = input("请输⼊数字(回车退出):")return numsdef mean(numbers): #计算平均值s = 0.0for num in numbers:s = s + numreturn s / len(numbers)def dev(numbers,mean): #计算标准差sdev = 0.0for num in numbers:sdev += (num - mean) ** 2return pow(sdev / (len(numbers) - 1),0.5)def median(numbers): #计算中位数sorted(numbers)size = len(numbers)if size % 2 == 0:med = (numbers[size//2-1] + numbers[size//2])/2else:med = numbers[size//2]return medn = getNum()m = mean(n)print("平均值:{},标准差:{:.2},中位数:{}.".format(m,dev(n,m),median(n))) #Hamlet英⽂词频统计#CalHamletV1.pydef getText():txt = open("hamlet.txt","r").read()for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_{|}~':txt = txt.replace(ch," ")return txthamletTxt = getText() #对⽂件进⾏读取,并且对⽂本进⾏规划words = hamletTxt.split() #.split()默认采⽤空格,将字符串中的信息进⾏分割,并且以列表形式返回给变量,words是⼀个列表类型,⾥⾯每个元素是⼀个空格分开的单词counts = {} #⼀个单词和它出现的次数构成的⼀种映射,需要定义字典类型,来表达单词更出现频率之间的对应关系,定义空字典countsfor word in words: #逐⼀从words列表中取出元素,取出之后尝试下这个元素是否在counts中counts[word] = counts.get(word,0) + 1 #⽤get获取字典中每⼀个键对应的值,如果这个键不存在在字典中,我们给出默认值,counts.get(word,0),指的是⽤当前的某⼀个英⽂单词作为键索引字典,如果此英⽂单词在⾥⾯,就返回吃#通过以上两⾏代码,就能够逐⼀遍历列表中的每个元素,并且⽤字典类型去记录每个元素出现的次数items = list(counts.items()) #转换成列表类型items.sort(key=lambda x:x[1],reverse=True) #⽤列表类型的sort⽅法排序,lambda参数⽤来指定在列表中使⽤哪⼀个多元选项的列作为排序列,默认的排序⽅法是从⼩到⼤,reverse=True返回的排序就是从⼤到⼩,排序之后的信息保存for i in range(10): #items中的第⼀个元素就是出现次数最多的元素,⽤for语句将其中的前10个出现最多的单词以及它对应的次数打印出来word,count = items[i]print("{0:<10}{1:>5}".format(word,count))《三国演义》⼈物出场统计(上)#CalThreeKingdomsV1.pyimport jiebatxt = open("threekingdoms.txt","r",encoding="utf-8").read()words = jieba.lcut(txt) #⽤jieba.lcut()进⾏分词处理,形成列表类型的带有所有单词的列表叫做wordscounts = {}for word in words:if len(word) == 1:continueelse:counts[word] = counts.get(word,0) + 1items = list(counts.items()) #转换为列表类型items.sort(key=lambda x:x[1],reverse=True)for i in range(15):word,count = items[i]print("{0:<10}{1:>5}".format(word,count))《三国演义》⼈物出场统计(下)#CalThreeKingdomsV2.pyimport jiebatxt = open("threekingdoms.txt","r",encoding="utf-8").read()excludes = {"将军","却说","荆州","⼆⼈","不可","不能","如此"}words = jieba.lcut(txt) #⽤jieba.lcut()进⾏分词处理,形成列表类型的带有所有单词的列表叫做wordscounts = {}for word in words:if len(word) == 1:continueelif word == "诸葛亮" or word == "孔明⽈":rword = "孔明"elif word == "关公" or word == "云长":rword = "关⽻"elif word == "⽞德" or word == "⽞德⽈":rword = "刘备"elif word == "孟德" or word == "丞相":rword = "曹操"else:rword = wordcounts[rword] = counts.get(rword,0) + 1for word in excludes:del counts[word]items = list(counts.items()) #转换为列表类型items.sort(key=lambda x:x[1],reverse=True)for i in range(10):word,count = items[i]print("{0:<10}{1:>5}".format(word,count))⽂件的逐⾏操作#逐⾏遍历⽂件fname = input("请输⼊要打开的⽂件名称:")fo = open(fname,"r") #fo是⽂件距离for line in fo: #使⽤for in可以实现对⽂件(尤其是⽂本⽂件)逐⾏处理,此即实现了分⾏读⼊逐⾏处理print(line)fo.close()数据的⽂件写⼊fo = open("output.txt","w+")ls = ["中国","法国","美国"]fo.writelines(ls) #写⼊⼀个字符串列表fo.seek(0) #写⼊ls后将指针返回到⽂件的最开始for line in fo:print(line)fo.close()第七周,⾃动轨迹绘制#AutoTraceDraw.pyimport turtle as tt.title("⾃动轨迹绘制")t.setup(800,600,0,0)t.pencolor("red") #设置初始画笔颜⾊t.pensize(5) #设置绘制画笔的粗细#数据读取datals = []f = open("data.txt")for line in f:line = line.replace("\n","") #使⽤.replace将第⼀⾏换⾏符"\n"转换为空字符串,# 去掉换⾏的信息,付给变量line,此时line存储的是我们定义的每⼀⾏数据接⼝的值,# 需要将数据接⼝的值分割处理并且提取其中的信息datals.append(list(map(eval,line.split(",")))) #⽤line.split指定","为分割符# 将这样的⼀个字符串分割成若⼲个字符串,所分割的依据就是",",能够⽣成⼀个列# 表,此列表中每⼀个元素是⼀段字符串,⽤","分割,map()函数的作⽤是将第⼀个# 参数的功能作⽤于每个元素,map()的第⼀个参数是⼀个函数的名字,第⼆个参数# 是⼀个迭代类型f.close()#⾃动绘制for i in range(len(datals)):t.pencolor(datals[i][3],datals[i][4],datals[i][5])t.fd(datals[i][0]) #获取当前这⼀⾏中的第⼀个元素,表⽰⾏进的距离if datals[i][1]: #判断数据接⼝的第⼆列元素,1向右转,0向左转t.right(datals[i][2]) #datals[i][2]表⽰转向⾓度else:t.left(datals[i][2])#wordcloud应⽤实例#1import wordcloudc = wordcloud.WordCloud()c.generate("wordcloud by Python")c.to_file("pywordcloud.png")#2import wordcloudtxt = "life is short,you need python"w = wordcloud.WordCloud( background_color = "white") #⽤wordcloud.WordCloud⽣成词云对象,给出参数background_color w.generate(txt) #⽤.generate()⽅法将⽂本加载到对象中w.to_file("pywcloud.png") #⽤to_file()⽅法将词云输出为png⽂件#3import jiebaimport wordcloudtxt = "程序设计语⾔是计算机能够理解和\识别⽤户操作意图的⼀种交互体系,它按照\特定规则组织计算机指令,使计算机能够⾃\动进⾏各种运算处理。