第二周 类型及应用
2.1类型 —— 编程语言对数据的划分
数字类型、字符串类型、元组类型
列表类型、文件类型、字典类型
(1)数字类型:数字类型对python语言中的数字的表示和使用进行了定义和规范
[1] 分类:①整数类型 ② 浮点数类型 ③ 复数类型
① 整数类型概念与数学一致,没有取值范围限制
例:1010(十进制数),0x9a(十六进制数,以0x/0X开头),0b010(二进制数,以0b/0B开头)0o123(八进制数,以0o/0O开头)
② 浮点数类型是带有小数点及小数的数字,数值范围和小数精度有一定限制,因系统而异
例:0.0(与整数0不同),96e4(科学计数法,e/E代表10的次幂,e/E后的数字为指数)
③ 复数类型概念与数学一致,z=a+bj(j/J代表虚数部分)例:12.3+4j
对于一个复数,如z = 1.1+9j,可以使用z.real和z.imag来获得复数的实部和虚部
[2] 数字类型的关系:
← 特例 ← 特例
整数 → 浮点数 → 复数 (范围逐渐扩大) 整数 浮点数 浮点数
因此这三种数字类型可以进行混合运算,生成结果为最宽类型 例:3 + 4.2 = 7.2
[3] 类型转换:利用int(), float() 和complex() 三个函数实现
例:int(4.5) = 4; float(4) =4.0; complex(4) = 4 + 0j;
【注意】不能将复数转成整数和浮点数!(但可以间接利用取实部虚部的方法实现)
[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] 可以使用 \ 转义字符输出“”或‘‘之类的字符
也可以用同样的方法 \\ 输出转义字符,\n 输出换行符等
例:print(“\”大家好\””);
输出:”大家好”
[3] 字符串是一个字符序列,字符串最左端位置标示为0,向右递增
字符串中字符位置的标示称为“索引”,例如:
H
e
l
l
o
J
h
o
n
0
1
2
3
4
5
6
7
8
9
可以使用单个索引访问字符串的特定位置。格式如下:
[<索引>]
其中索引可以为常量和表达式
[4] python中字符串(设长度为L)索引从0开始,最后一个字符索引为L-1
同时也允许使用负数,对字符串从右至左进行反向检索,最右索引值为-1
可以通过两个索引值来确定一个范围,从而返回这个范围内的子字符串。格式如下:
[,]
其中start和end都为整型,索引范围为[start, end)
程序实例:
【题目描述】输入一个月份数字,返回对应月份名称的缩写
【分析】IPO模式:① 输入:输入一个表示月份的数字(1-12)
② 处理:利用字符串基本操作实现功能
③ 输出:输出数字对应月份名称缩写
【解答】
程序3:
# month.py
months="JanFebMarAprMayJunJulAugSepOctNovDec"
n=input("请输入月份数(1-12):")
pos=(int(n)-1) * 3
monthAbbrev=months[pos:pos+3]
print("月份简写是"+monthAbbrev+".")
输入: 输出:
7↙ 月份简写是Jul.
(3)元组类型(Tuple) — 包含0个至多个元素的类型,元素之间用逗号分割
例:t1 = 123, 45.6, “hello”; t2 = (); t3 = 12;
元组外部可以使用或不使用括号
[1]元组类型的三个特点: ① 元组中的元素可以是不同类型的,可以嵌套(用括号区分)
② 元组中的各个元素存在先后关系,可以通过索引来访问元组中的元素
例:t1[0];
③ 元组定义后不能更改和删除—— 安全
[2] 与字符串类型类似,可以通过索引区间来访问元组中的部分元素
也可以对元组进行+和*的运算 例:t2[1:];
(4)列表类型( List ) — 有序的元素集合
[1] 与元组类似,列表的每个元素类型可以不同,可以通过索引访问列表的单个元素
例:a = [0,1,2] print(a) 输出:[0,1,2]
[2] 与元组不同,列表的大小没有限制,可以随时修改
(5)小结:
[1] 序列(字符串、元组、列表)类型的操作:
序列操作符
操作的含义
+
连接两个序列
+ <整数类型>
对序列进行整数次重复
[<整数类型>]
索引序列中的元素
[<整数类型>:<整数类型>]
取序列的一个子序列
len()
序列中元素个数
for in
对序列进行循环列举
in
成员检查,判断是否在序列中
[2] 方法,格式如下:
.func()
① 字符串方法:
字符串方法
含义
.upper()
字符串中字母大写
.lower()
字符串中字母小写
.strip()
去掉两边空格和指定字符
.split()
按指定字符分割字符串为数组
.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库:
函数
数学表示
含义
圆周率pi
π
π的近似值,15位小数
自然常数e
e
e的近似值,15位小数
ceil(x)
⌈x⌉
对浮点数向上取整
floor(x)
⌊x⌋
对浮点数向下取整
pow(x,y)
x^y
x的y次幂
log(x)
lnx
以e为底的对数
log10(x)
log10x
以10为底的对数
sqrt(x)
√x
平方根
exp(x)
e^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的反余弦值
atan(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()函数用来设置随机种子,随机种子相同,随机序列相同— 伪随机数
【实例】π的计算 — 蒙特卡洛方法(随机抽样/统计实验方法)
① 先构造单位正方形和1/4圆
② 向正方形内抛洒大量点
③ 统计落入圆内的点占所有点的比例
【分析】IPO:① 输入:抛点的数量
② 处理:对于每个抛洒点,计算点到圆心的距离
通过判断该点在圆内或圆外。统计圆内点的数量
③ 输出:π值
程序4:
# pi.py
from randomimport random
from math importsqrt
from time importclock
DARTS = 1200
hits = 0
clock()
for i inrange(1,DARTS): # 抛洒DARTS次
x, y = random(), random() # 给出随机坐标(x,y)
dist = sqrt(x**2 + y**2) # 计算抛点到原点的距离
if dist <= 1.0: # 判断距离是否在圆内,若是则hits自增1
hits = hits + 1
pi = 4 *(hits/DARTS) # 计算比值,得到π值
print("Pi的值是 %s" % pi)
print("程序运行时间是 %-5.5ss" % clock())
输出:Pi的值是 3.14
程序运行时间是 0.015s