第二周 类型及应用
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)↙ 得到 <class‘float‘>
[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)↙ 输出:<class‘str‘>
[2] 可以使用 \ 转义字符输出“”或‘‘之类的字符
也可以用同样的方法 \\ 输出转义字符,\n 输出换行符等
例:print(“\”大家好\””);
输出:”大家好”
[3] 字符串是一个字符序列,字符串最左端位置标示为0,向右递增
字符串中字符位置的标示称为“索引”,例如:
H |
e |
l |
l |
o |
|
J |
h |
o |
n |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
可以使用单个索引访问字符串的特定位置。格式如下:
<string>[<索引>]
其中索引可以为常量和表达式
[4] python中字符串(设长度为L)索引从0开始,最后一个字符索引为L-1
同时也允许使用负数,对字符串从右至左进行反向检索,最右索引值为-1
可以通过两个索引值来确定一个范围,从而返回这个范围内的子字符串。格式如下:
<string>[<start>,<end>]
其中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] 序列(字符串、元组、列表)类型的操作:
序列操作符 |
操作的含义 |
<seq> + <seq> |
连接两个序列 |
<seq> + <整数类型> |
对序列进行整数次重复 |
<seq>[<整数类型>] |
索引序列中的元素 |
<seq>[<整数类型>:<整数类型>] |
取序列的一个子序列 |
len(<seq>) |
序列中元素个数 |
for <var> in <seq> |
对序列进行循环列举 |
<expr> in <seq> |
成员检查,判断<expr>是否在序列中 |
[2] 方法,格式如下:
<type>.func()
① 字符串方法:
字符串方法 |
含义 |
<string>.upper() |
字符串中字母大写 |
<string>.lower() |
字符串中字母小写 |
<string>.strip() |
去掉两边空格和指定字符 |
<string>.split() |
按指定字符分割字符串为数组 |
<string>.join() |
连接两个字符串序列 |
<string>.find() |
搜索指定字符串 |
<string>.replace() |
字符串替换 |
列表方法 |
含义 |
<list>.append(x) |
将元素x增加到列表最后 |
<list>.sort() |
将列表元素排序 |
<list>.reverse() |
将列表元素反转 |
<list>.index(x) |
返回第一次出现元素x的索引值 |
<list>.insert(i,x) |
在位置i处插入新元素x |
<list>.count(x) |
返回元素x在列表中的数量 |
<list>.remove(x) |
删除列表中第一次出现的元素x |
<list>.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(<list>) |
从列表中随机返回一个元素 |
shuffle(<list>) |
将列表中元素随机打乱 |
sample(<list>,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() <span style="white-space:pre"> </span># 给出随机坐标(x,y) dist = sqrt(x**2 + y**2) <span style="white-space:pre"> </span># 计算抛点到原点的距离 if dist <= 1.0: # 判断距离是否在圆内,若是则hits自增1 hits = hits + 1 pi = 4 *(hits/DARTS) # 计算比值,得到π值 print("Pi的值是 %s" % pi) print("程序运行时间是 %-5.5ss" % clock())
程序运行时间是 0.015s