Python语言程序设计
第一周 Python基本语法元素
- 程序设计基本方法
- 编译和解释:
编译:将源代码一次性转换为目标代码的过程
解释:将源代码逐条的转换为目标代码同时逐条运行的过程,执行解释过程的程序叫做解释器。 - 根据执行方式不同编程语言分为两类:
静态语言(使用编译执行的语言):C,C++,JAVA
脚本语言(使用解释器执行的语言):python,PHP,JS
比较:静态语言一次性生成目标代码,优化更充分,程序运行更快;
脚本语言维护更灵活。 - 程序的基本编写方法:IPO方法,即输入,处理,输出
- Python开发环境配置
- 温度转换:
代码:
#TemperConvert
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("输入格式错误。")
语法元素分析:
- 缩进:表达程序的格式框架
缩进是语法的一部分,缩进不正确可能导致程序运行错误,缩进是表达代码间层次和关系的唯一手段。要求单一程序内缩进长度相同。 - 注释:单行注释用“#”开头;多行注释用“ ‘’’ ”开头和结尾。
- 命名与保留字:
字符串用单引号和双引号都可以
字符串的序号包含两种:正向递增序号(从0开始)和反向递减序号(从-1开始),可用于索引和切片 - 列表类型:
使用保留字in判断元素是否在列表中 - 赋值语句:
右侧的数据类型同时作用于变量,如input()返回字符串类型,所以Tempstr也是字符串类型 - 输入输出:
输入函数input():从控制台获得用户输入的函数。
变量=input(<提示字符串>)
输出函数print():
print函数的格式化:print("转换后的温度是:{:.2f}F".format(F))
{ }表示槽后续变量(.format()中的变量)填充到槽中,.2f表示浮点类型保留两位数字 - 评估函数eval(): 去掉字符串外面的引号并执行余下的函数
eval(<字符串或字符串变量>)
例如:eval(“1”) 输出结果为1
eval(“1+2”) 输出结果为3
eval(’ “1+2” ‘) 输出 ‘1+2’
eval(’ print(“Hello”) ') 输出 Hello
- 编程练习
第二周 python基本图形绘制
- 深入理解python语言
计算机技术的演进
编程语言的多样初心
python语言的特点
“超级语言”的诞生
- 计算机技术的演进:
计算机系统结构时代1946-1981 解决计算能力问题
网络和视窗时代1981-2008 交互问题
复杂信息系统时代2008-2016 数据问题
人工智能时代2016- 人类的问题 - 编程语言的多样初心
c语言:
主要学习指针、内存、数据类型;
语言本质:理解计算机结构
解决问题:性能
JAVA语言:
学习内容:对象、跨平台、运行时
语言本质:理解主客体关系
解决问题:跨平台
适用对象:软件类专业
C++
学习内容:对象、多台、集成
语言本质:理解主客体关系
解决问题:大规模程序
适用对象:计算机类专业
VB
学习内容:对象、按钮、文本框
语言本质:理解交互逻辑
解决问题:桌面应用
python
学习内容:编程逻辑、第三方库
语言本质:理解问题求解
解决问题:各类问题 - python语言的特点
- 通用性是最大的特点
- python特点与优势:
- 语法简洁:
强制可读性
较少的底层语法元素
多种编程方式
支持中文字符
C代码量的10% - 生态高产:
有超过13万的第三方库
- 语法简洁:
- 如何看待python语言
- C/C++:python归python,C归C
- JAVA:针对特定开发岗位和需求
- HTML/CSS/JS:不可替代的前端技术
- 其他语言:R/Go、Matlab等,特定领域
- “超级语言“的诞生
机器语言:代码直接执行,与CPU型号有关
汇编语言:有助记符,汇编器,与CPU型号有关
高级语言:接近自然语言,编译器,与CPU型号无关
超级语言:粘性整合已有程序,具备庞大计算生态- 超级语言:
具有庞大的计算生态,可以很容易利用已有代码功能
编程思维不再是刀耕火种,而是集成开发
完成2+3功能的高级语言:result=sum(2+3)
python是目前唯一的超级语言
- 超级语言:
- 总结:
相比较于其他的语言,python语言的特点在于通用性,简洁性和生态性。python语言并不关注具体函数功能的实现以及与计算机底层的接口,存储等问题(这部分问题C语言更擅长处理),而是关注于问题的抽象与求解本身。python语言具有庞大的计算生态,很容易利用已有的代码功能,是目前唯一的超级语言。
- python蟒蛇绘制
- 蟒蛇绘制代码:
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()
- 模块1:turtle库的使用
turtle库基本介绍
turtle库绘图窗体布局
turtle空间坐标体系
turtle角度坐标体系
RGB色彩体系
- turtle库基本介绍
入门图形绘制函数库,标准库 - turtle库绘图窗体布局
turtle.setup(width,height,startx,starty) 设置窗体大小及位置,4个参数中后两个可选,setup()不是必须的 - turtle空间坐标体系
包含绝对坐标和海龟坐标
turtle.goto(x, y)
海龟坐标:
turtle.fd(d) 向海龟的正前方向运行
turtle.bk(d) 向海龟的后方向运行
turtle.circle(r,angle) 以海龟左侧某一点为圆心画圆 - turtle角度坐标体系
绝对角度:
turtle.seth(angle) 改变海龟行进方向,只改变行进方向但不前进
海龟角度:
turtle.left(angle)
turtle.right(angle) - RGB色彩体系
由三种颜色通道组合构成所有颜色
RGB每色取值0-255或者0-1
默认采用小数值:turtle.colormode(mode) mode取1.0 或255
- turtle库语法元素分析
- 库引用与import
- 库引用:
使用import保留字,采用 a . b ( ) 编码风格 - 使用 from 库 import * 或者from 库 import 函数 可以直接使用库中的函数
- import 库名 as 别名 给调用的外部库关联一个更短、更适合自己的名字
- 库引用:
- 画笔控制函数:
- turtle.penup() 抬起画笔,海龟在飞行,不画东西
- turtle.pendown() 落下画笔,海龟在爬行
- turtle.pensize()别名turtle.width() 画笔宽度,海龟腰围
- turtle.pencolor(color) color 为颜色字符或者r, g, b值 海龟颜色,海龟涂装
- 运动控制函数:控制海龟走直线&走曲线
- turtle.fd(d)或turtle.forward(d) d为行进距离,可以为负数
- turtle.circle(r,angle)
- 方向控制函数
- turtle.seth(angle)或者turtle.setheading(angle)
- turtle.left(angle)
turtle.right(angle)
- 循环语句:
- for <变量> in range ( < 参数 > ) 表示从0到参数-1循环
- range( N )函数 产生从0到N-1的整数序列,共N个
range( M, N )函数,产生从M开始到N-1的整数序列
# 第三周 基本数据类型
- 数字类型及操作
- 整数类型:与数学中整数概念一致,有正有负,取值无穷大
- pow(x,y) 计算x的y次幂
- 四种进制表示形式:
十进制正常
二进制以0b或者0B开头,如:-0B101
八进制以0o或者0O开头,如:0o123
十六进制以0x或者0X开头,如:0X12a
- 浮点数:与数学中的实数概念一致,带有小数,数位有限制
- 浮点数运算存在不确定的尾数:
原因:计算机采用53位二进制表示小数部分,二进制表示小数可以无限接近但不能完全相同。
解决:浮点数间进行运算并需要比较时需用:round( x, d ) 对x进行四舍五入,d为小数截取位数
- 浮点数运算存在不确定的尾数:
>>>0.1+0.2
0.300000000004
>>>0.1+0.2 == 0.3
false
#解决方法
>>> round(0.1+0.2, 1) == 0.3
true
- 浮点数可以采用科学计数法表示:e,E
- 复数类型:
- z = 1.23e-4 + 5.6e + 89j
用 z.rael 获得实部,用 z.imag 获得虚部
- z = 1.23e-4 + 5.6e + 89j
- 数值运算操作符:
- x // y 整数除 10 // 3 结果是 3
- x % y 取余
- x ** y 幂运算(开方运算)
- 数值运算函数:
- abs( ) 取绝对值
- divmod( x, y ) 商余 如: divmod( 10, 3 ) 输出(3,1)
- max(x1,x2,… ,xn)取最大值
- min(x1,x2,… ,xn)取最小值
- int(x)将 x 转换为 int 类型,如:int(“123”)结果为整数123
- float(x)将 x 转换为 float 类型,如:float(“1.23”)结果为浮点数1.23
- complex(x)将 x 转换为复数
- 实例 3 :天天向上的力量
- 字符串类型及操作
- 字符串有两类四种表示方式:
用一对单引号或双引号表示一行字符串
用一对三单引号或三双引号表示多行字符串
思考:如果想在字符串中包含单引号或者双引号怎么办?
用单引号包含双引号或用双引号包含单引号
如果希望在字符串中既包含单引号又包含双引号?
用三个单引号包含 - 字符串切片高级操作
string[ M, N, K ] 左闭右开,步长为K
逆序字符串,string[ ::-1] - 字符串中的转义字符
转义符表达特定字符的本意 - 字符串操作符
- x + y :字符串连接
- x * n 或者 n* x :复制n次字符串
- x in s :如果 x 是 s 的子串,则返回 true ,否则返回 false
- 字符串处理函数
- len( ) 返回字符串的长度
- str( ) 将任意类型转化为字符串类型 如:str( [1, 2] ) 结果为 " [1, 2] "
- hex( ) 或者 oct( ) 将整数转换为其对应的十六进制、八进制小写字符串
hex( 425 ) 结果为0x1a9 oct( 425 ) 结果为0o651 - chr( u ):u为Unicode编码,返回其对应的字符
- ord( x ) :x为字符,返回其对应的Unicode编码
Unicode编码方式:统一字符编码,几乎覆盖所有字符
- 字符串处理方法
方法在编程中也是一个特有名词,特指 a.b( ) 风格中的函数 b( ),字符串及变量也是a,存在一些方法- str.lower( ) 返回字符串的副本,字符全小写
- str.upper( ) 返回字符串的副本,字符全大写
- str.split( sep ) 返回一个列表,由 str 根据 sep 分割的部分组成
- str.count( sub ) 返回子串 sub 在字符串中出现的次数
- str.replace( old, new ) 返回字符串副本,所有 old 子串被替换为 new
- str.center( width, [ fillchar ] ) 字符串根据宽度 width 居中,剩余部分由fillchar填充
- str.strip( chars ) 从字符串中两侧去掉 chars 中列出的字符串
- str.join( iter ) 在 iter 字符串中除最后一个元素外,每个元素后面增加一个str字符串
如:",".join( ‘12345’ ) 结果为: 1,2,3,4,5
- 字符串类型的格式化
为了规范字符串的输出需要对其进行格式化,用 .format( ) 函数
<模板字符串>.format(< 逗号分隔的参数 >)- 槽:
- 槽:
- 模块二:time库的使用
-
time库基本介绍
time库是python中处理时间的基本库,他可以:- 计算机时间的表达
- 提供获取系统时间并格式化输出的功能
- 提供系统级的精确计时功能,用于程序性能分析
- 时间获取:time(),ctime(),gmtime()
- 时间格式化:strptime(),strftime()
- 程序计时:sleep(),perf_counter()
-
time库的使用:
- time.time() 获取计算机内部时间值,返回浮点数
- time.ctime()获取当前时间并以易读形式返回,返回字符串
- time.gmtime()获取当前时间并以结构体形式返回,以供后续处理操作
-
时间格式化:将时间以合适的形式展示出来
- 展示模板由特定的格式化字符组成
- 由time.strftime()实现
- 时间格式化的控制符
- time.strptime()将一段字符串解析成时间变量:
-
程序计时应用:指测量起止动作所经历的时间过程
- 测量时间:time.perf_counter()
- 产生时间:time.sleep() 让程序休眠
- 测量时间:time.perf_counter()
- 实例4:文本进度条
- 文本进度条:
分析:(1) 采用字符串方式打印可动态变化的进度条,需要能在一行中逐渐变化
(2) 采用sleep()模拟一个持续的进度 - 简单的开始
#TextProBarV1.py
import time
scale = 10
print("------执行开始------")
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
print("{:^3.0f}%[{}->{}]".format(c,a,b))
time.sleep(0.1)
print("------执行结束------")
- 单行动态刷新
- 刷新的本质是用后打印的字符覆盖之前打印的字符
- 不能换行,print需要被控制
- 要能回退,输出后光标移动到输出前的位置“\r”
#TextProBarV2.py
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
== 注意:print( “\r”.format( ), end = “” )正常情况下print输出后会自动在后面加上换行符,但是这里我们通过让end为空取消了,此外,我们通过\r使得每次打印前光标在行首==
- 文本进度条实例完整效果:
#TextProBarV3.py
import time
scale = 50
print("执行开始".center(scale//2, "-"))
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"执行结束".center(scale//2,'-'))
第四周 程序的控制结构
- 紧凑形式:注意此时 if 和 else 对应的是表达式,而不是语句
- 异常处理:
- 获取多个输入
height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
- 字符串遍历循环:for c in s:
- 列表遍历循环: for item in list:
- 文件遍历循环:for line in fi:(fi是文件标识符,遍历每行)
- 循环的拓展:循环与else 语句
- 模块三:random库的使用:
- 蒙特卡罗方法求圆周率:
#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000*1000
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))
第五周 函数和代码复用
- 字符串反转:
- 汉诺塔
- 分析:只需要关心最简单情况(基例)和从n-1到n情况(链条)即可
最简单情况:n=1
从n-1到n情况:先把n-1个挪到中间柱子上,再把第n个挪到目标柱子上,最后把n-1个挪到目标柱子上
- 分析:只需要关心最简单情况(基例)和从n-1到n情况(链条)即可
- 模块4:PyInstaller库的使用
- PyInstaller库概述:
- 将.py源代码转换为无需源代码的可执行文件
- 安装第三方库需要pip工具
(cmd)中:pip install pyinstaller