python学习(mooc北京理工大学课程)1-5章
1.python基本语法元素
1.1正式学习前的基础知识
1.1.1计算机的概念
计算机是根据指令操作数据的设备
1)功能性 对数据的操作,表现为数据计算、输入输出处理和结果存储等
2)可编程性 根据一系列指令自动地、可预测地、准确地完成操作者的意图
1.1.2计算机的发展
计算机的发展参照摩尔定律,表现为指数方式
摩尔定律:单位面积集成电路上可容纳晶体管的数量约每两年翻一番
- 计算机硬件所依赖的集成电路规模参照摩尔定律发展
- 计算机运行速度因此也接近几何级数快速增长
- 计算机高效支撑的各类运算功能不断丰富发展
1.1.3程序设计
程序设计是计算机可编程性的体现
- 程序设计,亦称编程,深度应用计算机的主要手段
- 程序设计已经成为当今社会需求量最大的职业技能之一
- 很多岗位都将被计算机程序接管,程序设计将是生存技能
1.1.4程序设计语言
程序设计语言是一种用于交互(交流)的人造语言
- 程序设计语言,亦称编程语言,程序设计的具体实现方式
- 编程语言相比自然语言更简单、更严谨、更精确
- 编程语言主要用于人类和计算机之间的交互
1.1.5编译和解释
编程语言的执行方式
计算机执行源程序的两种方式:编译和解释
- 源代码:采用某种编程语言编写的计算机程序,人类可读
例如:result = 2 + 3
- 目标代码:计算机可直接执行,人类不可读 (专家除外)
例如:11010010 00111011
编译:将源代码一次性转换成目标代码的过程,执行编译过程的程序叫作编译器
解释:将源代码逐条转换成目标代码同时逐条运行的过程,执行解释过程的程序叫作解释器
总结:
- 编译:一次性翻译,之后不再需要源代码(类似英文翻译)
- 解释:每次程序运行时随翻译随执行(类似实时的同声传译)
1.1.6静态语言和脚本语言
根据执行方式不同,编程语言分为两类
- 静态语言:使用编译执行的编程语言 C/C++语言、Java语言
- 脚本语言:使用解释执行的编程语言 Python语言、JavaScript语言、PHP语言
两种语言优点:
- 静态语言:编译器一次性生成目标代码,优化更充分 程序运行速度更快
- 脚本语言:执行程序时需要源代码,维护更灵活 源代码在维护灵活、跨多个操作系统平台
1.2python快速入门
1.2.1温度转换案例
问题:将两种温度体系进行转换
- 摄氏度:中国等世界大多数国家使用 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画
- 华氏度:美国、英国等国家使用 以1标准大气压下水的结冰点为32度,沸点为212度,将温度进行等分刻画
# 温度转化实例 TempStr = input("请输入带符号的温度值:") if TempStr[-1] in ['f', 'F']: C = (eval(TempStr[0:-1]) - 32)/1.8 print("输出的温度为{:.2f}C".format(C)) elif TempStr[-1] in ['c', 'C']: F = 1.8*eval(TempStr[0:-1]) + 32 print("输出的温度为{:.2f}F".format(F)) else: print("输入错误!")
1.2.2程序的格式框架
代码高亮:编程的色彩辅助体系,不是语法要求
缩进:一行代码开始前的空白区域,表达程序的格式框架
- 单层缩进:
- 多层缩进
- 严格明确:缩进是语法的一部分,缩进不正确程序运行错误
- 所属关系:表达代码间包含和层次关系的唯一手段
- 长度一致:(同一层次)程序内一致即可,一般用4个空格或1个TAB
注释:用于提高代码可读性的辅助性文字,不被程序执行的辅助性说明信息
- 单行注释:以#开头,其后内容为注释
例如:# 这里是单行注释
- 多行注释:以'''开头和结尾
例如:''' 这是多行注释第一行
这是多行注释第二行 '''
1.2.3命名与保留字
变量:程序中用于保存和表示数据的占位符号
- 变量采用标识符(名字) 来表示,关联标识符的过程叫命名
例如:TempStr是变量名字
- 可以使用等号(=)向变量赋值或修改值,=被称为赋值符号
例如:TempStr = "82F" #向变量TempStr赋值"82F"
命名:关联标识符的过程
- 命名规则: 大小写字母、数字、下划线和中文等字符及组合
如: TempStr, Python_Great, 这是门Python好课
- 注意事项: 大小写敏感、首字符不能是数字、不与保留字相同
如:Python和python是不同变量,123Python是不合法的
保留字:被编程语言内部定义并保留使用的标识符
- Python语言有35个保留字(也叫关键字 如:if, elif, else, in
- 保留字是编程语言的基本单词,大小写敏感 if 是保留字,If 是变量
- 保留字:
1.2.4数据类型
供计算机程序理解的数据形式
- 程序设计语言不允许存在语法歧义,需要定义数据的形式 需要给10,011,101关联一种计算机可以理解的形式
- 程序设计语言通过一定方式向计算机表达数据的形式 "123"表示文本字符串123,123则表示数字123
1)字符串
由0个或多个字符组成的有序字符序列
- 字符串由一对单引号或一对双引号表示
如:"请输入带有符号的温度值: "或者 'C'
- 字符串是字符的有序序列,可以对其中的字符进行索引
如:"请" 是 "请输入带有符号的温度值: " 的第0个字符
字符串的序号:正向递增序号 和 反向递减序号
字符串的使用:使用[ ]获取字符串中一个或多个字符
- 索引:返回字符串中单个字符 <字符串>[M]
如:"请输入带有符号的温度值: "[0] 或者 TempStr[-1]
- 切片:返回字符串中一段字符子串 <字符串>[M: N] (取序号为M到N-1的字符)
如:"请输入带有符号的温度值: "[1:3] 或者 TempStr[0:-1]
2)数字类型
- 整数:数学中的整数 32 或者 -89
- 浮点数:数学中的实数,带有小数部分 1.8 或者 -1.8 或者 -1.0
3)列表类型
由0个或多个数据组成的有序序列
- 列表使用[ ]表示,采用逗号(,)分隔各元素
['F','f']表示两个元素'F'和'f'
- 使用保留字 in 判断一个元素是否在列表中
TempStr[-1] in ['C','c']判断前者是否与列表中某个元素相同
1.2.5语句和函数
1)赋值语句
由赋值符号构成的一行代码
- 赋值语句用来给变量赋予新的数据值
C=(eval(TempStr[0:-1])-32)/1.8 #右侧运算结果赋给变量C
- 赋值语句右侧的数据类型同时作用于变量
TempStr=input("") #input()返回一个字符串,TempStr也是字符串
2)分支语句
由判断条件决定程序运行方向的语句
- 使用保留字if elif else构成条件判断的分支结构
if TempStr[-1] in ['F','f']:#如果条件为True则执行冒号后语句
- 每个保留字所在行最后存在一个冒号(:),语法的一部分
冒号及后续缩进用来表示后续语句与条件的所属关系
3)函数
根据输入参数产生不同输出的功能过程
- 类似数学中的函数, y = f(x)
print("输入格式错误") #打印输出 "输入格式错误"
- 函数采用 <函数名>(<参数>) 方式使用
eval(TempStr[0:-1]) # TempStr[0:-1]是参数
3.1)输入函数input()
从控制台获得用户输入的函数
- input()函数的使用格式: <变量> = input(<提示信息字符串>)
- 用户输入的信息以字符串类型保存在<变量>中
TempStr = input("请输入") # TempStr保存用户输入的信息
3.2)输出函数print()
以字符形式向控制台输出结果的函数
- print()函数的基本使用格式:
print(<拟输出字符串或字符串变量>)
- 字符串类型的一对引号仅在程序内部使用,输出无引号
print("输入格式错误") # 向控制台输出 输入格式错误
- print()函数的格式化:
{ :.2f }表示将变量C填充到这个位置时取小数点后2位
3.3)评估函数eval()
去掉参数最外侧引号并执行余下语句的函数
- eval()函数的基本使用格式: eval(<字符串或字符串变量>)
案例:
2.Python基本图形绘制
2.1深入理解Python语言
2.1.1计算机技术的演进
计算机技术的演进过程:
2.1.2编程语言的多样初心
各编程语言所处历史时期和使命不同,Python是计算时代演进的选择!
2.1.3python的特点
Python语言是通用语言、脚本语言、开源语言 、跨平台语言、多模型语言
语法简洁仅C语言10%的代码就可实现功能、 有15万第三方库,生态高产
2.1.4编程语言的种类
1)机器语言
- 一种二进制语言,直接使用二进制代码表达指令
- 计算机硬件(CPU)可以直接执行,与具体CPU型号有关
- 完成 2+3 功能的机器语言 11010010 00111011
2)汇编语言
- 一种将二进制代码直接对应助记符的编程语言
- 汇编语言与CPU型号有关,程序不通用,需要汇编器转换
- 完成 2+3 功能的汇编语言 add 2,3,result
3)高级语言
- 更接近自然语言,同时更容易描述计算问题
- 高级语言代码与具体CPU型号无关,编译后运行
- 完成 2+3 功能的高级语言 result = 2 + 3
4)超级语言
- 具有庞大计算生态,可以很容易利用已有代码功能
- 编程思维不再是刀耕火种,而是集成开发
- 完成 2+3 功能的超级语言 result = sum(2,3)
Python: 唯一的"超级语言"!
总结:
超级语言:粘性整合已有程序,具备庞大计算生态
高级语言:接近自然语言,编译器,与CPU型号无关
汇编语言:有助记符,汇编器,与CPU型号有关
机器语言:代码直接执行,与CPU型号有关
2.2 入门实例: Python蟒蛇绘制
#PythonDraw.py import turtle turtle.setup(650, 350, 200, 200)#设置窗体大小和窗体原点桌面窗体原点的距离 turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("purple") turtle.seth(-40) for i in range(4): turtle.circle(40, 80) turtle.circle(-40, 80) turtle.circle(40, 80/2) turtle.fd(40) turtle.circle(16, 180) turtle.fd(40*2/3) turtle.done()
运行结果:
2.3turtle库基本介绍
2.3.1turtle库概述
turtle(海龟)库是turtle绘图体系的Python实现
- turtle绘图体系:1969年诞生,主要用于程序设计入门
- Python语言的标准库之一 -
- 入门级的图形绘制函数库
2.3.2标准库
Python计算生态 = 标准库 + 第三方库
- 标准库:随解释器直接安装到操作系统中的功能模块
- 第三方库:需要经过安装才能使用的功能模块 -
- 库Library、包Package、模块Module,统称模块
2.3.3turtle绘图窗体布局
turtle绘图窗体布局是turtle的一个画布空间,最小单位是像素
函数:turtle.setup(width, height, startx, starty)
setup()设置窗体大小及位置 , 4个参数中后两个可选 (后两个省略时窗体位于正中心),setup()不是必须的(有默认的窗体)
2.3.4turtle空间坐标体系
1)绝对坐标
相关函数:turtle.goto(x, y),以画布中心作为原点(0,0)
案例:
import turtle turtle.goto( 100, 100) turtle.goto( 100,-100) turtle.goto(-100,-100) turtle.goto(-100, 100) turtle.goto(0,0)
输出结果:
2)海归坐标
参照物是海归的头的方向
例子:
2.3.5turtle角度坐标体系
1)绝对角度
更海龟无关,客观存在
相关函数: turtle.seth(angle)
seth()改变海龟行进方向 、angle为绝对度数 ,seth()只改变方向但不行进
2)海龟角度
海龟的左右
案例:
import turtle turtle.left(45) turtle.fd(150) turtle.right(135) turtle.fd(300) turtle.left(135) turtle.fd(150)
输出结果:
2.3.6RGB色彩体系
1)RGB色彩模式
由三种颜色构成的万物色
- RGB指红蓝绿三个通道的颜色组合
- 覆盖视力所能感知的所有颜色
- RGB每色取值范围0-255整数或0-1小数
2)常用RGB色彩
3)turtle的RGB色彩模式
默认采用小数值 可切换为整数值
函数:turtle.colormode(mode)
1.0:RGB小数值模式 , 255:RGB整数值模式
2.4turtle程序语法元素分析
2.4.1库引用与import
1)库引用
扩充Python程序功能的方式 -
- 使用import保留字完成,采用<a>.<b>()编码风格
import <库名>
<库名>.<函数名>(<函数参数>)
2)import更多用法1
使用from和import保留字共同完成
- from <库名> import <函数名>
from <库名> import *
<函数名>(<函数参数>)
例如:
from turtle import * setup(650, 350, 200, 200) penup() fd(-250) pendown() pensize(25) pencolor("purple") seth(-40) for i in range(4): circle(40, 80) circle(-40, 80) circle(40, 80/2) fd(40) circle(16, 180) fd(40 * 2/3) done()
3)两种方法比较
如果程序中自定义的函数名和库中的函数名相同则第一种方法不会出现函数重名问题,第二种方法则会出现
4)import更多用法2
使用import和as保留字共同完成
用法:
import <库名> as <库别名>
<库别名>.<函数名>(<函数参数>)
给调用的外部库关联一个更短、更适合自己的名字
2.4.2turtle画笔控制函数
下面两个函数画笔操作后一直有效,一般成对出
1)turtle.penup()
别名 turtle.pu() ,抬起画笔,海龟将飞行
2)turtle.pendown()
别名 turtle.pd() 落下画笔,海龟将爬行
下面函数画笔设置后一直有效,直至下次重新设置
1)turtle.pensize(width)
别名 turtle.width(width) 画笔宽度,海龟的腰围
2)turtle.pencolor(color)
color为颜色字符串或r,g,b值, 画笔颜色,海龟在涂装
pencolor(color)的color可以有三种形式:
- 颜色字符串 :turtle.pencolor("purple")
- RGB的小数值:turtle.pencolor(0.63, 0.13, 0.94)
- RGB的元组值:turtle.pencolor((0.63,0.13,0.94))
2.4.3turtle运动控制函数
控制海龟行进:走直线 & 走曲线
1)turtle.forward(d)
别名 turtle.fd(d) 向前行进,海龟走直线
- d: 行进距离,可以为负数(负数向后)
2) turtle.circle(r, extent=None)
根据半径r绘制extent角度的弧形
- r: 默认圆心在海龟左侧r距离的位置
- extent: 绘制角度,默认是360度整圆
案例1:
案例2:
2.4.4turtle方向控制函数
控制海龟面对方向: 绝对角度 & 海龟角度
1)turtle.setheading(angle)
别名 turtle.seth(angle),改变行进方向,海龟行走的角度 angle: 行进方向的绝对角度
2)
turtle.left(angle) 海龟向左转
turtle.right(angle) 海龟向右转
angle: 在海龟当前行进方向上旋转的角度,海龟角度
2.4.5 基本循环语句
1)循环语句 : 按照一定次数循环执行一组语句
格式:
for <变量> in range(<次数>):
<被循环执行的语句>
<变量>表示每次循环的计数,0到<次数>-1
案例:
2)range()函数
产生循环计数序列
- range(N) 产生 0 到 N-1的整数序列,共N个
- range(M,N) 产生 M 到 N-1的整数序列,共N-M个
3.基本数据类型
3.1数字类型及操作
3.1.1整数类型
1)与数学中整数的概念一致
- 可正可负,没有取值范围限制
- pow(x,y)函数:计算 xy,想算多大算多大
2)4种进制表示形式
- 十进制:1010, 99, -217
- 二进制,以0b或0B开头:0b010, -0B101
- 八进制,以0o或0O开头:0o123, -0O456
- 十六进制,以0x或0X开头:0x9a, -0X89
3.1.2浮点数类型
1)与数学中实数的概念一致
- 带有小数点及小数的数字
- 浮点数取值范围和小数精度都存在限制,但常规计算可忽略
- 取值范围数量级约-10^307至10^308,精度数量级10^-16
2)浮点数间运算存在不确定尾数,不是bug
原因:
3)因为存在不确定尾数,所以:
>>> 0.1 + 0.2 == 0.3 False
判断是否相等方法:
>>> round(0.1+0.2, 1) == 0.3 True
4)round()函数
round(x, d):对x四舍五入,d是小数截取位数
- 浮点数间运算与比较用round()函数辅助
- 不确定尾数一般发生在10^-16左右,round()十分有效
5)浮点数可以采用科学计数法表示
使用字母e或E作为幂的符号,以10为基数,格式如下:
3.1.3 复数类型
与数学中复数的概念一致
- 定义 j =根号( −𝟏),以此为基础,构建数学体系
- a+bj 被称为复数,其中,a是实部,b是虚部
实例:
3.1.4 数值运算操作符
1)操作符是完成运算的一种符号体系
2)二元操作符有对应的增强赋值操作符
3.1.5数字类型的关系
类型间可进行混合运算,生成结果为"最宽"类型
- 三种类型存在一种逐渐"扩展"或"变宽"的关系:
整数 -> 浮点数 -> 复数
- 例如:123 + 4.0 = 127.0 (整数+浮点数 = 浮点数)
3.1.6 数值运算函数
一些以函数形式提供的数值运算功能
3.2案例,天天向上-工作日努力
#每天都努力0.01 dayfactory1 = 0.01 dayup1 = pow((1+dayfactory1), 365) #工作日努力,其它时间退步0.01 def dayUp(df): dayup = 1 for i in range(365): if i % 7 in [0, 6]: dayup = dayup*(1-0.01) else: dayup = dayup*(1+df) return dayup dayfactory = 0.01 while dayUp(dayfactory) < dayup1: dayfactory += 0.001 print("工作日努力的参数是:{:.3f}".format(dayfactory))
3.3字符串类型及操作
3.3.1字符串类型的表示
1)由0个或多个字符组成的有序字符序列
- 字符串由一对单引号或一对双引号表示
"请输入带有符号的温度值: " 或者 'C'
- 字符串是字符的有序序列,可以对其中的字符进行索引
"请" 是 "请输入带有符号的温度值: " 的第0个字符
2)字符串有 2类共4种 表示方法
- 由一对单引号或双引号表示,仅表示单行字符串
"请输入带有符号的温度值: " 或者 'C'
- 由一对三单引号或三双引号表示,可表示多行字符串(多行注释也是三引号)
''' Python
语言 '''
- 如果希望在字符串中包含双引号或单引号呢?
'这里有个双引号(")' 或者 "这里有个单引号(')"
- 如果希望在字符串中既包括单引号又包括双引号呢?
''' 这里既有单引号(')又有双引号 (") '''
3)字符串的序号
正向递增序号 和 反向递减序号
4)字符串的使用
使用[ ]获取字符串中一个或多个字符
- 索引:返回字符串中单个字符 <字符串>[M]
"请输入带有符号的温度值: "[0] 或者 TempStr[-1]
- 切片:返回字符串中一段字符子串 <字符串>[M: N]
"请输入带有符号的温度值: "[1:3] 或者 TempStr[0:-1]
注意:[ : ]前闭后开,但是Temp[: -1]表示把字符串取完
5)字符串切片高级用法
使用[M: N: K] 根据步长 —K 对字符串切片
- <字符串>[M: N],M缺失表示至开头,N缺失表示至结尾
"〇一二三四五六七八九十"[:3] 结果是 "〇一二"
- <字符串>[M: N: K],根据步长K对字符串切片 ,【 [M:N:K] 中也是前闭后开】
"〇一二三四五六七八九十"[1:8:2] 结果是 "一三五七"
"〇一二三四五六七八九十"[::-1] 结果是 "十九八七六五四三二一〇" 【逆序输出】
6)字符串的特殊字符
转义符 \
- 转义符表达特定字符的本意
"这里有个双引号(\")" 结果为 这里有个双引号(")
- 转义符形成一些组合,表达一些不可打印的含义
"\b"回退 "\n"换行(光标移动到下行首) "\r" 回车(光标移动到本行首)
3.3.2字符串操作符
案例:
- 输入:1-7的整数,表示星期几
- 输出:输入整数对应的星期字符串
- 例如:输入3,输出 星期三
weekstr = "一二三四五六日" weekId = eval(input("请输入【1-7】:")) print("星期"+weekstr[weekId-1])
3.3.3字符串处理函数
1)一些以函数形式提供的字符串处理功
2)Unicode编码
Python字符串的编码方式
- 统一字符编码,即覆盖几乎所有字符的编码方式
- 从0到1114111 (0x10FFFF)空间,每个编码对应一个字符
- Python字符串中每个字符都是Unicode编码字符
案例:
3.3.4字符串处理方法
1)"方法"在编程中是一个专有名词
- "方法"特指<a>.<b>()风格中的函数<b>()
2)一些以方法形式提供的字符串处理功能
3.3.5字符串类型的格式化
1)格式化是对字符串进行格式表达的方式
- 字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
2)槽
3)format()方法的格式控制
槽内部对格式化的配置方式
案例1:
案例2:
4.time库基本介绍
4.1time库的概述
1)time库是Python中处理时间的标准库
- 计算机时间的表达
- 提供获取系统时间并格式化输出功能
- 提供系统级精确计时功能,用于程序性能分析
2)time库包括三类函数
- 时间获取:time() ctime() gmtime()
- 时间格式化:strftime() strptime()
- 程序计时:sleep(), perf_counter()
4.2时间获取
4.3时间格式化
1)strftime(tpl,ts)—将时间以合理的方式展示出来
- 格式化:类似字符串格式化,需要有展示模板
- 展示模板由特定的格式化控制符组成
- strftime()方法
格式化控制符:
时间格式化案例:
2)时间格式化控制函数—供程序使用的函数
4.5程序计时
- 程序计时应用广泛
- 程序计时指测量起止动作所经历时间的过程
- 测量时间:perf_counter()
- 产生时间:sleep() 【休眠】
4.6案例四:文本进度条
1)需求分析
2)单行动态刷新
刷新的关键是 \r
- 刷新的本质是:用之后打印的字符覆盖之前的字符
- 不能换行:print()需要被控制
- 要能回退:打印后光标退回到之前的位置 \r
5.分支结构
5.1程序的分支结构
5.1.1单分支结构
根据判断条件结果而选择不同向前路径的运行方式
5.1.2二分支结构
根据判断条件结果而选择不同向前路径的运行方式
紧凑形式:适用于简单表达式的二分支结构,表达式里面不能有赋值语句
5.1.3多分支结构
-
注意多条件之间的包含关系
-
注意变量取值范围的覆盖
5.1.4条件判断及组合
- 操作符:
- 用于条件组合的三个保留字
5.1.5程序的异常处理
- 举例
- 异常处理的基本使用
程序执行try:里面的语句块1,如果发生异常则执行语句块二,否则不执行
注意:标注异常类型后,仅响应此类异常 异常类型名字等同于变量名
- 异常处理的高级使用
注意:
1)finally对应语句块4一定执行
2)else对应语句块3在不发生异常时执行
5.1.6"身体质量指数BMI"问题分析
BMI = 体重 (kg) / 身高^2 (m^2)
#CalBMI.py height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: ")) bmi = weight / pow(height, 2) print("BMI 数值为:{:.2f}".format(bmi)) who, nat = "", "" if bmi < 18.5: who, nat = "偏瘦", "偏瘦" elif 18.5 <= bmi < 24: who, nat = "正常", "正常" elif 24 <= bmi < 25: who, nat = "正常", "偏胖" elif 25 <= bmi < 28: who, nat = "偏胖", "偏胖" elif 28 <= bmi < 30: who, nat = "偏胖", "肥胖" else: who, nat = "肥胖", "肥胖" print("BMI 指标为:国际'{0}', 国内'{1}'".format(who, nat))
5.2程序的循环结构
5.2.1 遍历循环
遍历某个结构形成的循环运行方式
- 从遍历结构中逐一提取元素,放在循环变量中
- 由保留字for和in组成,完整遍历所有元素后结束
- 每次循环,所获得元素放入循环变量,并执行一次语句块
循环遍历的运用:
1.计数循环
1)range(n)产生0—n-1的数
2)在M—N-1范围内,步长为k取值,K可以省略
2.字符串遍历循环
s是字符串,遍历字符串每个字符,产生循环
3.列表遍历循环
ls是一个列表,遍历其每个元素,产生循环
4.文件遍历循环
fi是一个文件标识符,遍历其每行,产生循环
5.2.2无限循环
由条件控制的循环运行方式
反复执行语句块,直到条件不满足时结束
5.2.3循环控制保留字
1)break跳出并结束当前整个循环,执行循环后的语句
2)continue结束当次循环,继续执行后续次数循环
3)break和continue可以与for和while循环搭配使用
4)对于多层循环,break只跳出当层循环
5.2.4循环的高级用法
循环与else:
1) 当循环没有被break语句退出时,执行else语句块
2)else语句块作为"正常"完成循环的奖励
3)这里else的用法与异常处理中else用法相似
5.3random库基本介绍
random库是产生使用随机数的Python标准库
1)伪随机数: 采用梅森旋转算法生成的(伪)随机序列中元素 【相同的种子,生成的随机数序列是完全相同的
2)random库主要用于生成随机数
3)使用random库: import random
5.3.1random常用库函数:
1)基本随机数函数: seed(), random()
具体实现步骤:
2)扩展随机数函数: randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
5.3.2案例:"圆周率的计算"问题分析
方式1:圆周率的近似计算公式
pi = 0 N = 100 for k in range(N) : pi += 1/pow(16,k)*( \ 4/(8*k+1)-2/(8*k+4) - \ 1/(8*k+5)-1/(8*k+6)) print("圆周率值是: {}".format(pi))
方式2:蒙特卡罗方法(撒点,求概率)
from random import random from time import perf_counter DARTS = 1000*1000*10 hits = 0.0 start = perf_counter() for i in range(1, DARTS+1): x, y = random(), random() dist = pow(x ** 2 + y ** 2, 0.5) if dist <= 1.0: hits = hits + 1 pi = 4 * (hits/DARTS) print("圆周率值是: {}".format(pi)) print("运行时间是: {:.5f}s".format(perf_counter()-start))
6.函数
6.1函数的定义与使用
6.1.1函数的理解与定义
函数是一段代码的表示
1)函数是一段具有特定功能的、可重用的语句组
2)函数是一种功能的抽象,一般函数表达特定功能
3)两个作用:降低编程难度 和 代码复用
格式:
1)函数定义时,所指定的参数是一种占位符
2)函数定义后,如果不经过调用,不会被执行
3)函数定义时,参数是输入、函数体是处理、结果是输出 (IPO)
4)返回值可以是多个,用逗号隔开
6.1.2函数的使用及调用过程
调用是运行函数代码的方式
1)调用时要给出实际参数
2)实际参数替换定义中的参数
3)函数调用后得到返回值
6.1.3函数的参数传递
- 函数可以有参数,也可以没有,但必须保留括号
- 函数定义时可以为某些参数指定默认值,构成可选参数,调用时可以不用传递可选参数,就是省略不写
- 函数定义时可以设计可变数量参数,既不确定参数总数量,可变参数只能有一个,且只能为最后一个参数
- 函数调用时,参数可以按照位置或名称方式传递
6.1.4函数的返回值
函数可以返回0个或多个结果
1)return保留字用来传递返回值
2)函数可以有返回值,也可以没有,可以有return,也可以没有
3)return可以传递0个返回值,也可以传递任意多个返回值
案例:
6.1.5局部变量和全局变量
规则1:基本数据类型,无论是否重名,局部变量与全局变量不同
规则2: 局部变量和全局变量是不同变量
1)局部变量是函数内部的占位符,与全局变量可能重名但不同
2)函数运算结束后,局部变量被释放
3)可以使用global保留字在函数内部使用全局变量
规则3: 局部变量为组合数据类型且未创建,等同于全局变量
6.1.6lambda函数
lambda函数返回函数名作为结果
1)lambda函数是一种匿名函数,即没有名字的函数
2)使用lambda保留字定义,函数名是返回结果 【接受的变量就称为函数变量】
3)lambda函数用于定义简单的、能够在一行内表示的函数
注意:谨慎使用lambda函数
1)lambda函数主要用作一些特定函数或方法的参数
2)lambda函数有一些固定使用方式,建议逐步掌握
3)一般情况,建议使用def定义的普通函数
6.1.6实例7: 七段数码管绘制
基本思路:
步骤1:绘制单个数字对应的数码管
步骤2:获得一串数字,绘制对应的数码管
import turtle def 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, 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.fd(-300) turtle.pensize(5) drawDate('20181010') turtle.hideturtle() turtle.done() main()
步骤3:获得当前系统时间,绘制对应的数码管
import turtle,time def 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, 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.fd(-300) turtle.pensize(5) drawDate(time.strftime('%Y-%m=%d+', time.gmtime())) turtle.hideturtle() turtle.done() main()
6.2代码复用与函数递归
6.2.1代码复用与模块化设计
- 代码复用 ——把代码当成资源进行抽象
1)代码资源化:程序代码是一种用来表达计算的"资源"
2)代码抽象化:使用函数等方法对代码赋予更高级别的定义
3)代码复用:同一份代码在需要时可以被重复使用
函数和对象是代码复用的两种主要形式:
- 模块化设计 ——分而治之
1)通过函数或对象封装将程序划分为模块及模块间的表达
具体包括:主程序、子程序和子程序间关系
2)分而治之:一种分而治之、分层抽象、体系化的设计思想
模块内部紧耦合、模块之间松耦合:
紧耦合:两个部分之间交流很多,无法独立存在
松耦合:两个部分之间交流较少,可以独立存在
6.2.2函数递归的理解
函数定义中调用函数自身的方式
两个关键特征:
1)链条:计算过程存在递归链条
2)基例:存在一个或多个不需要再次递归的基例
说明:递归是数学归纳法思维的编程体现
6.2.3函数递归的调用过程
函数 + 分支语句
1)递归本身是一个函数,需要函数定义方式描述
2)函数内部,采用分支语句对输入参数进行判断
3)基例和链条,分别编写对应代码
6.2.4函数递归实例解析
实例1:将字符串s反转后输出
def rvs(s): if s == "" : return s else : return rvs(s[1:])+s[0]
实例2:斐波那契数列
def f(n): if n == 1 or n == 2 : return 1 else : return f(n-1) + f(n-2)
实例3:汉诺塔
count = 0 def hanoi(n, src, dst, mid): global count if n == 1 : print("{}:{}->{}".format(1,src,dst)) count += 1 else : hanoi(n-1, src, mid, dst) print("{}:{}->{}".format(n,src,dst)) count += 1 hanoi(n-1, mid, dst, src) hanoi(4, "A", "C", "B") print(count)
6.3模块4: PyInstaller库的使用
PyInstaller库是第三方库,将.py源代码转换成无需源代码的可执行文件
安装库命令: (cmd命令行) pip install pyinstaller
简单使用:(cmd命令行) pyinstaller -F <文件名.py>
PyInstaller库常用参数:
例如:pyinstaller –i curve.ico –F SevenDigitsDrawV2.py,注意文件名后缀为.ico
6.4"科赫雪花小包裹"问题分析
科赫曲线,也叫雪花曲线
绘制一边:
import turtle def koch(size, n): if n == 0: turtle.fd(size) else: for angle in [0, 60, -120, 60]: turtle.left(angle) koch(size/3, n-1) def main(): turtle.setup(800, 400) turtle.penup() turtle.goto(-300, -50) turtle.pendown() turtle.pensize(2) koch(600, 3) # 3阶科赫曲线,阶数 turtle.hideturtle() main()
绘制三边:
import turtle def koch(size, n): if n == 0: turtle.fd(size) else: for angle in [0, 60, -120, 60]: turtle.left(angle) koch(size/3, n-1) def main(): turtle.setup(600, 600) turtle.penup() turtle.goto(-200, 100) turtle.pendown() turtle.pensize(2) level = 3 # 3阶科赫雪花,阶数 koch(400, level) turtle.right(120) koch(400, level) turtle.right(120) koch(400, level) turtle.hideturtle() main()