实验1 Python开发环境使用和编程初体验

四、实验结论

1. 实验任务1

task1_1.py

# print输出的几种用法
#
用法1:用于输出单个字符串或单个变量 print('hey, u') # 用法2: 用于输出多个数据项,用逗号分隔 print('hey', ' u') x,y,z = 1,2,3 print(x, y, z) # 用法3: 用户混合字符串和变量值 print('x = %d, y = %d, z = %d' %(x,y,z)) # 方式1: 传统c风格 print('x = {}, y = {}, z = {}'.format(x,y,z)) # 方式2: s.format()方法 print(f'x = {x}, y = {y}, z = {z}') # 方式3: f-string方式 # 其它: 输出后是否换行 print(x) # 默认输出后换一行 print(y) print(z) print(x, end=' ') # 输出结束后,不换行;通过end指定数据项之间的分隔符 print(y, end=' ') print(z)

task1_2.py

# 使用字符串的format()方法,对输出数据项进行格式化
x1, y1 = 1.2, 3.57
x2, y2 = 2.26, 8.7
# 输出1
print('{:-^40}'.format('输出1'))# {:-^40}控制输出数据格式: 宽度占40列,居中对齐,空白处用-补齐
print('x1 = {}, y1 = {}'.format(x1, y1))
print('x2 = {}, y2 = {}'.format(x2, y2))
# 输出2
print('{:-^40}'.format('输出2')) # {:-^40}控制输出数据格式: 宽度占40列,居中对齐,空白处用-补齐
print('x1 = {:.1f}, y1 = {:.1f}'.format(x1, y1)) # {:.1f}控制小数输出精度,保留1位小数
print('x2 = {:.1f}, y2 = {:.1f}'.format(x2, y2))
# 输出3
print('{:-^40}'.format('输出3')) # {:-^40} 控制输出数据格式: 宽度占40列,居中对齐,空白处用-补齐
print('x1 = {:<15.1f}, y1 = {:<15.1f}'.format(x1, y1)) # {:<15.1f}控制数据输出宽度占15列,小数部分占1列,左对齐,空白处默认补空格
print('x2 = {:<15.1f}, y2 = {:<15.1f}'.format(x2, y2))
# 输出4
print('{:-^40}'.format('输出3')) # {:-^40} 控制输出数据格式: 宽度占40列,居中对齐,空白处用-补齐
print('x1 = {:>15.1f}, y1 = {:>15.1f}'.format(x1, y1)) # {:>15.1f}控制数据输出宽度占15列,小数部分占1列,右对齐,空白处默认补空格
print('x2 = {:>15.1f}, y2 = {:>15.1f}'.format(x2, y2))

task1_3.py

# 使用f-string方式输出数据并控制格式
name1, age1 = 'Bill', 19
name2, age2 = 'Hellen', 18
title = 'Personnel Information'
print(f'{title:=^40}') # 输出title的值,=^40指定输出宽度占40列,居中对齐,用=填充空白
print(f'name: {name1:10}, age: {age1:3}') # 10和3分别指定数据项输出宽度
print(f'name: {name2:10}, age: {age2:3}')
print(40*'=')

 2. 实验任务2

task2_1.py

 

# 内置函数eval()
# 功能:把字符串转换为python表达式
# 理解:相当于把圆括号中的内容,两侧引号去掉
r1 = eval('1 + 2') # 相当于r1 = 1 + 2
print(type(r1), r1)
r2 = eval('[1, 6, 7.5]') #相当于r2 = [1, 6, 7.5]
print(type(r2), r2)
r3 = eval('"python"') # 相当于r3 = "python"
print(type(r3), r3)
r4 = eval('7, 42') # 相当于r4 = 7, 43
print(type(r4), r4)

task2_2.py

# 组合使用内置函数eval()和input()
x, y = eval(input('Enter two oprands: ')) # 输入的两个操作数之间用逗号分隔(英文半角输入法下的逗号)
ans = x + y
print(f'{x} + {y} = {ans}')
print(f'{type(x)} + {type(y)} = {type(ans)}')

3. 实验任务3

task3.py

 

# 浮点数简单运算
ans1 = 0.1 + 0.2
print(f'0.1 + 0.2 = {ans1}')
from decimal import Decimal
ans2 = Decimal('0.1') + Decimal('0.2')
print(f'0.1 + 0.2 = {ans2}')

 

1.为什么line4输出结果显示存在误差?

答:0.1的二进制表示是无穷的0.0001100110011001100110011

  在Python 中是以双精度(64)位来保存浮点数,多余的部分会被截取掉,因此实际0.1在Python 中存储的是 0.00011001100110011001100110011001100110011001100110011001100

  因此在参与计算的时候,我们看到的是0.1。实际上在计算中已经不是0.1了,而是一个很长的二进制数据,所以会存在误差。

2.查阅decimal模块资料,尝试分析和思考,decimal模块中的工具Decimal()是如何进行浮点运算 的?

答:

from decimal import Decimal
a = Decimal('4.2')
b = Decimal('2.1')
print(a + b)

 

4. 实验任务4

task4.py

# 字符编码相关
# chr()返回unicode编码对应的字符
print(chr(0x1f600), end = " ")
print(chr(0x1f601), end = " ")
print(chr(0x1f602), end = " ")
print(chr(0x1f603), end = " ")
print(chr(0x1f604))
print(chr(10000), end=" ")
print(chr(0x025b), end=" ")
print(chr(0x2708), end=" ")
print(chr(0x00A5), end=" ")
print(chr(0x266b))
# ord()返回字符的unicode编码
print(ord('a'), end = " ")
print(ord('b'), end = " ")
print(ord('c'))
print(ord('A'), end = " ")
print(ord('B'), end = " ")
print(ord('C'))
print(ord('0'), end = " ")
print(ord('1'), end = " ")
print(ord('2'))

5. 实验任务5

task5_1.py

# 简单的数学计算
from math import sqrt
n = float(input('输入一个数:'))
# python中计算开平方的两种方式
ans1 = sqrt(n)
ans2 = n**0.5
print('%.2f的平方根是: %.2f' %(n, ans1)) # 以传统c风格方式输出
print('{:.2f}的平方根是: {:.2f}'.format(n, ans2)) # 使用字符串format()方法输出
print(f'{n:.2f}的平方根是: {ans2:.2f}') # 使用f-string方式输出

task5_2.py

# 神奇的pi, 与大饼
from math import pi
text = '''
好奇心是人的天性。
理想情况下,学习新东西是让人愉快的事。
但学校里的学习似乎有点像苦役。
有时候,需要画一个大饼,每次尝试学一些新鲜的,才会每天变得更好一点点。
'''
print(text)
r = float(input('给学习画一个大饼,大饼要做的很大,半径要这么大: '))
circle = 2*pi*r
print(f'绕起来,大饼的圆周有这么长, {circle}, 够不够激发你探索未知的动力...')

6. 实验任务6

x=input("输入x:")
m=float(x)
y=pow(m,3)
y=str(y)
print(x+"的365次方:"+y)

7. 实验任务7

import  math as m
Tw=100
Ty=70
T0=float(input("温度:"))
p=ρ = 1.038
c = 3.7
K = 5.4*pow(10,-3)
M=67
r1=pow(M,2/3)*c*pow(p,1/3)
r2=K*(m.pi)**2*pow((4*(m.pi)/3),2/3)
r3=(T0-Tw)/(Ty-Tw)*0.76
r4=m.log(r3,m.e)
t=r1*r4/r2
t=float(str(t)[0:10])
t1=t//60
t2=round(t-t1*60,2)
t1=str(int(t1))
t2=str(int(t2))
print(t1+"分"+t2+"秒")

 

 

五、实验总结

1.浮点数误差成因及解决:

(1)成因:

在计算机中,存储数据使用的是二进制数。先看一下十进制小数转换位二进制小数的过程。

 比如要存储十进制的小数0.1,转换成二进制小数是无限的

 0.0001100110011001100110011001100110011001100110011...

 在python中,浮点数有53位可用精度,因此十进制的0.1在内部存储中储存的值是二进制小数的近似替代值,它接近但不完全的等于0.1。

计算机取出储存,进行显示时,使用的是舍入值。

需要注意的是,这是二进制浮点的本质:这不是Python中的错误,也不是代码中的错误。您将在支持硬件浮点运算的所有语言中看到相同的类型(尽管某些语言默认情况下可能无法显示差异,或者在所有输出模式下)。

查看存储在内部的值,可以使用decimal模块。该decimal模块还提供了一种很好的方法来“查看”存储在任何特定Python float中的确切值。

from decimal import Decimal
print(Decimal(2.675))

这就说明了,刚开始给出的程序中的异常之处。对多数实数,计算机都无法精确存储。这造成误差。在用计算机解决实际问题时,要考虑上述误差的积累。

(2).解决:

Python提供了decimal模块用于十进制数学计算,它具有以下特点:

1.提供十进制数据类型,并且存储为十进制数序列;

2.有界精度:用于存储数字的位数是固定的,可以通过decimal.getcontext().prec=x 来设定,不同的数字可以有不同的精度

3.浮点:十进制小数点的位置不固定(但位数是固定的)

decimal的构建:

可以通过整数、字符串或者元组构建decimal.Decimal,对于浮点数需要先将其转换为字符串

decimal的context:

decimal在一个独立的context下工作,可以通过getcontext来获取当前环境。例如前面提到的可以通过decimal.getcontext().prec来设定小数点精度(默认为28)
 2.对数的输入与计算:

math.log(x) 就相当于数学中的ln(x),x>0,求底数为e的对数,e = 2.718281828459;math.log10(x) 就相当于数学中的lg(x),x>0,求底数为10的对数。可以通过log(x[, base])来设置底数,如 log(x, 10) 表示以10为底的对数。

语法

以下是 log() 方法的语法:

import math

math.log(x[, base])

注意:log()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。

参数

x -- 数值表达式。base -- 可选,底数,默认为 e。

 

 

 

posted @ 2022-03-23 16:42  何处寻清欢  阅读(103)  评论(4编辑  收藏  举报