实验结论:
1.实验任务1:
def task1(): # 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) # 使用字符串的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)) #不同进制的输出 print("{:b},{:b},{:b},{:b}".format(10,11,12,13))#二进制 print("{:d},{:d},{:d},{:d}".format(10,11,12,13))#十进制 print("{:o},{:o},{:o},{:o}".format(10,11,12,13))#八进制 print("{:x},{:x},{:x},{:x}".format(10,11,12,13))#十六进制 print("{:#x},{:#x},{:#x},{:#x}".format(10,11,12,13))#十六进制0x print("{:#X},{:#X},{:#X},{:#X}".format(10,11,12,13))#十六进制0X # 使用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*'=') return "over"
运行结果1:
print()函数用法:
print() 方法用于打印输出,是python中最常见的一个函数。
该函数的语法如下:
1 print(*objects, sep=' ', end='\n', file=sys.stdout)
objects --表示输出的对象。输出多个对象时,需要用 , (逗号)分隔。
sep -- 用来间隔多个对象。
end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符。
file -- 要写入的文件对象。
(1)字符串format方法:
str.format()
方法的基本用法如下所示:
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) We are the knights who say "Ni!"
花括号及之内的字符(称为格式字段)被替换为传递给 str.format()
方法的对象。花括号中的数字表示传递给 str.format()
方法的对象所在的位置。
>>> >>> print('{0} and {1}'.format('spam', 'eggs')) spam and eggs >>> print('{1} and {0}'.format('spam', 'eggs')) eggs and spam
str.format()
方法中使用关键字参数名引用值。
>>> >>> print('This {food} is {adjective}.'.format( ... food='spam', adjective='absolutely horrible')) This spam is absolutely horrible.
位置参数和关键字参数可以任意组合:
>>> >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')) The story of Bill, Manfred, and Georg.
如果不想分拆较长的格式字符串,最好按名称引用变量进行格式化,不要按位置。这项操作可以通过传递字典,并用方括号 '[]'
访问键来完成。
>>> >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ' ... 'Dcab: {0[Dcab]:d}'.format(table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678
也可以用 '**' 符号,把 table 当作传递的关键字参数。
>>> >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678
与内置函数
vars()
结合使用时,这种方式非常实用,可以返回包含所有局部变量的字典。例如,下面的代码生成一组整齐的列,包含给定整数及其平方与立方:
>>> >>> for x in range(1, 11): ... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000
(2)格式化字符串字面值 (简称为 f-字符串)在字符串前加前缀 f
或 F
,通过 {expression}
表达式,把 Python 表达式的值添加到字符串内。
格式说明符是可选的,写在表达式后面,可以更好地控制格式化值的方式。下例将 pi 舍入到小数点后三位:
>>> >>> import math >>> print(f'The value of pi is approximately {math.pi:.3f}.') The value of pi is approximately 3.142.
在 ':'
后传递整数,为该字段设置最小字符宽度,常用于列对齐:
>>> >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} >>> for name, phone in table.items(): ... print(f'{name:10} ==> {phone:10d}') ... Sjoerd ==> 4127 Jack ==> 4098 Dcab ==> 7678
还有一些修饰符可以在格式化前转换值。 '!a'
应用 ascii()
,'!s'
应用 str()
,'!r'
应用 repr()
:
>>> >>> animals = 'eels' >>> print(f'My hovercraft is full of {animals}.') My hovercraft is full of eels. >>> print(f'My hovercraft is full of {animals!r}.') My hovercraft is full of 'eels'.
2.实验任务2:
def task2(): # 内置函数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) # 组合使用内置函数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)}') return "over"
运行结果2:
eval()用法:
eval(expression[, globals[, locals]])
实参是一个字符串,以及可选的 globals 和 locals。globals 实参必须是一个字典。locals 可以是任何映射对象。
返回值就是表达式的求值结果。 语法错误将作为异常被报告。
3.实验任务3:
def task3(): # 浮点数简单运算 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}') return "over"
运行结果3:
question1:
answer:浮点数存储时小数部分(尾数)往往无法精确表示,只能舍入后存储,产生误差。
question2:
answer:以十进制方法计算。底层逻辑应当是采用定点数,即小数,整数部分分别存储,对应加减计算。
reference material:
https://m.php.cn/article/479967.html
https://blog.csdn.net/zlroy1023/article/details/82997558
4.实验任务4:
1 def task4(): 2 # 字符编码相关 3 # chr()返回unicode编码对应的字符 4 print(chr(0x1f600), end = " ") 5 print(chr(0x1f601), end = " ") 6 print(chr(0x1f602), end = " ") 7 print(chr(0x1f603), end = " ") 8 print(chr(0x1f604)) 9 10 print(chr(10000), end=" ") 11 print(chr(0x025b), end=" ") 12 print(chr(0x2708), end=" ") 13 print(chr(0x00A5), end=" ") 14 print(chr(0x266b)) 15 # ord()返回字符的unicode编码 16 print(ord('a'), end = " ") 17 print(ord('b'), end = " ") 18 print(ord('c')) 19 20 print(ord('A'), end = " ") 21 print(ord('B'), end = " ") 22 print(ord('C')) 23 24 print(ord('0'), end = " ") 25 print(ord('1'), end = " ") 26 print(ord('2')) 27 28 return "over"
运行结果4:
- chr()和ord()作用
chr
(i)-
返回 Unicode 码位为整数 i 的字符的字符串格式。例如,
chr(97)
返回字符串'a'
,chr(8364)
返回字符串'€'
。这是ord()
的逆函数。实参的合法范围是 0 到 1,114,111(16 进制表示是 0x10FFFF)。如果 i 超过这个范围,会触发
ValueError
异常。ord
(c)对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数。例如
ord('a')
返回整数97
,ord('€')
(欧元符号)返回8364
。这是chr()
的逆函数。5.实验任务5:
1 def task5(): 2 # 简单的数学计算 3 from math import sqrt 4 n = float(input('输入一个数:')) 5 # python中计算开平方的两种方式 6 ans1 = sqrt(n) 7 ans2 = n**0.5 8 print('%.2f的平方根是: %.2f' %(n, ans1)) # 以传统c风格方式输出 9 print('{:.2f}的平方根是: {:.2f}'.format(n, ans2)) # 使用字符串format()方法输出 10 print(f'{n:.2f}的平方根是: {ans2:.2f}') # 使用f-string方式输出 11 12 # 神奇的pi, 与大饼 13 from math import pi 14 text = ''' 好奇心是人的天性。 15 理想情况下,学习新东西是让人愉快的事。 16 但学校里的学习似乎有点像苦役。 有时候,需要画一个大饼,每次尝试学一些新鲜的,才会每天变得更好一点点。 17 ''' 18 print(text) 19 r = float(input('给学习画一个大饼,大饼要做的很大,半径要这么大: ')) 20 circle = 2*pi*r 21 print(f'绕起来,大饼的圆周有这么长, {circle}, 够不够激发你探索未知的动力...') 22 23 return "over"
运行结果5:
6.实验任务6:
def task6(): print(eval(input("Input a number:"))**365) return "over"
运行结果6:
7.实验任务7:
1 def task7(): 2 #How to boil a perfect egg! 3 import math 4 ρ = 1.038 #ρ = 1.038g/cm2 5 c = 3.7 # c = 3.7J/(g.K) 6 K = 5.4*10**(-3) #K = 5.4×10-3W/(cm.K) 7 m = 47 #小鸡蛋M = 47g 8 M = 67 #大鸡蛋M = 67g 9 Tw = 100 #Tw是水沸腾的温度(以°C计) 10 Ty = 70 #Ty是蛋黄中心达到的温度(以°C计) 11 T0 = eval(input("Input initial temperature of the egg:")) #T0是放入水中之前蛋的原始温度(以°C计) 12 t=(math.pow(M,2/3)*c*math.pow(ρ,1/3))/(K*math.pi*math.pi*math.pow(4*math.pi/3,2/3))*math.log(0.76*(T0-Tw)/(Ty-Tw)) 13 minute=t//60;second=t%60 14 print("T0 = %.2f°C,t = %d分%f秒"%(T0,minute,second)) 15 16 return "over"
运行结果7:
实验总结
本次实验,了解了浮点舍入误差对精确计算的影响以及decimal函数;在官网查询了各函数的具体用法(主要是各参数)。
感觉上,python对格式的要求更接近自然语言,对初学者更友好。离底层较远,没有指针,但函数库丰富。希望课程能够涉及完整程序的开发应用。