python语言程序设计基础
部分截图来自 北京理工大学 嵩天 的python基础设计课程的ppt,仅做个人笔记使用,特此声明。
三 基本数据类型
数字类型
-
整数类型 与数学中整数概念一致,可正可负,没有取值范围限制
四种进制表示形式:十进制,二进制,八进制,十六进制
-
浮点数类型 与数学中实数概念一致
带有小数及小数的数字,浮点数间运算存在不确定尾数
round(x,d): 对x四舍五入,d是小数截取位数
浮点数可以采用科学记数法表示
-
复数类型 与数学复数的概念一致。
在python中,虚数的复数部分通过后缀“j”或”J”来表示,例如 12.3 +4j
复数类型中实数部分和虚数部分的数值都是浮点类型。对于复数,可以用z.real 和 z.imag来分别获得它的虚数部分和实数部分。
扩展关系:整数 -> 浮点数 -> 复数
整数和浮点数混合运算,输出结果是浮点数;整数和浮点数与复数混合运算,输出结果是复数
思考与练习
python浮点数精度问题
[只有1%的人搞懂过Python 浮点数陷阱_web开发与Python-CSDN博客](https://blog.csdn.net/meiguanxi7878/article/details/94658009?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-2-94658009.nonecase&utm_term=python 浮点用什么表示&spm=1000.2123.3001.4430)
(4条消息) 从0.1加0.2不等于0.3谈Python浮点数的前世今生_Python作业辅导员 - 天元浪子【许向武】-CSDN博客
python进制转换
(4条消息) Python进制转换详细介绍_Wonderful-CSDN博客_python进制转换
python 数字的格式化输出
Python 中如何实现数字的格式化输出? (pythonf.cn)
3.2 Python语言中整数1010的二进制,八进制和十六进制表示分别是什么?
进制 | 数值 | 实现代码 |
---|---|---|
十进制 | 1010 | print(f'{1010:d}') |
二进制 | 0b1111110010 | print(f'{1010:#b}') |
八进制 | 0o1762 | print(f'{1010:#o}') |
十六进制 | 0o3f2 | print(f'{1010:#x}') |
3.3 Python语言中-77.的科学记数法是什么?4.3e-3的十进制表示是什么?
结果 | 实现代码 |
---|---|
-7.700000e+01 | print(f'{-77.:e}') |
0.004300 | print(f'{(4.3e-3):f}') |
3.4 复数2.3e+3-1.3e-3j的实部和虚部分别是什么?用什么方法提取一个复数的实部和虚部?
代码 | 结果 | 含义 |
---|---|---|
print(2.3e+3-1.34e-3j) | (2300-0.00134j) | 运算结果 |
print(2.3e+3-1.34e-3j.real) | 2300.0 | 实部 |
print((2.3e+3-1.34e-3j).imag) | -0.00134 | 虚部,注意要加一个小括号给虚数 |
数字类型的操作
内置的数值运算操作符
操作符及使用 | 描述 |
---|---|
(+) | 加 |
(-) | 减 |
(*) | 乘 |
(/) | 除,10/3结果是3.3333 |
(//) | 整数除,x与y的整数商 10//3 结果是3 |
% | 求余数,求模,10%3结果是1 |
x**y | 幂函数运算 |
内置的数值运算函数
函数及使用 | 描述 |
---|---|
abs(x) | 绝对值,复数的绝对值是二维坐标位置到原点的距离 |
divmod(x,y) | 商余,(x//y,x%y),同时输出商和余数 |
pow(x,y[,z]) | 幂余,(x**y)%z,[..]表示参数z可以省略 |
round(x[,d]) | 四舍五入,d是保留小数位数,默认值为0 |
(max(x_1,x_2,cdots,x_n)) | 最大值,返回(x_1,x_2,cdots,x_n)中的最大值,n不限 |
(min(x_1,x_2,cdots,x_n)) | 最小值,返回(x_1,x_2,cdots,x_n)中的最小值,n不限 |
内置的数字类型转换函数
函数及使用 | 描述 |
---|---|
int(x) | 将x变成整数,舍弃小数部分 |
float(x) | 将x变成浮点数,增加小数部分 |
complete(x) | 将x变成复数,增加虚数部分 |
思考与练习
python运算符优先级与结合性
当一个表达式中出现多个运算符时,Python 会先比较各个运算符的优先级,按照优先级从高到低的顺序依次执行;
当遇到优先级相同的运算符时,再根据结合性决定先执行哪个运算符:如果是左结合性就先执行左边的运算符,如果是右结合性就先执行右边的运算符。
3.5 思考各操作运算符的优先级,计算下列表达式
表达式 | 运算顺序 | 结果 |
---|---|---|
(30-3**2+8//3**2*10) | (30-(3^2)+[8//(3^2)]*10) | 21 |
3*4**2/8% 5 | ([3*(4^2)/8 ]mod 5) | 1.0 |
2 ** 2 ** 3 | (2^{2^3}=2^{8}) | 256 |
(2.5+1.25j)*4j/2 | (frac{(2.5+1.25j)*4j}{2}) | (-2.5+5j) |
3.6 请将下列数学表达式用Python程序写出来,并运算结果
数学表达式 | Python代码 | 结果 |
---|---|---|
(frac{z^4+7-3*4}{5}) | print((2* *4+7-3 * 4)/5) | 2.2 |
((1+3^2)* (16mod7)/7) | print((1+3**2)*(16%7)/7) | 2.857142857142857 |
3.7 假设x=1 ,x*=3+5 **2的运算结果是什么
表达式 | 运算顺序 | 结果 |
---|---|---|
x*=3+5 **2 | (x={x *[ 3+(5^{2})]}) | 28 |
模块1: math库
表3.5 math库中的数学常数 共4个
常数 | 数学表示 | 描述 |
---|---|---|
math.pi | (pi) | 圆周率,值为3.141592565358979 |
math.e | (e) | 自然对数,值为2.718281828459045 |
math.inf | $ infty $ | 正无穷大,负无穷大为- math.inf |
math.nan | 非浮点数标记,NAN(not a Number) |
表3.6 math库的数值表示函数 共16个
函 数 | 数学表示 | 描述 |
---|---|---|
math.fabs(x) | $ | x |
math.fmod(x,y) | (x \% y) | 返回x与y的模 |
math.fsum([x,y,...]) | (x+y+cdots) | 浮点数精确求和 |
math.ceil(x) | (lceil x ceil) | 向上取整,返回不小于x的最小整数 |
math.floor(x) | (lfloor x floor) | 向下取整,返回不大于x的最小整数 |
math.factorial(x) | (x !) | 返回x的阶乘,如果x是小数或负数,返回ValueRrror |
math.gcd(a,b) | 返回a与b的最大公约数 | |
math.frexp(x) | (x = m * 2^e) | 返回(m,e),当x=0,返回(0,0) |
math.ldexp(x,i) | (x * 2^i) | 返回(x * 2^i)运算值,mth.frexp(x)函数的反运算 |
math.modf(x) | 返回x的小数和整数部分 | |
math.trunc(x) | 返回x的整数部分 | |
math.copysign(x,y) | $ | x |
math.isclose(a,b) | 比较a和b的相似性,返回True或False | |
math.isfinite(x) | 当x为无穷大,返回True,否则,返回False | |
math.isinf(x) | 当x为正数或负数无穷大,返回False;否则,返回True | |
math.isnan(x) | 当x是NaN,返回True;否则,返回False |
表3.7 math库的幂对数函数 共8个
函数 | 数学表示 | 描述 |
---|---|---|
math.pow(x,y) | (x^y) | 返回x的y次幂 |
math.exp(x) | (e^x) | 返回e的x次幂,e是自然对数 |
math.xpml(x) | (e^x-1) | 返回e的x次幂减1,e是自然对数 |
math.sqrt(x) | (sqrt x) | 返回x的平方根 |
math.log(x,[base]) | (log_{base}x) | 返回x的对数值,只输入x时,返回自然对数,即(ln x) |
math.log1p(x) | (ln(1+x)) | 返回1+x 的自然对数值 |
math.log2(x) | (log x) | 返回x的2对数值 |
math.log10(x) | (log_{10}x) | 返回x的10对数值 |
表3.8 math库的三角运算函数 共16个
函数 | 数学表示 | 描述 |
---|---|---|
math.degrees(x) | 角度x的弧度转角度值 | |
math.radians(x) | 角度x的角度转弧度 | |
math.hypot(x,y) | (sqrt{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) | (arcos(x)) | 返回x的反余弦函数值,x是弧度值 |
math.atan(x) | (arctan(x)) | 返回x的反正切函数值,x是弧度值 |
math.atan2(y,x) | (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) | (cosh(x)) | 返回x的双曲余弦函数值 |
math.atanh(x) | (tanh(x)) | 返回x的双曲正切函数值 |
表3.9 math库的高等特殊函数 4个
函数 | 数学表达 | 描述 |
---|---|---|
math.erf(x) | (frac{2}{sqrt{pi}}int_{0}^{x}{e^{-t^2}dt}) | 高斯误差函数,应用于概率论、统计学等领域 |
math.refc(x) | (frac{2}{sqrt{pi}}int_{x}^{infty}{e^{-t^2}dt}) | 余补高斯误差函数,math.erfc(x)=1 - math.erf(x) |
math.gamma(x) | (int_{0}^{infty}{x^{t-1}e^{-x}dx}) | 伽马函数(Gamma),也叫欧拉第二积分函数 |
math.lgamma(x) | (ln (gamma(x))) | 伽马函数的自然对数 |
思考与练习
round函数
round函数,对浮点数进行近似取值,保留几位小数,第一个参数是一个浮点数,第二个参数是保留的小数位数,可选,如果不写的话默认保留到整数。python3.5的doc中,文档为"values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice." 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。
除非对精确度没什么要求,否则尽量避开用round()函数。近似计算我们还有其他的选择:
- 使用math模块中的一些函数,比如math.ceiling(天花板除法)。
- python自带整除,python2中是/,3中是//,还有div函数。
- 字符串格式化可以做截断使用,例如 "%.2f" % value(保留两位小数并变成字符串……如果还想用浮点数请披上float()的外衣)。
- 数字的格式化输出, 例如f'{2.501:.2f}' 具体参考上文
- 当然,对浮点数精度要求如果很高的话,请用decimal模块
3.8 请利用math库运行下面语句,获得计算结果
-
math.sin(2*math.pi)
代码
print(math.sin(2*math.pi))
结果 (-2.4492935982947064e-16)
进行格式化输出
print(f'{math.sin(2*math.pi):f}')
结果 (-0.000000)
分析:在数学中sin(2pi)应该为0,但是math库进行的是浮点数运算,得到的结果无限接近于0,进行浮点数格式化输出结果就是-0.000,这个负号也蛮有意思,因为计算结果是负数,所以格式化之后依然是负数
-
math.floor(-2.5 )
代码
print(math.floor(-2.5))
floor是向下取整,结果是-(-3)
-
math.ceil(3.5+math.floor(-2.5))
代码
print(math.ceil(3.5+math.floor(-2.5)))
ceil是向上取整,结果是(1)
-
round(math.fabs(-2.5))
代码
print(round(math.fabs(-2.5)))
round函数 结果是(2)
-
math.sqrt(math.pow(2,4))
代码
print( math.sqrt(math.pow(2,4)) )
结果是(4.0),math模块计算的结果是浮点数,pow计算幂方,sqrt开平方
-
math.log(math.e)
代码:
print( math.log(math.e) )
结果是(1)
-
math.gcd(12,9)
代码
print( math.gcd(12,9) )
结果是(3),gcd计算最大公约数
-
math.fmod(36,5)
代码
import math print( math.fmod(36,5) )
fmod 求模运算
3.9 利用math库将47度角转化为弧度制,并将结果赋值给一个变量
代码
rad = math.radians(47)
print(rad)
3.10 利用math库将(frac{pi}{7})的弧度值转为角度值,并将结果赋值给一个变量
代码
deg = math.degrees(math.pi/7)
print(deg)
代码示例3—— 天天向上的力量
示例代码3.1
问题描述:
一年265天,以第一天的能力值为基数,记为1.0,当好好学习时能力值相比前一天提高千分之一,当没有学习时的能力值比前一天下降千分之一,每天努力和每天放任,一年下来的能力值相差多少呢?
分析:
天天向上是((1+0.001)^{365}),放任或向下的力量是((1-0.001)^{365})
代码:
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))
示例代码3.2
问题描述:
一年365天,如果好好学习时能力值相比前一天提高千分之五,当放任时相比前一天下降千分之五,效果相差多少呢?
分析:
天天向上是((1+0.005)^{365}),放任或向下的力量是((1-0.005)^{365})
代码:
import math day_up = math.pow(1.0+0.005,365) #每天提高0.005 day_down = math.pow(1.0-0.005,365) #每天减少0.005 print("向上: {:.2f}, 向下: {:.2f}。".format(day_up,day_down))
代码示例3.3
问题描述:
一年365天,如果好好学习时能力值相比前一天提高百分之一,当放任时相比前一天下降百分之一,效果相差多少呢?
分析:
天天向上是((1+0.01)^{365}),放任或向下的力量是((1-0.01)^{365})
我们发现上面的代码除了每天努力的大小不一样,代码其余部分是完全相同的。我们可以使用dayFactor这个变量来表示这个值,来提高代码的重新使用性。
代码:
import math dayFactor = 0.01 day_up = math.pow((1.0+dayFactor),365) #每天提高dayFactor day_down= math.pow((1.0-dayFactor),365) #每天放任dayFactor print("向上: {:.2f}, 向下:{:.2f} 。".format(day_up,day_down))
代码示例3.4
问题描述:
一年365天,一周5个工作日,如果每个工作日都很努力,可以提高百分之一,仅在周末放松一下,能力值下降百分之一,效果如何呢?
分析:
使用循环实现,被7整除,余数为1到5认为是工作日,努力程度应该为(1+dayFactor),余数为6,0认为是休息日,努力程度应为(1-dayFactor)
代码:
import math day_up, dayFactor = 1.0, 0.01 for i in range(365): if i % 7 in [0,6]: day_up = day_up *(1-dayFactor) else: day_up = day_up *(1+dayFactor) print("向上5天向下2天的力量: {:.2f}。".format(day_up))
代码示例3.5
问题描述:
如果对示例代码3.4的结果感到意外,那么自然会有如下疑问:每周工作5天,休息两天,休息日水平下降0.01,工作日要努力到什么程度,一年后的水平才能与每天努力百分之一取得的效果一样呢?
分析:
我门采用最最简单的方法,暴力尝试。我门发现,暴力尝试的每一次都需要使用前面写过的函数体,所以我们可以通过保留字def定义一个求解的函数,这样将增强代码的可读性
代码:
#代码示例 天天向上3.5 import math def dayUP(dayFactor): day_up = 1.0 for i in range(365): if i % 7 in [0,6]: day_up = day_up * (1.0 - 0.01) else: day_up = day_up * (1.0 + dayFactor) return day_up dayFactor = 0.01 while(dayUP(dayFactor)<37.78): dayFactor += 0.001 print("每天努力参数是: {:.3f}。".format(dayFactor))
思考与练习
3.12 一年365天,初始水平为1.0,每工作一天水平增加N,不工作时水平不下降,一周连续工作4天,请编写程序运行结果并填写下表:
N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
---|---|---|---|---|---|---|---|---|---|---|
年终值 | 1.231 | 1.515 | 1.865 | 2.294 | 2.822 | 3.470 | 4.267 | 5.246 | 6.447 | 7.922 |
代码
#思考与练习 3.12
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [1,2,3,4]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
3.13 一年365天,初始水平为1.0,每工作一天水平增加N,不工作时水平不下降,一周连续工作5天,请编写程序运行结果并填写下表:
N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
---|---|---|---|---|---|---|---|---|---|---|
年终值 | 1.297 | 1.681 | 2.179 | 2.823 | 3.657 | 4.737 | 6.133 | 7.938 | 10.723 | 13.291 |
代码
#思考与练习 3.13
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [1,2,3,4,5]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
3.14 一年365天,初始水平为1.0,每工作一天水平增加N,不工作时水平不下降,一周连续工作6天,请编写程序运行结果并填写下表:
N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
---|---|---|---|---|---|---|---|---|---|---|
年终值 | 1.367 | 1.869 | 2.554 | 3.489 | 4.764 | 6.504 | 8.876 | 12.110 | 16.517 | 22.521 |
代码
#思考与练习 3.14
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [0,1,2,3,4,5]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
3.15 一年360天,初始水平为1.0,以每个月30天计算,在每个月初连续十天里,每工作一天水平增加N,该月其他时间工作与否都不增加水平值 ,请编写程序运行结果并填写下表:
N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
---|---|---|---|---|---|---|---|---|---|---|
年终值 | 1.127 | 1.271 | 1.433 | 1.615 | 1.819 | 2.050 | 2.310 | 2.602 | 2.930 | 3.300 |
代码
#思考与练习 3.15
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(360):
if i % 30 in [0,1,2,3,4,5,6,7,8,9]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
字符串类型及操作
字符串的表示
-
单引号字符串:‘单引号表示,可以使用“双引号”作为字符串的一部分’
-
双引号字符串:“双引号表示,可以使用‘单引号’作为字符串的一部分”
-
三引号字符串:“‘三引号表示可以使用“双引号”
‘单引号’
也可以换行
“’‘
print('单引号表示,可以使用"双引号"作为字符串的一部分')
print("双引号表示,可以使用'单引号'作为字符串的一部分")
print('''三引号表示可以使用"双引号'
'单引号'
也可以换行
''')
-
访问字符,python使用方括号[]来访问字符串
- 正向递增序号,最左侧字符为0,向右递增,最右侧字符序号为L-1
- 反向递减序号,最右侧字符序号为-1,想做依次递减,最左侧字符序号为-L
-
区间访问(切片),采用[N:M]格式,表示字符串从N到M(不包含M)的子字符串,其中,N和M为字符串的索引序号,可以混合使用正序和逆序序号.如果表示中M或N索引缺失,则表示字符串把开始或结束索引值设置为默认值.
切片访问完整形式应该为[开始:结束:步长],省略步长为1
基本的字符串操作符 5个
操作符 | 描述 |
---|---|
x + y | 连接两个字符串x和y |
x * n 或 n * x | 复制n次字符串x |
x in s | 如果x是s的子串,返回True,否则返回False |
str[i] | 索引,返回第i个字符 |
str[M:N] | 切片,返回索引第M到N的子串,其中不包含N |
print("Python语言"+"程序设计")
name = "Python语言"+"程序设计"+"基础"
print(name)
print("Good"* 3)
print("Python语言"in name)
print('Y' in "Python语言")
微实例3.1 获取星期字符串
描述:程序读入一个表示星期几的数字(1~7),输出对应的星期字符串名称。
例如,输入3,返回”星期三”
代码:
#微实例3.1 weekStr = "星期一星期二星期三星期四星期五星期六星期日" weekID = eval(input("请输入星期数字(1~7):")) pos = (weekID-1)*3 print(weekStr[pos:pos+3])
思考:微实例3.1通过在字符串中截取适当子串实现星期名称的查找。问题关键是找出子串的剪切位置。因为每个星期的缩写都是3个字符组成,所以较容易。使用字符串作为查找表的缺点是,所剪切的子字符串长度必须相同。
代码:
#微实例3.1改进,采用列表 week= ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"] weekID = eval(input("请输入星期数字(1~7):")) pos = (weekID-1) print(week[pos])
特殊的格式化控制字符
控制字符 | 含义 |
---|---|
a | 蜂鸣,响铃 |
回退,向后退一格 | |
f | 换页 |
换行,光标移动到下行首页 | |
回车,光标移动到本页首行 | |
水平制表 | |
v | 垂直制表 |