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

Posted on 2022-03-23 22:36  灯下白头人  阅读(35)  评论(2编辑  收藏  举报

实验结论:

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对格式的要求更接近自然语言,对初学者更友好。离底层较远,没有指针,但函数库丰富。希望课程能够涉及完整程序的开发应用。