一、Python基本语法元素
1.1 Python程序语法元素分析
python的格式框架
- 缩进:严格明确、所属关系、长度一致
- 注释:单行注释:#、多行注释:’’’
命名与保留字
- 变量:保存和表示数据的占位符号
- 命名:大小写字母、数字、下划线、汉字等字符及其组合
- #大小写敏感、首字符不能使数字、不能用保留字
- 保留字:and, elif, import, raise, global, as, else, in, return, nonlocal, assert, except, is, try, True, break, finally,== lambda==, while, False, class, for, not, with, None, continue, from, or, yield, def, if, pass, del
数据类型
- 字符串、整数、浮点数、列表
语句和函数
- 赋值语句
- 分支语句
- 函数
输入与输出
- 输入函数:input(<提示信息字符串>)
- 输出函数:print()
- 格式化输出print("{:.2f}".format©)
- eval()去掉参数最外侧引号并执行余下语句
二、Python基本图形绘制
2.1 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, 40)
turtle.fd(40)
turtle.circle(16, 100)
turtle.fd(40 * 2 / 3)
turtle.done()
2.2 Turtle库的基本使用
绘图窗体布局
turtle.setup(width, height, starts, starty)
#后两个参数可选 可为0,0
#setup函数不是必须的
空间坐标体系
turtle.goto(x, y)
turtle.fd(d) #前
turtle.bk(d) #后
turtle.circle(r, angle)
角度坐标体系
turtle.seth(angle) #改变角度(绝对角度)
turtle.left(angle)
turtle.right(angle)
RGB色彩体系
- white 255 255 255 , 1 1 1
- yellow 255 255 0 , 1 1 0
- ……
turtle.colormode(mode)
- #1.0
- #255
2.3 Turtle 程序语法元素分析
库引用与import
from <库> import <函数名>
from <库> import *<函数名>/<函数参数>
from turtle import *
#可能会出现函数重名问题
import <库> as <库别名>
#6666
画笔控制函数
turtle.penup() /pu()
turtle.pendown() /pd()
turtle.pensize() /width()
turtle.pencolor() "purple"/ 0.63, 0.13, 0.94
/(0.63, 0.13, 0.94)
运动控制函数
turtle.forward(d) / fd(d)
turtle.circle(100)/(-100, 90)
方向控制函数
turtle.setheading(angle) / seth(angle)
turtle.left(angle)
turtle.right(angle)
循环语句与range函数
产生循环计数序列
range(n) 0-n
range(m, n) m-n
range(m, n, step)
三、基本数据类型
3.1 数字类型及操作
整数类型
pow(x,y)
- 十进制 1010, 99
- 二进制 0b010
- 八进制 0o123
- 十六进制 0x235
浮点数类型
- 范围 -10^308 ~ 10 ^ 308
- 精度 10 ^ -16
- 浮点数间运算存在不确定位数,不是bug
round(x,d) : 对x四舍五入,d是小数截取位数
//浮点数间运算以及比较用round函数进行辅助
复数类型
z.real 获得实部
z.imag 获得虚部
数值运算操作符
- +、-、* 、 /(浮点数结果,与数学中的除是一致的)
- //(整数除)
- +x : x本身
- -y : y的负值
- % : 取余
- ** : 幂运算
- 增强赋值操作符 x op= y
- 类型间可以进行混合运算,生成结果为最宽类型:整数-》浮点数-》复数
数值运算函数
abs(x) : 绝对值
divmod(x,y) : 商和余数
pow(x,y[,z) : 幂计算,取余
round(x[,d]): 四舍五入
max(x,y,...): 最大值
min(x,y....): 最小值
int(x) : 变浮点数
float(x) : 变浮点数
complex(x) : 变复数
实例:天天向上的力量
四、程序的控制结构
4.1 程序的分支结构
单分支结构
if :
二分支结构
if :
else:
紧凑形式:适用于简单表达的二分支结构
if else
多分支结构
if :
elif :
else:
条件判断及组合
- and, or, not
- <, <=, >, >=, ==, !=
程序的异常处理
try :
except :
try :
except :
异常处理的高级实用:
try :
except:
else :
finally :
//finally 对应语句块一定执行,else 对应语句块在不发生异常时执行+
实例:BMI
- BMI = kg / m^2
- 读程序要首先看分支结构
4.2 程序的循环结构
遍历循环
for in :
for i in range(N):
//balabala
for i in range(M,N,K):
//从M,到N,步长为K
for c in s:
//balabala
for item in list:
//balabala
for line in fi :
//balabala
//fi是文件标识符
无限循环
while :
循环控制保留字
循环的高级用法
for <> in <> :
<>
else:
<>
while <>:
<>
else:
<>
- 当循环没有被break语句退出时,执行else语句块
- else作为正常完成循环的奖励
- else用法与异常处理时的else用法相似
4.3 random库的使用
random库概述
import random
基本随机函数:
seed()
random()
扩展随机函数:
randint()
getrandbits()
uniform()
randrange()
choice()
shuffle()
基本随机数函数
- 随机数种子确定了随机数的产生
- seed(a=None) : 初始化给定的随机数种子,默认为当前系统时间
- random() : 生成一个0.0-1.0之间的随机小数
- random.seed()
- random.random()
- 使用时间可以复现随机过程
扩展随机数函数
- randint(a,b) : 生成一个[a,b]之间的整数
- randrange(m,n[,k]) : 神成一个[m,n)之间以k为步长的随机整数
- getrandbits(k) : 生成一个k比特长的随机数
- uniform(a,b) : 生成一个[a,b]之间的随机小数
- choice(seq) : 从序列seq中随机选取一个元素
- shuffle(seq) : 将序列seq中元素随机排列,返回打乱后的序列
实例:圆周率的计算
代码换行 : \
计时方法 :
from time import perf_counter
start = perf_counter()
//balabala
end = perf_counter()
五、函数和代码复用
5.1 函数的理解和定义
函数的定义
def <>(<>):
<>
return <>
函数的使用及调用过程
- 调用时要给出实际参数
- 实际参数替换定义中的参数
- 函数调用后得到返回值
函数的参数传递
def fact(n, m = 1):
s = 1
for i in range(1, n+1):
s *= i
return s
def fact(n, *b):
s = 1
for i in range(1, n+1):
s *= i
for item in b:
s *= item
return s
//fact(10, 3)
//fact(10,3,5,8)
//比如min(),max()
参数传递的两种方式
def fact(m, n)
fact(10, 5)
fact(n = 5, n = 10)
函数的返回值
- 函数可以返回0个或多个结果
- return保留字用来传递返回值
- 函数可以有返回值,也可以没有
- 可以有return也可以没有
- return可以传递0个返回值,也可以传递任意多个返回值
- 传递任意多个返回值的形式是元组类型
- 或者 a,b,c = fact(10,5)
局部变量和全局变量
- 局部变量和全局变量是不同变量
- 局部变量是函数内部的占位符,与全局变量可能重名但不同
- 函数运算结束后,局部变量被释放
- 可以使用global保留字在函数内部使用全局变量
- 局部变量为组合数据类型且未创建,等同于全局变量
lambda函数
- lambda函数返回函数名作为结果
- lambda函数是一种匿名函数,即没有名字的函数
- 使用lambda保留自定义,函数名是返回结果
- lambda函数用于定义简单的、能够在一行内表示的函数
<函数名> = lambda<参数>:<表达式>
等价于
def <函数名>(<参数>):
<函数体>
return <返回值>
f = lambda x, y : x + y
f(10,15)
实例 : 七段代码管的绘制
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 deawline(False)
drawline(True) if digit in [0,1,3,4,5,6,7,8,9] else deawline(False)
drawline(True) if digit in [0,2,3,5,6,8,9] else deawline(False)
drawline(True) if digit in [0,2,6,8] else deawline(False)
turtle.left(90)
drawline(True) if digit in [0,4,5,6,8,9] else deawline(False)
drawline(True) if digit in [0,2,3,5,6,7,8,9] else deawline(False)
drawline(True) if digit in [0,1,2,3,4,7,8,9] else deawline(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawdate(date):
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()
5.2 代码复用与函数递归
代码复用与模块化设计
- 函数:将代码命名,在代码层面建立了初步抽象
- 对象:属性和方法,< a>.< b>和< a>.< b>(),在函数之上再次组织进行抽象
- 模块化设计:紧耦合,松耦合
- 模块内部紧耦合,模块之间松耦合
函数递归的理解
- 函数定义中调用函数自身的方式
- 链条:计算过程存在递归链条
- 基例:存在一个或多个不再递归的基例
- 类似于数学归纳法
函数递归的调用过程
def fact(n):
if n == 0"
return 1
else :
return n * fact(n - 1)
函数递归实例分析
字符串反转
s[::-1]
def rvs(s):
if s == "":
return s
else :
return rvs(s[1:])+s[0]
斐波那契数列
def F(n):
if n == 1 or n == 2:
return 1
else:
return F(1) + F(2)
汉诺塔问题
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)
5.3 PyInstaller库的使用
PyInstaller库基本介绍
- 将.py源代码转换成邬旭源代码的可执行文件
- PyInstaller库是第三方库
- 网站http://www.pyinstaller.org
- 安装第三方库需要pip
- 安装
- (cmd命令行) pip install pyinstaller
PyInstaller库使用说明
- (cmd命令行) pyinstaller -F <文件名.py>
- -h 查看帮助
- –clean 清理打包过程中的临时文件
- -D, --onedir 默认值,生成dist文件夹
- -F, --onefile在dist 文件夹中只生成独立的打包文件
- -i <图标文件名.ico> 指定打包程序使用的图标(icon)文件
实例:科赫雪花小包裹
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
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.hideturtle()
main()
六、组合数据类型
6.1 集合类型及操作
集合类型定义
- 集合是多个元素的无序组合
- 集合类型与数学中的集合概念一致
- 集合元素之间无序,每个元素唯一,不存在相同元素
- 集合中不能出现可变数据类型
-
- 集合用大括号{}表示,元素间用逗号分隔
- 建立集合用{}或set()
- 建立空集合类型,必须使用set()
集合操作符
- 并 |
- 差 -
- 交 &
- 补 ^
- <=、<
-
=、>
- 4个增强操作符 : op=
集合处理方法
S.add(x) //添加
S.discard(x) //移除,不报错
S.remove(x) //移除,若S中没有x,报错KeyError
S.clear() //清空所有
S.pop() //随机弹出一个元素
S.copy() //返回集合S的一个副本
len(S) //返回S的元素个数
x in S //是否存在
x not in S //
set(x) //将其他类型转换为集合类型
try:
while True:
print(A.pop(), end="")
except:
pass
集合类型应用场景
ls = ["p","p","y","y",123]
s = set(ls)
lt = list(s)
6.2 序列类型及操作
序列类型定义
- 序列是具有先后关系的一组元素
- 序列是一维元素向量,元素类型可以不同
- 类似数学元素序列
- 元素间由序列号引导,通过下标访问序列的特定元素
- 序列是一个基类类型
- 6个操作符
- x in s
- x not in s
- s + t
- sn//ns
- s[i]
- s[i:j]//s[i:j:k]
- 通用函数和方法
- len(s)
- min(s)
- max(s)
- s.index(x)// s.index(x,i,j)
- s.count(s)
元组类型定义
- 元组是序列类型的一种扩展
- 一旦创建就不能被修改
- 使用()或tuple()创建
- 可以使用或不使用小括号
- 元组继承序列类型的全部通用操作
列表类型定义
- 列表是序列类型的一种扩展
- 列表是一种序列类型,创建后可以随意被修改
- 使用[]或list()创建,元素间用逗号分隔
- 无长度限制
- 方括号[]真正创建一个列表,赋值仅传递引用
ls[i] = x
ls[i:j:k] = lt
del ls[i]
del ls[i:j:k]
ls += lt
ls *= n
ls.append(x)
ls.clear()
ls.copy()
ls.insert(i,x)
ls.pop(i)
ls.remove(x)
ls.reverse()
序列类型应用场景
- 元组用于元素不改变的应用场景
- 列表更加灵活,他是最常用的列表序列
- 最主要作用:表示一组有序数据,进而操作他们
6.3 字典类型及操作
字典类型定义
- 映射:索引和值的对应
- 键值对:键是数据索引的扩展
- 字典是键值对的集合,键值对之间无序
- 采用{}和dict()创建,键值用冒号:表示
d = {//balabala}
d["zhongguo"]
字典处理类型及方法
del d[k]
k in d
d.keys()
d.values()
d.items()
d.get(k,)
d.pop(k,)
d.popitem()
d.clear()
len(d)
字典类型的应用场景
6.4 jieba库的使用
- 优秀的中文分词第三方库
- 中文文本需要通过分词获得单个的词语
- jieba是优秀的中文分词第三方库,需要额外安装
- jieba库提供三种分词模式,最简单只需掌握一个函数
- 三种模式:
jieba.lcut(s)
jieba.lcut(s,cut_all=True)
jieba.lcut_for_search(s)
jieba.add_word(w)
实例:文本词频统计
Hamlet
def getText():
txt = open("hamlet.txt", "r").read()
txt = txt.lower()
for ch in '!"#$%&()*+<-/;:<+>?@[\\]^_`{|}~':
txt = txt.replace(ch," ")
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word,0)+1
items = list(counts.items())
items.sort(key=lambda x:x[1],reverse = True)
三国演义
import jieba
txt = open("","r",encoding = "utf-8").read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1"
continue
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[i],reverse=True)
for i in range(15):
word,count = items[i]
print("{0:<10}{1:>5".format(word,count)
七、文件和数据格式化
文件的类型
文件的类型
- 文件是数据的抽象和集合
- 文件是数据存储的一种形式
- 文件展现形态:文本文件和二进制文件
- 由单一特定编码组成的文件,如UTF-8
-文本文件: 由于存在编码,也被看成存储着的长字符串。例如.txt,.py
- 二进制文件:直接由比特1和0组成,没有统一的字符编码,一般存在二进制的组织结构
- 本质上,所有文件都是由二进制形式存储
- 形式上,所有文件采用两种方式展示
tf = open("f.txt","rt")
print(tf.readline())
tf.close()
bf = open("f.txt","rb")
print(tf.readline())
tf.close()
a.read(size)
a.readline(size)
a.readlines(hint)
a.write(s)
a.weitelines(lines)
a.seek(offset)
- 文件的打开
- 文件句柄
- 文件名
- 打开模式
- “D:/PYE/f.txt” 或者 “D:\\PYE\\f.txt”
文件的打开模式 |
描述 |
r |
只读,默认值,若文件不存在,返回FileeNotFoundError |
w |
覆盖写,文件不存在则创建,存在则完全覆盖 |
x |
创建写,文件不存在则创建,存在返回FileExistsError |
a |
追加写,文件不存在则创建,存在则在文件最后追加 |
b |
二进制文件模式 |
t |
文本文件模式,默认值 |
+ |
与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
文件内容的读取
操作方法 |
描述 |
.read(size=-1) |
读入全部内容,如果给出参数,读入前size长度 |
.readline(size=-1) |
读入一行内容,如果给出参数,读入该行前size长度 |
.readlines(hint=-1) |
读入文件所有航,以每行元素形成列表,如果给出参数,读入前hint行 |
数据的文件写入
操作方法 |
描述 |
.write(s) |
向文件写入一个字符串或字节流 |
.writelines(lines) |
将一个元素全为字符串的列表写入文件 |
.seek(offset) |
改变当前文件操作指针的位置,offset = 0-文件开头,1-当前位置,2-文件末尾 |