第三周

  基本数据类型

  数字类型及操作:

  整数类型,浮点数类型,复数类型,数值运算操作符,数值运算函数

  整数类型:与数学中的整数概念一致

  可正可负,没有取值范围限制

  pow(x,y)函数:计算xy想算多大算多大

  

  整数类型的四种进制表示形式

  十进制:1010,99,-217

  二进制以0b或0B开头:0b010,-0B101

  八进制以0o或0O开头:0o123,-0O456

  十六进制以0x或0X开头:0x9a,-0X89

  我们需要了解:整数无限制、pow函数、四种进制表示形式

 

  浮点数类型:与数学中的实数概念一致

  带有小数点以及小数的数字

  浮点数的取值范围和小数精度都存在限制,但常规计算可以忽略

  取值范围数量级约-10^308至10^308,精度数量级为10^-16

  浮点数类型运算存在不确定尾数,不是bug,这个现象涉及到计算机组成原理里面的内容了,不详细展述

  显示如下图所示:

  

 

 

   出现这种情况的原因:

  计算机以53位二进制表示小数部分,约10-16

  0.1

  0.000110011001100110011001100110011001100110011001100110011010(二进制表示)

  0.100000000000000005551115123125782702119158340454101523    (十进制表示)

  二进制表示小数,可以无限接近,但不完全相同

  0.1+0.2 其结果无限接近0.3,但可能存在位数

  

  round(x,d):对x四舍五入,d是小数截取位数

  浮点数间运算及比较用round()函数辅助

  不确定尾数一般发生在10-16左右,所以round( )十分有效

  使用字母e或E作为幂的符号,以10为基数,格式如下:

  <a>e<b>  表示a*10b

  

  通过这种方式,可以表示较大或者非常小的浮点数

  我们需要了解:

   1、取值范围和精度基本无限制

   2、运算存在不确定尾数,round()

   3、科学计数法表示

 

  复数类型:与数学中的复数概念一致

  如果x2=-1,那么x的值是什么?

   定义j=√(-1),以此为基础,构建数学体系

   a+bj被称为复数,其中,a是实部,b是虚部

  实部:z.real获得实部

  虚部:z.imag获得虚部

  

  复数是进行空间变换,尤其是和复变函数相关的科学体系中,最常用的一种类型

  

  数值运算操作符:是完成运算的一种符号体系。


操作符及使用 描述
x + y 加,x与y之和
x - y 减,x与y之差
x * y 乘,x与y之积
x / y 除,x与y之商(结果为浮点数) 10/3结果为3.3333333333333335
x // y 整数除,x与y之整数商  10//3结果是3

 

操作符及使用 描述
+ x x本身
- y y的负值
x % y 余数,模运算  10%3结果为1

x ** y

与pow(x,y)的用法相同

幂运算,x的y次幂,xy
当y是小数时,开方运算  10**0.5结果为√10

  

  二元操作符有对应的增强赋值操作符:对两个数进行运算后,更改其中的一个数

增强操作符及使用 描述
x op= y 即  x = x op y,其中,op为二元操作符

x += y  x -= y  x *= y  x /= y

x //= y  x %= y  x **= y

>>> x = 3.1415

>>> x **= 3  #与 x = x**3 等价

31.006276662836743

 

 

  数字间的类型关系:

  类型间可进行混合运算,生成结果为“最宽”类型:

   三种类型存在一种逐渐“扩展”或“变宽”的关系:

    整数  ->  浮点数  ->  复数

  例如:123 + 4.0 = 127.0(整数+浮点数 = 浮点数)

 

  数值运算函数:

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

函数及使用 描述
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,3,5) 结果为2

同时,可以用这种方法,确定大额数值的最后几位

pow(3,pow(3,99),10000) 结果为4587

round(x[,d])

四舍五入,d是保留小数位数,默认值为0

round(-10.123,2) 结果为 -10.12

 

遵循四舍六入五成偶原则,

被约的5前面的数值若为偶数时,则不进一,

若被约的5前面的数值为奇数,则进一;

若被约5后面有非0数值时,则都会进一

 

max(x1,x2, ... ,xn)

最大值,返回x1,x2, ... ,xn中的最大值,n不限

max(1,9,5,4,3) 结果为9

min(x1,x2, ... ,xn)

最小值,返回x1,x2, ... ,xn中的最大值,n不限

min(1,9,5,4,3) 结果为1

int(x)

将x变成整数,舍弃小数部分,不进行四舍五入

int(123.56) 结果为123;int("123") 结果为123

int("123.21")会得到ValueError

float(x)

将x变成浮点数,增加小数部分

float(12) 结果为12.0;float("1.23") 结果为1.23;

float("123") 结果为123.0

complex(x)

将x变为复数,增加虚数部分

complex(4) 结果为 4+0j

 

  “天天向上的力量”问题分析:

  基本问题:持续的价值

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

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

  问题一:千分之一的力量

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

   运行结果如下图所示

  

 

   1.001365=1.44  0.999365=0.69

  千分之一的力量,最后的结局将近是两倍,不可小觑

 

  问题二:千分之五和百分之一的力量

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

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

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

 

  这就是使用变量的好处,只要改一个数字便可解决两个问题

  运行结果如下图:

 

 

  问题三:工作日的力量

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

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

  这种休息日的力量如何呢?

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

 

  运行结果如下图所示:

 

  尽管进步百分之一,但由于休息日的退步导致,效果在千分之一和千分之五之间

 

  问题四:工作日的努力

  工作日要努力到什么程度,才能与每天努力1%一样

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

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

    for..in..(计算思维) => def..while..(“笨办法”试错)

  

#DayDayUp4.py
def dayUP(fd):
    dayup = 1
    for i in range(365):
        if i%7 in [0,6]:
            dayup = dayup*(1 - 0.01)
        else:
            dayup = dayup*(1 + fd)
    return dayup
dayfactor = 0.01
while dayUP(dayfactor) < 37.78:
    dayfactor += 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))

   运行结果如下图所示:

  工作日模式,每天要努力到1.9%,

  相当于365模式每天1%的一倍!

  1.01365=37.78  1.019365=962.89

 

 

  字符串类型和操作单元

  字符串类型的表示:

  字符串:由0个或多个字符组成的有序字符序列

  字符串由一对单引号或一对双引号表示(python默认使用单引号表示)

  "请输入带有符号的温度值:"或者 'C'

  字符串是字符的有序序列,可以对其中的字符进行索引

  "请"是"请输入带有符号的温度值:" 的第0个字符

  

  字符串的两类4种表示方法

  由一对单引号或双引号表示,仅表示单行字符串

  "请输入带有符号的温度值:"或者 'C'

  由一对三单引号或三双引号表示,可以表示多行字符串

  '''Python

        语言 '''

  """Python

        语言 """

  我们前面提到过,三单引号或者三双引号是多行注释的一种说法,实际上,在Python语言中,实际上并没有真正提供多行注释的表示方式。三单引号构成的就是字符串,但是如果在程序中出现了一个字符串,这个字符串没有给到某一个变量中,或者这个字符串并没有进行任何操作,那么它可以当作注释来使用。

 

  那么为什么要设置两类四种表示方法呢

   如果希望在字符串中包含双引号或单引号呢?

  '这里有个双引号(")' 或者 "这里有个单引号(')"

   如果希望既包括双引号又包括单引号呢?

  '''这里既有单引号(')又有双引号(")'''

 

  字符串的序号:正向递增序号和反向递减序号

  

 

  字符串的使用:使用[ ]获取字符串的一个或多个字符

  索引:返回字符串中的单个字符  <字符串>[M]

  切片:返回字符串中的一段字符子串  <字符串>[M:N]

 

  字符串切片高级用法:使用[M:N:K]根据步长对字符串进行切片

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

   "零一二三四五六七八九十"[:3] 结果是 "零一二"

   "零一二三四五六七八九十"[-3:] 结果是 "八九十"

   "零一二三四五六七八九十"[-3:-1] 结果是 "八九"

  <字符串>[M:N:K],根据步长k对字符串进行切片

   "零一二三四五六七八九"[1:8:2] 结果是 "一三五七"

   "零一二三四五六"[::-1] 结果是"六五三二一零"

 

  字符串的特殊字符:

  转义符\

  转义符表示特定字符的含义:

  \b  退格符 使当前的光标向前回退一个位置,再用退格符后的字符进行替换,在IDLE中不能正常使用

  \n  换行

  \r  回车 光标回到本行最开始的位置

  \t  制表符 代表四个空格,也就是一个tab;它的作用是对齐表格数据的各列,可以在不使用表格的情况下,将数据上下对齐

操作符及使用 描述
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编码:python字符串的编码方式

   统一字符编码,几乎覆盖了所有字符的编码方式

   从0到1114111(0x10FFFF)空间,每个编码对应一个字符

   python字符串中每个字符都是unicode编码字符

  一些有趣的例子

 

 

  字符串处理方法

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

   “方法”特指<a>.<b>()风格中的函数<b>()

   方法本身也是函数,但与<a>有关,以<a>.<b>()风格使用

   字符串及变量也是<a>,存在一些方法

  <a>.<b>风格是一种面向对象的使用风格,其中<a>是对象,<b>是某一种对象能够提供的功能,我们称之为方法,方法需要用"."的形式执行

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

方法及使用

描述

str.lower()或str.upper()

返回字符串的副本,全部字符小写/大写

"AbCdEfGh".lower()结果为”abcdefgh“

str.split(sep=None)

返回一个列表,由str根据sep被分隔的部分组成

"A,B,C".split(",")结果为['A','B','C']

str.count(sub) 返回子串sub在str中出现的次数
str.replace(old,new) 返回字符串str副本,所有子串被替换为new
str.center(width[,fillchar])

字符串str根据宽度width居中,fillchar可选

"python".center(20,"=")结果为

'=======python======='

str.strip(chars)

从str中去掉在其左侧和右侧chars中列出的字符

"= pypthnon=".strip(" =np")结果为

"ypthno"

str.join(iter)

在iter变量除最后元素外,每个元素后增加一个str

",".join("12345")结果是

"1,2,3,4,5"#主要用于字符串分隔等

  字符串类型的格式化

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

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

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

  

  

   { }括起来的称为槽,默认顺序为0,1,2

   也可以通过自定义的方式确定槽的顺序,如下图

   槽之间的关系为,将format()函数中的参数,按照对应的顺序,填到模板字符串的槽中

   

 

  槽内部使用格式化的控制标记,进行相关控制

  槽内部对格式化的配置方式

  {<参数序号>:<格式控制标记>}

<填充> <对齐> <宽度> <,> <.精度> <类型>
引导符号 用于填充的单个字符

<左对齐

>右对齐

^居中对齐

槽设定的输出宽度 数字的千位分隔符 浮点数小数精度或字符串最大输出长度

整数类型

b(二进制形式),c(字符形式,Unicode编码形式),d(十进制形式),

o(八进制形式),x(十六进制形式),X(大写的十六进制)

浮点数类型

e(科学计数法e形式),E(科学计数法E形式),

f(非科学计数法形式),%(百分数形式)

 

 

 

  time库的使用

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

   1、用于计算机时间的表达

   2、提供获取系统时间并格式化输出功能

   3、提供系统级精确计时功能,用于程序性能分析

import time
time.<b>()

  time库包括三类函数

   时间获取:time()、ctime()、gmtime()

   时间格式化:strftime()、strptime()

   程序计时:sleep()、perf_counter()

  时间获取  先 import time或from time import*

函数 描述
time()

获取当前时间戳,即计算机内部时间值,浮点数

>>>time.time()

1646762035.3120291 每个时间戳都以自1970年1月1日0:00开始,到当前这一时刻为止的一个以秒位单位的数值

ctime()

获取当前时间并以易读方式表示,返回字符串

>>>time.ctime()

'Wed Mar  9 01:59:30 2022'  获取的是系统时间(北京时间)

gmtime()

获取当前时间,表示为计算机可处理的时间格式

>>>time.gmtime()

time.struct_time(tm_year=2022, tm_mon=3, tm_mday=8, tm_hour=18, tm_min=1, tm_sec=38, tm_wday=1, tm_yday=67, tm_isdst=0)

获取的是格林尼治时间(英国的标准时间)

  时间格式化:将时间以合理的方式展示出来

   格式化:类似字符串的格式化,需要有展示模板

   展示模板由特定的格式化控制符组成

  strftime()方法

函数 描述
strftime(tpl,ts)

tpl是格式化模板字符串,用来定义输出效果

ts是计算机内部时间类型变量

>>>t = time.gmtime()

>>>time.strftime("%Y-%m-%d %H:%M:%S",t)

'2022-03-08 18:07:46'

   格式化控制符

格式化字符串 日期/时间说明 值范围和实例
%Y 年份 0000-9999,例如:1900
%m 月份 01-12,例如:10
%B 月份名称 January-December,例如April
%b 月份名称缩写 Jan-Dec,例如Apr
%d 日期 01-31,例如25
%A 星期 Monday-Sunday,例如wednesday
%a 星期缩写 Mon-Sun,例如:Wed
%H 小时(24h制) 00-23,例如:12
%h 小时(12h制) 01-12,例如:7
%p 上/下午 AM,PM,例如PM
%M 分钟 00-59,例如26
%S 00-59,例如26

  strptime()方法
函数 描述
strptime(str,tpl)

str是字符串形式的时间值

tpl是格式化模板字符串,用来定义输入效果

>>>timeStr='2022-03-09 02:35:23'

>>>time.strptime(timeStr,"%Y-%m-%d %H:%M:%S")

time.struct_time(tm_year=2022, tm_mon=3, tm_mday=9, tm_hour=2, tm_min=35, tm_sec=23, tm_wday=2, tm_yday=68, tm_isdst=-1)

  

  time函数用一个元组装起来的9组数字处理时间:

 

  一个小例子

from time import*
t = gmtime()
ftime1 = strftime("%Y-%m-%d %H:%M:%S",t) #格式化成2016-03-20 11:45:39形式
ftime2 = strftime("%a %b %d %H:%M:%S %Y",t) #格式化成Sat Mar 28 22:24:24 2016形式
timeStr1='2022-3-9 2:57:34'
timeStr2='Wed Mar 9 2:57:34 2022'
time3 = strptime(timeStr1,"%Y-%m-%d %H:%M:%S")
time4 = mktime(strptime(timeStr2, "%a %b %d %H:%M:%S %Y")) #它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数
print('格式化日期输出1:', ftime1)
print('格式化日期输出2:', ftime2)
print('计算机可处理时间格式:',time3)
print('计算机内部时间值:',time4)

  运行结果如下图所示:

  

 

 

 

 

 

程序计时:程序计时应用广泛。

1、程序计时指测量起止动作所经历的时间过程

2、测量时间:perf_counter()

3、产生时间:sleep()

函数 描述
perf_counter()

返回一个CPU级别的精确时间计数值,单位为秒

由于这个基数值起点不确定,连续调用差值才有意义

>>>start=time.perf_counter()

>>>end=time.perf_counter()

>>>end-start

4.990869345020572

sleep(s)

s拟休眠的时间,单位是秒,可以是浮点数

>>>def wait():

  time.sleep(3.3)

>>>wait()  #程序3.3秒后再退出

 

posted @ 2022-01-14 00:58  半面瘫  阅读(237)  评论(0)    收藏  举报