python语言程序设计——【第三周】基本数据类型

210 阅读10分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

-3.1 数字类型及操作

整数类型

  1. 与数学中整数的概念一致
  2. 可正可负,没有取值范围限制
  3. pow(X,Y)函数:计算x的y次方,想算多大算多大
  4. 例如pow(2,100)就是2的100次方。pow(2,pow(2,15))=>2的2的15次方

四种进制

  1. 二进制(0b或0B),八进制(0o或0O),十进制,十六进制(0X或0x)

浮点类型

  1. 与数学中实数的概念一致

    1. 带有小数点....
    2. 浮点数取值范围和小数精度都存在限制,但常规计算可以忽略
    3. 取值范围数量级约-10的308次方到10的308次方,精度数量级为10的-16次方
    4. 浮点运算中存在不确定尾数,不是bug:0.1+0.2=0.3000.....4
    5. round(x,d):对x四舍五入,d是小数截取位数
    6. 浮点数间运算及比较使用round()函数辅助

复数类型

  1. 与数学中负数的概念一致

  2. image-20220713054306974

  3. z = 1.23e-4+5.6e+89j

    1. 实部是什么?z.real获得实部
    2. 虚部是什么?z.imag获得虚部

数值运算操作符

  1. 加减乘除是一样的

  2. 整数除x//y,x与y之整数商,10//3结果是3
    x本身+x
    -yy的负值
    x%y取余
    x**y幂运算,x的y次幂(次方)。当y是小数时,开方运算10**0.5结果是根号10

    image-20220713115505258

    类型间可以进行混合运算,生成结果为"最宽"类型

    1. 三种类型存在一种逐渐"扩展"或"变宽"的关系:

      1. 整数->浮点数->复数
      2. 整数加浮点数=浮点数

    一些以函数形式提供的数值运算功能

    函数及使用描述
    abs(x)绝对值,x的绝对值abs(-10.01)结果为10.01
    divmod(x,y)商余,(x//y,x%y),同时输出商和余数。divmod(10,3)结果为(3,1)
    pow(x,y[,z])幂余,(x**y)%z,[..]表示参数z可省略。pow(3,pow(3,99),10000)结果为4587。z是余操作
    round(x[,d])四舍五入,d是保留小鼠位数,默认值为0,round(-10.123,2)结果为-10.12
    max(x1,x2,x3...)最大值,返回x1,x2,x3...xn中的最大值,n不限,max(1,9,5,4 3)结果为9
    min(x1,x2,x3...)最小值,返回x1,x2,x3...xn中的最大值,n不限,max(1,9,5,4 3)结果为1
    int(x)将x变成整数,舍弃小数部分。int(123.45)结果为123
    complex(x)将x变成复数,增加虚数部分。complex(4),结果为4+0j

    二元增强赋值操作符

-3.2 实例3:天天向上的力量

一年365天,每天进步1%,累计进步多少?1.01的365次方

一年365天,每天退步1%,累计退步多少?0.99的365次方

问题1:1%的力量

#DayDayUpQ1.py
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))

image-20220713131824215

问题2:5%。和1%的力量

一年365天,每天进步5%或1%,累计进步多少呢?

一年365天,每天退步5%或1%,累计退步多少呢?

#DayDayUpQ2.py
dayfactor = 0.005
dayup = pow(1+dayfactor,365)
daydown = pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))

image-20220713133123422

问题3:工作日的力量

一年365天,一周5个工作日,每天进步1%

一年365天,一周2个休息日,每天退步1%

--这样的工作日的力量如何呢?

#DayDayUpQ3.py
dayup = 1.0
dayfactor = 0.01
for i in range(365):
    if i % 7 in [6,0]:
        dayup = dayup *(1 - dayfactor)
    else:
        dayup = dayup *(1 + dayfactor)
print("工作日的力量:{:.2f}".format(dayup))

image-20220713133850678

问题4:工作日的努力

-工作日模式要努力到什么水平,才能与每天努力1%一样?

A君:一年365天,每天进步1%,不停歇

B君:一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?

for..in..(计算思维)=>def ...while("笨方法试错")

image-20220713134459654

#DayDayUpQ4.py
def dayUP(df):#def是保留字,df表示dayfactor
    dayup = 1#天天向上的初始值设置为1
    for i in range(365):
        if i % 7 in [6,0]:
            dayup = dayup * (1 - 0.01)
        else:
            dayup = dayup *(1 + df)
    return dayup
#根据df参数计算工作日力量的函数,参数不同,这段代码可以共用,def保留字用于定义函数
dayfactor = 0.01
while dayUP(dayfactor) < 37.78:
    dayfactor += 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))
#while保留字判断条件是否成立,条件成立时循环执行

image-20220713135429733

工作日模式,每天需要努力到1.9%,相当于365模式每天1%的一倍!

-3.3 字符串类型及操作

  1. 字符是有序序列,可以根据索引取得对应的值,索引从0开始

  2. 字符串的2类4种表示方法

    1. -单引号或双引号
    2. 由一对三单引号或三双引号表示,可表示多行字符串(作用可以当作注释)
    3. 字符串中出现单引号跟双引号如果想直接当字符串使用,可以使用三单引号或三双引号来包裹
  3. 使用[]获取字符串中一个或多个字符

    1. 索引:返回字符串中单个字符 <字符串>[M]
    2. TempStr[-1]

字符串切片高级用法

  1. 使用[M:N:K]根据步长对字符串切片

  2. <字符串>[M,N],M缺失表示至开头,N缺失表示至结尾

    1. “0123456789”[:3]的结果是"012"
  3. <字符串>[M:N:K],根据步长K对字符串切片

    1. “0123456789”[1:8:2]的结果是1357
    2. "0123456789"[::-1]结果是"9876543210"

转义符\

字符串操作符

操作符及使用描述
x + y连接两个字符串x和y
n * x或x * n复制n次字符串x
x in s如果x是s的子串,返回True,否则返回False

获取星期字符串

#WeekNamePrintV1.py
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos = (weekId - 1) *3
print(weekStr[pos:pos+3])
​
#WeekNamePrintV2.py
weekStr = "一二三四五六日"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期"+weekStr[weekId - 1])

字符串处理函数

一些以函数形式提供的字符串处理功能

函数及使用描述
len(x)长度,返回字符串x的长度。len("一二三456")结果为6
str(x)任意类型x所对应的字符串形式。str(1.23)结果为"1.23".str([1,2])结果为"[1,2]"
hex(x)或oct(x)整数x的十六进制或八进制小写形式字符串。hex(425)结果为"0x1a9"。oct(425)结果为”0o651“
chr(u)u为Unicode编码,返回其对应的字符
ord(x)x为字符,返回其对应的Unicode编码

Unicode编码

  1. Python字符串的编码方式

    1. 统一字符编码,即覆盖几乎所有字符的编码方式
    2. 从0到1114111(0x10FFFF)空间,每个编码对应一个字符

字符串处理方法

"方法"在编程中是一个专有名词

  1. "方法"特指.()风格中的函数()
  2. 方法本身也是函数,但与有关,.()风格使用

字符串处理方法

一些以方法形式提供的字符串处理功能

方法及使用描述
str.lower()或str.supper返回字符串的副本,全部字符小写/大写
str.split(sep = None)返回一个列表,由str根据sep被分隔的部分组成"A,B,C".split(",")结果为['A','B','C']
str.count(sub)返回子串sub在str中出现的次数。"an apple a day".count("a")结果为4
str.replace(old,new)返回字符串str副本,所有old子串被替换为new"python".replace("n","n123.io"),结果为"python123.io"
str.center(width[,fillchar])字符串str根据宽度width居中,fillchar可选"python".center(20,"=")结果为'=======python======'
str.strip(char)从str中去掉在其左侧和右侧chars中列出的字符"= python=".strip(" =np")结果为"ytho"
str.join(iter)在iter变量除最后元素外每个元素后增加一个str",".join("12345")结果为"1,2,3,45,5"#主要用于字符串分隔等

字符串类型的格式化

格式化是对字符串进行格式表达的方式

  1. -字符串格式化使用.format()方法,用法如下

    1. <模板字符串>.format(<逗号分隔的参数>)

    2. 默认情况:image-20220713221939549

    3. 也可以自己指定对应:image-20220713222329734

    4. 上述是python的槽机制

    5. format()方法的格式控制

      1. 槽内部对格式化的配置方式
        {<参数序号><格式控制标记>}
        
      2. image-20220713222930246

      3. image-20220713223527463

      4. 对应的输出格式

        1. b二进制格式
          c字符形式
          d十进制
          o八进制
          x十六进制表示
          X大写16进制表示
          以上是整数类型以下是浮点数类型
          e,E都是科学计数法,只是看是显示e还是E
          f非科学计数法表示浮点数
          %百分数表示浮点数

-3.4 模块2:time库的使用

time库是Python中处理时间的标准库

  1. 计算机时间的表达
  2. 提供获取系统时间并格式化输出功能
  3. 提供系统级精确计时功能,用于程序性能分析
  4. import time,然后直接使用time进行调用

time库包括三类函数

  1. 时间获取:time() ctime() gmtime()
  2. 时间格式化:strftime() strptime()
  3. 程序计时:sleep(),perf_counter()

时间获取

函数描述
time()获取当前时间戳,即计算机内部时间值,浮点数。time.time()
ctime()获取当前时间并以易读方式表示,返回字符串。time.ctime()
gmtime()获得当前时间,表示为计算机可处理的时间格式。time.gmtime()

时间格式化

将时间以合理方式展示出来

  1. 格式化:类似字符串格式化,需要有展示模板
  2. 展示模板由特定的格式化控制符组成
  3. strftime()方法
  4. image-20220713225851284
格式化字符串日期/时间说明值范围和实例
%Y年份0000~9999,例如:1900
m%月份01~12,例如:10
%B月份名称January~December,例如:Apirl
%b月份名称缩写Jan~Dec
%d日期0~31
%A星期Monday~Sunday
%a星期缩写Mon~Sun
%H小时(24h制)00~23
%I小时(12g制)01~12
%p上/下午AM,PM
%M分钟00~59
%S00~59

image-20220713231010510

程序计时

  1. 程序计时指测量气质动作所经历时间的过程
  2. 测量时间:perf_counter()//可以获取CPU,也就是中央处理器以其频率运行的时钟(纳秒级)
  3. 产生时间:sleep()

image-20220713231436494

image-20220713231557267

-3.5 实例4:文本进度条

简单的开始

#TextProBarV1.py
import time
scale = 10
print("-----执行开始-------")
for i in range(scale+1)
    a = '*'*i
    b = '.'*i
    c = (i/scale)*100
    print("{:^3.0f}%[{}->{}]".format(c,a,b))
    time.sleep(0.1)
print("---------执行结束-------")
    

image-20220714055016182

文本进度条单行动态刷新

  1. 刷新的本质是:用后打印的字符覆盖之前的字符
  2. 不能换行:print()需要被控制
  3. 要能回退:打印后光标退回到之前的位置\r(刷新的关键\r)
#TextProBarV1.1.py
import time
for i in range(101):#需要输出0%的状态,所以一共是101次
    print("\r{:3}%".format(i),end="")#end:输出一个信息后默认再最后增加一个换行换到下一行
    time.sleep(0.1)
    
    #\r:在打印输出字符串之前,它能使光标退回到当前行的行首

image-20220714064527368

完整代码

文本进度条 简单的开始
#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("------执行结束------")

文本进度条 单行动态刷新
#TextProBarV2.py
import time 
for i in range(101):     
    print("\r{:3}%".format(i), end="")     
    time.sleep(0.1)

文本进度条 实例完整效果
#TextProBarV3.py
import time 
scale = 50 
print("执行开始".center(scale//2, "-")) #center:将一个"-"字符填充在执行开始或者执行结束的两侧
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,'-'))

image-20220714065337488

通过命令行程序打开

image-20220714065905654