最早的电脑是用来破译敌军密码用的,因为靠人去破译密码耗时耗力,而且还达不到理想的效果,所以后来就创造了电脑,希望这个机器能够代替人脑去进行运算。
可以这样说,电早计算机的产生就是为了解决计算问题。
计算机解决计算问题可以分为三个步骤:
输入(I:input): input()
输出(O:output): print()
这种模式也称为IPO模式
融入输入、数学运算、输出、精度控制、字符串重复、math模块、异常处理的分析、命名规范、注释等知识。
圆的面积计算公式为: s = π r 2 s = \pi r^2 s=πr2
r = input()
s = pi * r * r
print(s)
3
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in
1 r=input()
----> 2 s = pi * r * r
3 print(s)
NameError: name 'pi' is not defined
运行程序,当我们输入一个数字时,程序出现异常:
NameError: name ‘pi’ is not defined命名错误,pi 这个变量名没有定义就先使用了。
在python中,一定是先有对象,任何变量都是依附在某个实际存在的对象上的,或者说,任何变量名首次出现,一定是出现的赋值符号“=”的左侧。pi 这里表示圆周率,我们可以设为3.14,并用pi这个名字访问这个对象,将以下语句加到程序中:
pi = 3.14
r = input()
pi = 3.14
s = pi * r * r
print(s)
3
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
1 r=input()
2 pi = 3.14
----> 3 s = pi * r * r
4 print(s)
TypeError: can't multiply sequence by non-int of type 'float'
再次输入一个数值,发现又触发了另一个异常:
TypeError: can’t multiply sequence by non-int of type ‘float’ 类型错误:不能够将非整数的浮点数乘到序列类型上
因为在Python中,input()接收到的数据都做为字符串类型,字符串与整数可以相乘,但不能与浮点数相乘。
有两种解决方法
r = input()
pi = 3
s = pi * r * r
print(s)
3
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
1 r = input()
2 pi = 3
----> 3 s = pi * r * r
4 print(s)
TypeError: can't multiply sequence by non-int of type 'str'
运行程序时发现又触发了一个异常:
TypeError: can’t multiply sequence by non-int of type ‘str’
类型错误:序列不能与非整数类型字符串相乘
出错的原因是前面3 * ‘3’结果是字符串’333’,'333’只能与整数相乘,不能与字符串相乘
r = int(input())
pi = 3
s = pi * r * r
print(s)
3.5
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in
----> 1 r = int(input())
2 pi = 3
3 s = pi * r * r
4 print(s)
ValueError: invalid literal for int() with base 10: '3.5'
3
27
r = float(input())
pi = 3
s = pi * r * r
print(s)
4
48.0
r = eval(input())
pi = 3
s = pi * r * r
print(s)
4
48
尝试运行上面三个程序,分别输入整数和浮点数,观察运行结果。
可以发现,float()和eval()可以接收整数和浮点数输入并正确完成计算。int()只能接收整数输入,当输入浮点数3.5时,会触发异常:ValueError: invalid literal for int() with base 10: ‘3.5’
在一般的计算中,圆周率值取为3.14即可,有浮点数参与乘法运算,结果仍为浮点数,所以输入的数据一般用float()转为浮点数,这样输入整数和浮点数都可以正确完成运算。
r = float(input())
pi = 3.14
s = pi * r * r
print(s)
3.4
36.2984
不同用户、不同应用场景下,圆周率取值可能不同,这时会得到不同的处理结果:
r = float(input())
pi = 3.1416
s = pi * r * r
print(s)
3
28.2744
r = float(input())
pi = 3.14159265
s = pi * r * r
print(s)
3
28.274333850000005
r = float(input())
pi = 3.141592653589793
s = pi * r * r
print(s)
3
28.274333882308138
上面三个程序,在输入为3时的输出分别为:
28.2744
28.274333850000005
28.274333882308138
这种精度不同导致的结果不同是我们在程序设计中应该避免的问题,一般有以下两种方法处理:
例如约定都使用math库中圆周率的值:3.141592653589793
math库中的圆周率值可以用以下语句获取:
import math
print()
3.141592653589793
上面程序可修改为:
import math
r = float(input())
PI = math.pi # 用大写字符做变量名,表示这是一个符号常量,确定值3.141592653589793
s = PI * r * r
print(s)
python中精度控制主要有三种方法:
import math
r = float(input())
PI = math.pi # 用大写字符做变量名,表示这是一个符号常量,确定值3.141592653589793
s = PI * r * r
print(s) # 输出完整浮点数
print(round(s, 3)) # 保留小数点后3位,省略末尾无意义的0,可能少于3位,至少保留1位小数
print('{:.3f}'.format(s)) # 精确保留小数点后3位
print(f'{s:.3f}') # 精确保留小数点后3位
5
78.53981633974483
78.54
78.540
78.540
上述程序中r和s为单字母变量名,语义不清晰,一般建议用具有明确语义的单词或单词组合做变量名,修改程序如下:
import math
radius = float(input())
PI = math.pi
area = PI * radius * radius
print(f'{area:.3f}')
4
50.265
import math
# import 一般放在程序开头,后面空1到2行
diameter = float(input())
PI = math.pi
area = PI * (diameter/2) ** 2
print(f'{area:.3f}')
4
12.566
注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。
python中注释一般建议用 “#” 开头,可放行首或语句末尾,放在语句末尾时,至少与语句间空2个字符
import math
# import 一般放在程序开头,后面空1到2行
radius = float(input()) # 输入半径
PI = math.pi # 用大写字符做变量名,表示这是一个符号常量,确定值3.141592653589793
area = PI * radius * radius # 输入为半径时直接参与运行
print(f'{area:.3f}') # 精确保留小数点后3位
4
50.265
import math
# import 一般放在程序开头,后面空1到2行
diameter = float(input()) # 输入直径
PI = math.pi # 用大写字符做变量名,表示这是一个符号常量,确定值3.141592653589793
area = PI * (diameter/2) ** 2 # diameter是直径,需先除以2再计算面积
print(f'{area:.3f}') # 精确保留小数点后3位
4
12.566