导图社区 Python 3.X 三、Python基本数据类型
math库解析,文本进度条,实例:天天向上的力量,数字类型的使用,字符串类型及其使用。
编辑于2020-11-18 23:50:09Python 3.X 二、Python 基本数据类型
一、数字类型
1、数字类型
1、程序元素:010/10,存在多种可能
♢表示十进制整数值10
♢类似人名一样的字符串
2、数字类型对Python语言中数字的表示 和使用进行了定义和规范
3、Python语言包含三种数字类型
♢整数类型
1、与数学中的整数概念一致,没有取值范围限制
2、pow(x, y)函数:计算 x y
程序1:pow(2, 10), pow(2, 15)
程序2:pow(2, 1000)
程序3:pow(2, pow(2, 15))
3、示例:
♢1010 ,99,-18
♢0x9a,-0X89 (0x , 0X开头表示16进制数)
♢0b010,-0B101 (0b , 0B开头表示2进制数)
♢0o123,-0O456 (0o , 0O开头表示8进制数)
♢浮点数类型
1、带有小数点及小数的数字
2、Python语言中浮点数的数值范围存在 限制,小数精度也存在限制。这种限制与 在不同计算机系统有关
3、示例:
♢0.0 , -1.5 ,23.6
♢96e4,4.3e-3,9.6E5 (科学计数法)
♢科学计数法使用字母“e”或者“E”作为幂 的符号,以10为基数。科学计数法含义如下:
<a>e<b> = a * 10**b
♢复数类型
1、与数学中的复数概念一致,z = a + bj, a是实数部分,b是虚数部分,a和b都是浮点类型, 虚数部分用j或者J标识
2、示例:
12.3 + 4j , -5.6 + 7j
3、z = 1.23e-4 + 5.6e +89j(实部和虚部是什么?)
对于复数z , 可以用 z.real 获得实数部分, z.imag获得虚数部分 z.real = 0.000123 z.imag = 5.6e+89
二、数字类型的操作
1、内置的数值运算操作符
♢三种类型存在一种逐渐“扩展”的关系: 整数 -> 浮点数 -> 复数 (整数是浮点数特例,浮点数是复数特例)
♢不同数字类型之间可以进行混合运算,运算 后生成结果为最宽类型
♢123 + 4.0 = 127.0(整数 + 浮点数 = 浮点数)
操作符
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 与 y之商的余数, 也称为模运算
-x
x的负值,即:x * (-1)
+x
x本身
x**y
x的y次幂,即:x的y次方
数字类型之间相互运算所生成的 结果是“更宽”的类型,基本规则 是:
○整数之间运算,如果数学意义上的结果是小数,程序为浮点数
○整数之间运算,如果数学意义上的结果是整数,程序为整数
○整数盒浮点数混合运算,输出结果是浮点数
○整数或浮点数与复数运算,输出结果是复数
2、内置的数值运算函数
Python解释器提供了一些内置函数,在这些 内置函数之中,有6个函数与数值运算相关
abs(x)
x的绝对值
divmod(x, y)
(x//y, x%y),输出为二元组形式(也称为元组类型)
pow(x, y[, z])
(x**y)%z,[..]表示该参数可以省略,即:pow(x, y),它与x**y相同
round(x[, ndigits])
对x四舍五入,保留ndigits位小数,round(x)返回四舍五入的整数值
max(x1, x2, ..., xn)
x1, x2, ..., xn 的最大值,n没有限定
min(x1, x2, ..., xn)
x1, x2, ..., xn 的最小值,n没有限定
3、数字类型的转换
数值运算操作符可以隐式地转换 输出结果的数字类型 例如,两个整数采用运算符“/”的除法将可能输出 浮点数结果。 此外,通过内置的数字类型转换函数可以显式地在 数字类型之间进行转换
int(x)
将x转换为整数,x可以是浮点数或字符串
float(x)
将x转换为浮点数,x可以是整数或字符串
complex(re[, im])
生成一个复数,实部为re,虚部为im,re可以是整数、浮点数或 字符串; im可以是整数或者浮点数但不能为字符串
三种类型可以互相转换 函数:int(),float(),complex()
示例1
int(4.5) = 4 (#直接去掉小数部分)
float(4) = 4.0 (#增加小数部分)
complex(4) = 4 + 0J
示例2
complex(4.5) = 4.5 + 0J >>>float(4.5+0j) #报错 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> float(4.5+0j) TypeError: can't convert complex to float
4、数字类型的判断
函数:type(x),返回x的类型,适用于所有类型 的判断
示例: >>>type(4.5) <class 'float'> >>>type(z) <class 'complex'>
三、math库的使用
1、math库概述
♢math库是Python提供的内置数学类函数库
♢math库不支持复数类型
♢math库一共提供了4个数学常数和44个函数
16个数值表示函数
8个幂对数函数
16个三角对数函数
4个高等特殊函数
2、math库引用
第一种
import math
对math库中函数采用math.<b>()形式使用
math.pi
第二种
from math import <函数名>
对math库中函数可以时间采用<函数名>()形式使用
floor(10.2)
3、math库解析
4个数学常数
math.pi
圆周率
值为 3.141592653589793
math.e
自然对数
值为 2.718281828459045
math.inf
正无穷大
负无穷大为 -math.inf
math.nan
非浮点数标记
NaN (Not a Number)
16个数值表示函数
math.fabs(x)
|x|
返回x的绝对值
math.fmod(x, y)
x%y
返回x与y的模
math.fsum([x, y, ...])
x + y + ...
浮点数精确求和
math.ceil(x)
向上取整
返回不小于x的最小整数
math.floor(x)
向下取整
返回不大于x的最大整数
math.factorial(x)
x!
返回x的阶乘,如果x是小数或负数,返回ValueError
math.gcd(a, b)
返回a与b的最大公约数
math.frepx(x)
x = m * 2**e
返回(m, e),当x=0,返回(0.0, 0)
math.modf(x)
返回x的小数和整数部分
math.trunc(x)
返回x的整数部分
math.copysign(x, y)
|x| * |y|/y
用数值y的正负号替换数值x的正负号
math.isclose(a, b)
比较a和b的相似性,返回True或False
math.isfinite(x)
当x为无穷大,返回True;否则返回False
math.isinf(x)
当x为正数或负数无穷大,返回True;否则返回False
math.isnan(x)
当x是NaN,返回True;否则返回False
8个幂对数函数
math.pow(x, y)
x**y
返回x的y次幂
math.exp(x)
e**x
返回e的x次幂,e是自然对数
math.expml(x)
e**x-1
返回e的x次幂减1
math.sqrt(x)
√x
返回x的平方根
math.log1p(x)
In(1+x)
返回1+x的自然对数值
math.log2(x)
log x
返回x的2对数值
math.log10(x)
log 10 x
返回x的10对数值
16个 三角双曲函数
math.degree(x)
角度x的弧度值转角度值
math.radians(x)
角度x的角度值转弧度值
math.hypot(x, y)
√x**2+y**2
返回(x, y)坐标到原点(0, 0)的距离
math.sin(x)
sin x
返回x的正弦函数值,x是弧度值
math.cos(x)
cos x
返回x的余弦函数值,x是弧度值
math.tan(x)
tan x
返回x的正切函数值,x是弧度值
math.asin(x)
arcsin x
返回x的反正弦函数值,x是弧度值
math.acos(x)
arccos x
返回x的反余弦函数值,x是弧度值
math.atan(x)
arctan x
返回x的反正切函数值,x是弧度值
math.atan2(x, y)
arctan y/x
返回y/x的反正切函数值,x是弧度值
math.sinh(x)
sinh x
返回x的双曲正弦函数值
math.cosh(x)
cosh x
返回x的双曲余弦函数值
math.tanh(x)
tanh x
返回x的双曲正切函数值
math.asinh(x)
arcsinh x
返回x的反双曲正弦函数值
math.acosh(x)
arccosh x
返回x的反双曲余弦函数值
math.atanh(x)
arctanh x
返回x的反双曲正切函数值
4个 高等特殊函数
math.erf(x)

高斯误差函数,应用于概率论、统计学等领域
math.erfc(x)

余补高斯误差函数,math.erfc(x) = 1 - math.efr(x)
math.gamma(x)

伽马(Gamma)函数,也叫欧拉第二积分函数
math.lgamma(x)
In(gamma(x))
伽马函数的自然对数
四、实例:天天向上的力量
1、实例代码:天天向上
一年365天,以第一天的能力值为基数,记为1.0 ,当好好学习时能力值相比前一天提高1‰,当 没有学习时由于遗忘等原因能力值相比前一天下降 1‰。每天努力和每天放任,一年下来能力值相差 多少呢?
import math dayup = math.pow((1.0+0.001), 365) # 提高0.001 daydown = math.pow((1.0-0.001), 365) # 放任0.001 print("向上:{:.2f},向下:{:.2f}" .format(dayup, daydown)) 运行结果:每天努力1‰,一年下来将提高44%,好像不多? 请继续分析
一年365天,如果好好学习时能力值相比前一天提 高5‰,当放任时相比前一天下降5‰。 效果相差多杀呢?
import math dayup = math.pow((1.0+0.005), 365) #提高0.005 dayup = math.pow((1.0-0.005), 365) #放任0.005 print("提高:{:.2f}\n向下:{:.2f}".format(dayup, daydown)) 运行结果:每天努力5‰,一年下来将提高6倍!这不容小觑了吧
一年365天,如果好好学习时能力值相比前一天提 高1%,当放任时相比前一天下降1%。 效果相差多少呢?
import math dayup = math.pow((1.0+0.01), 365) daydown = math.pow((1.0-0.01), 365) print("提高:{:.2f}\n向下:{:.2f}".format(dayup, daydown)) 运行结果:每天努力1%,一年下来将提高37倍。这个相当惊人吧!
一年365天,一周5个工作日,如果每个工作日 都很努力,可以提高1%,仅在周末放任一下, 能力值每天下降1%,效果如何呢?
dayup , dayfactor = 1.0 , 0.01 for i in range(365): if i % 7 in [6, 0]: dayup = dayup * (1 - dayfactor) else: dayuo = dayup * (1 + dayfactor) print("向上5天向下2天的力量:{.2f}".format(dayup)) 运行结果:每周努力5天,而不是每天,一年下来,水平 仅是初始的4.63倍!与每天坚持所提高的237倍相去甚远
如果对以上的实例代码结果感到意外,那自然会产 生如下问题:每周工作5天,休息2天,休息日水平 下降0.01,工作日努力到什么程度一年后的水平才 与每天努力1%所取得的效果一样呢?
def dayup(df): dayup = 0.01 for i in range(365): if i % 7 in [6, 0]: dayup = dayup * (1 - 0.01 df) else: dayup = dayup * (1 + df) return dayup dayfactor = 0.01 while (dayup(dayfactor)<37.78): dayfacetor += 0.01 print("每天的努力参数是:{.3f}".format(dayfactor))
如果每周连续努力5天,休息2天,为了达到 每天努力1%所达到的水平,则就需要在工作 日将提高的程度达到约2%,即要努力1倍才 仅是为了休息2天。
七、文本进度条
1、简单的开始
利用print()函数实现简单的非刷新文本进度条 基本思想是按照任务执行百分比将整个任务划分为100个单位, 每执行N%输出一次进度条。每一行输出包含进度百分比,代表 已完成的部分(**)和未完成的部分(..)的两种字符,以及一个跟随 完成度前进的小箭头,风格如下: %10 [*****->..........................................]
import time scale = 10 print("------执行开始------") for i in range(scale+1): a, b = '**' * i, '..' * (scale - i) c = (i/scale) * 100 print("%{:^3.0f}[{}->{}]" .format(c, a, b)) time.sleep(0.1) print("------执行完成------")
2、单行动态刷新
import time for i in range(101): print("\r{:2}%" .format(i), end = "") time.sleep(0.05)
IDLE中的执行效果如下: >>> 0% 1% 2% 3% 4% ............ 97% 98% 99% 100% IDLE本身屏蔽了单行刷新功能,如果希望获得刷新效果, 请使用控制台命令执行e4.2TextProgressBar.py程序。以 Windows为例,启动命令行工具: <Windows系统安装目录>\system32\cmd.exe 选择到e4.2TextProgressBar.py文件所在目录执行
3、带刷新的文本进度条
import time scale = 50 print("执行开始" .center(scale//2, '-')) t = time.clock() for i in range(scale+1): a = '*' * i b = '.' * (scale - i) c = (i/scale) * 100 t -= time.clock() print("\r{:^3.0f}%[{}->{}]{:.2f}s" .format(c, a, b, -t), end =' ') time.sleep(0.05) print("\n" + "执行结束" .center(scale//2, '-'))
4、五花八门的进度条设计函数
Liner
Constant
f(x) = x
Early Pause
Speeds up
f(x) = x+(1 - sin(x*π*2+π/2))/-8
Late Pause
Slows down
f(x) = x + (1-sin(x*π*2+π/2))/8
Slow Wavy
Constant
f(x) = x +sin(x*π*5)/20
Fast Wary
Constant
f(x) = x + sin(x*π*20)/80
Power
Speeds up
f(x) = (x+(1-x)*0.03)2
Inverse Power
Slows down
f(x) = 1+(1-x)1.5*-1
Fast Power
Speeds up
f(x) = (x+(1-x)/2)8
Inv. Fast Power
Slows down
f(x) = 1+(1-x)3 * -1
六、字符串类型的格式化
1、format() 方法的基本使用
字符串format()方法的基本使用格式是: <模板字符串>.format(<逗号分割的参数>)
例1: "{ }: 计算机{ }的CPU占用率为{ }%。".format("2020-11-15", "PYTHON", 10)
例2: >>>a ,b ,c = "你好","世界","晚安" >>>print("{},{},{}".format(a, b, c)) '你好,世界,晚安' >>>print("{2},{0},{1}".format(a, b, c)) '晚安,你好,世界'
2、format() 方法的格式控制
1、format() 方法中模板字符串的槽错了包括参数序号, 还可以包括格式控制信息。此时,槽的内部样式如下: {<参数序号>:<格式控制标记>}
2、其中,格式控制标记用来控制参数显示时的格式。格式控制 标记包括:<填充><对齐><宽度><.精度><类型>6个字段, 这些字段都是可选的,可以组合使用,这里按照使用方式逐一 介绍。
格式控制标记
:
引导符号
<填充>
用于填充的单个字符
<对齐>
<
左对齐
>
右对齐
^
居中对齐
<宽度>
槽的设定输出宽度
,
数字的千位分隔符,适用于整数和浮点数
<.精度>
浮点数小数部分的精度或 字符串的最大输出长度
<类型>
整数类型 b, c, d, o, x, X
浮点数类型 e, E, f, %
五、字符串类型及其操作
1、字符串类型
1、字符串是用双引号""或者单引号''括起来的 一个或多个字符。
2、字符串可以保存在变量中,也可以单独纯存在。
3、可以用type()函数测试一个字符串的类型
4、Python语言转义符:\
5、输出带有引号的字符串,可以使用转义符
6、使用\\输出带有转义符的字符串
>>>print("\"大家好\"") "大家好"
7、字符串是一个字符序列:字符串最左端位置 标记为0,依次增加。字符串中的编号叫做“索引”
H e l l o J o h n 0 1 2 3 4 5 6 7 8 9
8、单个索引辅助访问字符串中的特定位置 格式为<string>[<索引>]
>>>greet = "Hello John" >>>print (greet[2]) l >>> x = 8 >>>print(greet[x-2]) j
9、Python中字符串索引从0开始,一个长度为 L的字符串最后一个字符的位置是L-1
10、Python同事允许使用负数从字符串右边 末尾向左边进行反向索引,最右侧的索引值是-1
>>>greet[-4] 'J'
11、可以通过两个索引值确定一个位置范围,返回 这个范围的子串 格式:<string>[<start>:<end>]
start和end都是整数型数值,这个子序列从 索引start开始直到索引end结束,但不包括 end位置。 >>>greet[0:3] 'Hel'
12、字符串之间可以通过+或*进行连接
加法操作(+):将两个字符串连接成为一个新的 字符串
乘法操作(*):生成一个由其本身字符串重复连接 而成的字符串
>>>"pine" + "apple" 'pineapple' >>>3 * "pine" 'pinepinepine'
13、len()函数能否返回一个字符串的长度
>>>len('pine') 4 >>>len('祖国,您好!') 6
2、字符串类型的转换
大多数数据类型都可以通过str()函数转换 为字符串
>>>str(123) '123' >>>str(123.456) '123.456' >>>str(123e+10) '1230000000000.0'
3、字符串使用实例
输入一个月份数字,返回对应月份名称缩写 这个问题的IPO模式是: 输入:输入一个表示月份的数字(1-12) 处理:利用字符串基本操作实现该功能 输出:输入数字对应月份名称的缩写
1、将所有月份名称缩写存储在字符串中
moths = "JanFebMarAprMayJunJulAugSepOctNovDec"
2、在字符串中截取适当的字符串来查找特定的月份
1、找出在哪里切割字窜
2、每个月份的缩写都由3个字母组成,如果pos 表示一个月份的第一个字母,则months[pos:pos+3] 表示这个月份的缩写,即: monthAbbrew = months[pos:pos + 3]
3、月份在字符串中的位置
Jan 1月 位置0
Feb 2月 位置3
Mar 3月 位置6
Apr 4月 位置9
months = 'JanFebMarAprMayJunJulAugSepOctNovDec' n = input("请输入月份数(1-12):") pos = (int(n)-1)*3 monthAbbrev = months[pos:pos + 3] print("月份简写是:"+monthAbbrev+".")
4、字符串的操作
1、可以通过for 和 in组成的循环来遍历 字符串中每个字符
格式如下: for <var> in <string>: 操作
2、用转义符可以在字符串中表达一些不可直接 打印的信息
例如:用\n表示换行 字符串"Hello\nWorld\n\nGoodbye 32\n" Hello World Goodbye 32
5、内置的字符串处理函数
+
连接
*
重复
<string>[]
索引
<string>[:]
剪切
len(<string>)
长度
<string>.upper()
字符串中字母大写
<string>.lower()
字符串中字母小写
<string>.strip()
去两边空格及去指定字符
<string>.split()
按指定字符分割字符串为数组
<string>.join()
连接两个字符串序列
<string>.find()
搜索指定字符串
<string>.replace()
字符串替换
for <var> in <string>
字符串迭代
实例:凯撒密码
凯撒密码是古罗马凯撒大帝用来对军事情报进行加密 的算法,它采用了替换方法对信息中的每一个英文字 符循环替换为字母表序列该字符后面第三个字符,对应 关系如下: 原文:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文:DEFGHIJKLMNOPQRSTUVWXYZABC 原文字符P,其密文字符C满足如下条件: C = (P + 3) mod 26 解密方法反之,满足: P = (C - 3) mod 26
plaincode = input("请输入明文:") for p in plaincode: if ord("a") <= ord(p) <= ord("z"): print(chr(ord("a")+(ord(p)-ord("a")+3)%26), end = ' ') else: print(p, end = ' ')
运行结果: >>> 请输入明文:python is an excellent language. sbwkrq lv dq hafhoohqw odqjxdjh.
6、内置字符串处理方法
str.lower()
返回字符串str的副本,全部字符小写
str.upper()
返回字符串str的副本,全部字符大写
str.islower()
当str所有字符都是小写时,返回True,否则False
str.isprintable()
当str所有字符都是可打印的,返回True,否则False
str.isnumeric()
当str所有字符都是字符时,返回True,否则False
str.isspace()
当str所有字符都是空格,返回True,否则False
str.endswith(suffix[,start[,end]])
str[start: end]以suffix结尾返回True,否则返回False
str.startswith(prefix[, start[,end]])
str[start: end]以suffix开始返回Ture,否则返回False
str.split(sep = None, maxsplit = -1)
返回一个列表,由str根据sep被分割的部分构成
str.count(sub[,start[,end]])
返回str[start: end]中sub子串出现的次数
str.replace(old, new[, count])
返回字符串str的副本,所以old子串被替换为new,如果 count给出,则前count次old出现被替换
str.center(width[, fillchar])
字符串居中函数
str.strip([chars])
返回字符串str的副本,在其左侧和右侧去掉chars中列出的字符
str.zfill(width)
返回字符串str的副本,长度为width,不足部分在左侧添0
str.format()
返回字符串str的一种排版格式
str.join(iterable)
返回一个新的字符串,由组合数据类型iterable变量 的每个元素组成,元素间用str分割