MOOC《python语言程序设计》(第15次)
基本数据类型(第三周)21.7.16
文章目录
- MOOC《python语言程序设计》(第15次)
- 基本数据类型(第三周)21.7.16
- 练习题
- 单项选择题
- 1、pow(x, 0.5)能够计算x的平方根,计算负数的平方根将产生:
- 2、以下关于字符串.strip()方法功能说明正确的是:
- 3、字符串是一个连续的字符序列,哪个选项可以实现打印字符信息的换行?
- 4、val=pow(2,1000),请用一行代码返回val结果的长度值。
- 5、下面关于time库引用不正确的是?
- 6、哪个选项不是Python语言的整数类型?
- 7、关于整数类型的4种进制表示,哪个选项的描述是正确的?
- 8、哪个选项是Python语言%运算符的含义?
- 9、哪个选项是下面代码的执行结果?
- 10、哪个选项是下面代码的执行结果?
- 程序设计题
- 学习笔记
练习题
实例3:天天向上的力量
工作日模式要努力到什么水平,才能与每天努力1%一样?
-A君: 一年365天,每天进步1%,不停歇
-B君: 一年365天,每周工作5天休息2天,休息日下降1% ,要多努力呢?
每周工作5天休息2天,计算工作日的努力参数是多少才能与每天努力1%一样。
def dayUP(df):
dayup = 1
for i in range(365):
if i % 7 in [6,0]:
dayup = dayup*(1 - 0.01)
else:
dayup = dayup*(1 + df)
return dayup
dayfactor = 0.01
while dayUP(dayfactor) < 37.78:
dayfactor += 0.001
print("工作日的努力参数是: {:.3f}".format(dayfactor))
实例4:文本进度条
采用字符串方式打印可以动态变化的文本进度条,进度条需要能在一行中逐渐变化
import time
scale = 50
print("执行开始".center(scale//2,'-'))
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,'-'))
三次方格式化
'''
三次方格式化:
获得用户输入的一个数字,可能是整数或浮点数,a,计算a的三次方值,并打印输出。
输出结果采用宽度20个字符、居中输出、多余字符采用减号(-)填充。
如果结果超过20个字符,则以结果宽度为准。
'''
num = eval(input())
print("{:-^20}".format(num**3))
星号三角形
'''
星号三角形:
读入一个整数N,N是奇数,输出由星号字符组成的等边三角形,要求:
第1行1个星号,第2行3个星号,第3行5个星号,依次类推,最后一行共N的星号。
'''
n = eval(input())
for i in range(1,n+1,2):
print("{0:^{1}}".format('*'*i, n))
凯撒密码
'''
恺撒密码:
它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符
原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26
上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26
假设用户可能使用的输入包含大小写字母a~zA~Z、空格和特殊符号
'''
instr = input()
outstr=''
for i in instr:
if 'a' <= i <= 'z':
outstr += chr( ord('a') + ((ord(i)-ord('a')) + 3 )%26 )
elif 'A' <= i <= 'Z':
outstr += chr( ord('A') + ((ord(i)-ord('A')) + 3 )%26 )
else:
outstr += i
print(outstr)
单项选择题
1、pow(x, 0.5)能够计算x的平方根,计算负数的平方根将产生:
A、程序崩溃
B、无输出
C、复数
D、ValueError错误
正确答案 C
>>> pow(-1, 0.5)
(6.123233995736766e-17+1j)
2、以下关于字符串.strip()方法功能说明正确的是:
A、按照指定字符分割字符串为数组
B、去掉字符串两侧指定字符
C、连接两个字符串序列
D、替换字符串中特定字符
正确答案 B
"去掉字符串两侧指定字符"对应功能是.strip()
"按照指定字符分割字符串为数组"对应功能是.split()
"替换字符串中特定字符"对应功能是.replace()
"连接两个字符串序列"对应功能是+操作符
3、字符串是一个连续的字符序列,哪个选项可以实现打印字符信息的换行?
A、使用\n
B、使用“\换行”
C、使用转义符\
D、使用空格
正确答案 A
换行符\n,与C语言中一致。
4、val=pow(2,1000),请用一行代码返回val结果的长度值。
A、len(pow(2,1000))
B、其他答案均不正确
C、len(val)
D、len(str(val))
正确答案 D
len(str(val))首先通过str(val)将数字类型val变成字符串,再通过len()获得字符串长度,即val的数字个数。
5、下面关于time库引用不正确的是?
A、from time import *
B、from time import strftime
C、import time
D、from * import time
正确答案 D
from * import time 应该是: from time import *
6、哪个选项不是Python语言的整数类型?
A、88
B、0x9a
C、0E99
D、0B1010
正确答案 C
十进制:一般表示
二进制:0b 或 0B 开头
八进制:0o 或 0O 开头
十六进制:0x 或 0X 开头
没有0E开头
7、关于整数类型的4种进制表示,哪个选项的描述是正确的?
A、二进制、八进制、十进制、十六进制
B、二进制、四进制、八进制、十六进制
C、二进制、四进制、八进制、十进制
D、二进制、四进制、十进制、十六进制
正确答案 A
Python不支持四进制整数
8、哪个选项是Python语言%运算符的含义?
A、x与y之商
B、x与y的整数商
C、x与y之商的余数
D、x的y次幂
正确答案 C
%是取余数,与C语言相同。
9、哪个选项是下面代码的执行结果?
name="Python语言程序设计课程"
print(name[0],name[2:-2],name[-1])
A、P thon语言程序设计课 课
B、P thon语言程序设计课 程
C、P thon语言程序设计 课
D、P thon语言程序设计 程
正确答案 D
s[N:M]表示对字符串s的切片操作,从N到M,但不包含M
10、哪个选项是下面代码的执行结果?
s=9rp'PYTHON'
phqkrnrgidppoinct0.dmgaidwiav(l"{0:3}".sa8cformat(vips)y63r4)1dc
A、(空格)PYTHON
B、PYTHON
C、PYTH
D、PYT
正确答案 B
{0:3}表示输出的宽度是3,但如果字符串超过长度3,则以字符串长度显示。
程序设计题
平方根格式化
'''
描述:
获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出。
输出结果采用宽度30个字符、右对齐输出、多余字符采用加号(+)填充。
如果结果超过30个字符,则以结果宽度为准。
'''
num = eval(input())
print("{:+>30.3f}".format(pow(num,0.5)))
字符串分段组合
'''
描述:
获得输入的一个字符串s,以字符减号(-)分割s,将其中首尾两段用加号(+)组合后输出。
'''
s = input()
ls = s.split(sep='-')
print("{}+{}".format(ls[0], ls[-1]))
学习笔记
1、数字类型及操作
1.1 整数类型:
可正可负,没有取值范围限制
4种进制表示:
–十进制;
–二进制(0b或0B开头);
–八进制(0o或0O开头);
–十六进制(0x或0X开头)
1.2 浮点数类型
浮点数间运算存在不确定尾数
如0.1+0.2–>0.30000000000004
原因:计算机中53位二进制表示小数,可以无限接近,但不完全相同
–round(x,d):对x四舍五入,d是小数截取位数,可用于浮点型计算的逻辑判断,如 if round(0.1+0.2,1)==0.3
科学计数法
–使用字母e,E作为幂,如 4.3e-3 值为0.0043; 9.6E5 值为960000.0
1.3 复数类型
复数a+bj ;a为实部,b为虚部
z = 1.23e-4 + 5.6e+89j
– z.real 获得实部
– z.imag 获得虚部
1.4 数值运算操作符
+、-、*、/、//、%、**、二元增强赋值操作符
类型间可进行混合运算,生成结果为“最宽”类型,整数->浮点数->复数
操作符 | 描述 |
---|---|
x//y | 整除,10//3 结果是 3 |
x%y | 取余,模运算,10%3 结果是 1 |
x**y | 幂运算,x的y次幂 当y是小数是,开方运算,10**0.5 结果是 根号10 |
x op= y | 即 x = x op y,其中,op为二元操作符 x +=y x -= y x *= y 等 |
1.5 数字运算函数
–abs()、divmod()、pow()、round()、max()、min()
–int()、float()、complex()
函数 | 描述 |
---|---|
abs(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),1000) = 4587 |
roud(x[,d]) | 四舍五入,d是保留小数位数,默认为0 |
max(x1,x2,…xn) | 最大值 max(1,9,5,4,3) = 9 |
min(x1,x2,…xn) | 最小值 min(1,9,5,4,3) = 1 |
<数据转换类> | |
int(x) | 将x变成整数 int(12.34) = 12; int(“12”) = 12 |
float(x) | 将x变成浮点数 float(12) = 12.0 ; float(“1.23”) = 1.23 |
complex(x) | 将x变成复数 complex(4) = 4 + 0j |
2、实例3:天天向上的力量
'''
Q1:
# 一年365天,每天进步1‰,累计进步多少呢?
# 一年365天,每天退步1‰,累计剩下多少呢?
'''
dayup = pow(1.001,365)
daydown = pow(0.999,365)
print("向上{:.2f},向下{:.2f}".format(dayup,daydown))
'''
Q2:
一年365天,每天进步5‰或1%,累计进步多少呢?
一年365天,每天退步5‰或1%,累计剩下多少呢?
'''
dayfactor = 0.005
dayup = pow( 1+dayfactor,365)
daydown = pow(1-dayfactor,365)
print("向上:{:.2f},向下:{:.2f}".format(dayup,daydown))
'''
Q3:
—年365天,一周5个工作日,每天进步1%
一年365天,一周2个休息日,每天退步1%
'''
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))
'''
Q4:
工作日模式要努力到什么水平,才能与每天努力1%一样?
A君:一年365天,每天进步1%,不停歇
B君:一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
'''
def dayup(df):
dayup = 1
for i in range(365):
if i % 7 in [6,0]:
dayup *= 1 - 0.01
else:
dayup *= 1 + df
return dayup
dayfactor = 0.01
while dayup(dayfactor) < 37.78:
dayfactor += 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))
3、字符串类型及操作
由0或多个字符组成的有序字符序列
–字符串由一对单引号或双引号表示
–字符串是字符的有序序列,可以进行索引,如“请”是“请输入”的第0个字符
3.1 字符串类型的表示
2类共4种 表示方法
–由一对 单引号 或 双引号 表示,仅表示单行字符串
–由一对 三单引号 或 三双引号表示,可表示多行字符串
索引:返回字符串中单个字符 <字符串>[M]
切片:返回字符串中一段字符子串 <字符串>[M:N:K]
转义符 \
“\b”回退
“\n”换行(光标移动至下行首)
“\r”回车(光标移动至本行首),用于单行刷新
3.2 字符串操作符
# 获取星期字符串
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("请输入星期数字(1-7):"))
pos = (weekId-1)*3
print(weekStr[pos:pos+3])
# 改进
weekStr = "一二三四五六日"
weekId = eval(input("请输入星期数字(1-7):"))
print("星期"+ weekStr[weekId-1])
3.3 字符串处理函数
函数 | 描述 |
---|---|
len(s) | 返回字符串的长度 |
str(x) | 转化为字符串类型 |
hex(x)或oct(x) | 整数的十六进制或八进制小写形式字符串 hex(425) = “0x1a9”; oct(425) = 0o651 |
chr(x) | 返回当前整数对应的字符 |
ord(“字符串”) | 返回字符对应的Unicode编码 |
Unicode编码
–Python字符串的编码方式
–统一字符编码,即覆盖几乎所有字符的编码方式
–从0到1114111 (Ox10FFFF)空间,每个编码对应一个字符
3.4 字符串处理方法
方法 | 描述 |
---|---|
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中出现的次数 "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(chars) | 从str中去掉在其左侧和右侧chars中列出的字符 "= python=".strip(" =np")结果为"ytho" |
str.join(iter) | 在iter变量除最后元素外每个元素后增加一个str ",".join("“12345”)结果为"1,2,3,4,5”#主要用于字符串分隔等 |
3.5 字符串类型的格式化
fomat方法格式化
关于<填充><对齐><宽度>
关于<,><.精度><类型>
4、模块2:time库的使用
time库包括三类函数:
–时间获取:time();ctime();gmtime();
–时间格式化:strftime();strptime();
–程序计时:sleep();perf_counter();
函数 | 说明 |
---|---|
time() | 获取当前时间戳,返回 浮点数 time.time(),结果为“1626849395.6866243” |
ctime() | 获取当前时间并以易读方式打开,返回 字符串 time.ctime(),结果为“Wed Jul 21 14:36:35 2021” |
gmtime() | 获取当前时间,表示为计算机可处理的时间格式 >>>time.gmtime() 结果为:time.struct_time(tm_year=2021, tm_mon=7, tm_mday=21, tm_hour=6, tm_min=36, tm_sec=35, tm_wday=2, tm_yday=202, tm_isdst=0) |
strftime() | tpl是格式化模板字符串,用来定义输出效果,ts是计算机内部时间类型变量 >>>t = time.gmtime() >>>time.strftime("%Y-%m-%d %H:%M:%S",t) 结果为:2021-07-21 06:38:21 |
strptime() | str是字符串形式的时间值 tpl是格式化模板字符串,用来定义输入效果>>>timeStr = ‘2018-01-26 12:55:20’ >>>time.strptime(timeStr,"%Y-%m-%d %H:%M:%S") 结果为:time.struct_time(tm year=2018,tm_mon=1,tm_mday=26,tm_hour=4,tm_min=11,tm_sec=16,tm_wday=4, tm_yday=26,tm_isdst=0) |
sleep() | s拟休眠的时间,单位是秒,可以是浮点数 >>>def wait(): time.s1eep(3.3) >>>wait() #程序将等待3.3秒后再退出 |
perf_counter() | 返回一个CPU级别的精确时间计数值,单位为秒。由于这个计数值起点不确定,连续调用差值才有意义>>>start = time.perf_counter() 318.66599499718114 >>>end=time.perf_counter() 341.3905185375658 >>>end - start 22.724523540384666 |
时间格式化:
格式化字符串 | 日期/时间说明 |
---|---|
%Y | 年份 |
%m | 月份 |
%B | 月份名称 |
%b | 月份名称缩写 |
%d | 日期 |
%A | 星期 |
%a | 星期缩写 |
%H | 小时(24h制) |
%I | 小时(12h制) |
%p | 上/下午 |
5、实例4:文本进度条
文本进度条
'''
需求分析:文本进度条
--采用字符串方式打印可以动态变化的文本进度条
--进度条需要在一行中逐渐变化
'''
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(" ------执行结束------")
单行动态刷新
(光标退回到之前位置‘\r’)
import time
for i in range(101):
print("\r{:3}%".format(i),end='') # IDLE编译环境不支持‘\r’
print(time.sleep(0.1)) # 会显示全部输出结果
完整效果
import time
scale = 50
print("执行开始".center(scale//2,'-'))
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, '-'))
不同文本进度条的设计函数
'''
1. Early Pause函数
'''
import time
import math
scale = 50
print("执行开始".center(scale//2,'-'))
start = time.perf_counter()
fxmax = scale+(1-math.sin(scale*math.pi*2+math.pi/2))/-8 # 函数最大值
for i in range(scale+1): # 改变 range的范围以可以改变每一次数值的变化幅度
k = math.sin(i*math.pi*2+math.pi/2)
fx = i + (1-k)/(-8) # 文本进度条函数
percent = round(fx/fxmax*100) # 当前值占最大值的百分比
run_time = time.perf_counter()-start # 运行时间
print('\r{:3d}%'.format(percent), end=' ')
print('▉'*(percent//2), end=' ') # 进度条,(percent//2)用来减短进度条的长度
print('{:.2f}S'.format(run_time), end=' ')
time.sleep(0.1) # 可以增大睡眠时间以便观测数值变化
print("\n" + "执行结束".center(scale // 2, '-'))
'''
#------------------------------------------------------
2. Inverse Fast Power函数
'''
import time
scale = 50
print("执行开始".center(scale//2,'-'))
start = time.perf_counter()
fxmax = round(scale + ((1 - scale) ** 3 * -1)) # 函数值最大值
for i in range(scale+1): # 改变 range的范围以改变每一次数值的变化幅度
fx = round(i + ((1-i)**3*-1)) # 文本进度条函数
percent = round(fx/fxmax*100) # 当前值占最大值的百分比
run_time = time.perf_counter()-start # 运行时间
print('\r{:3d}%'.format(percent), end=' ')
print('▉'*(percent//2), end=' ') # 进度条,(percent//2)用来减短进度条的长度
print('{:.2f}S'.format(run_time), end=' ')
time.sleep(0.1) # 可以增大睡眠时间以观测数值变化
print("\n" + "执行结束".center(scale // 2, '-'))
资料来源:
Python语言程序设计_北京理工大学_中国大学MOOC(慕课) https://www.icourse163.org/course/BIT-268001