• Python每日一练 03


    Python每日一学 03——计算半径为r的圆的面积

    一、计算半径为r的圆的面积

    最早的电脑是用来破译敌军密码用的,因为靠人去破译密码耗时耗力,而且还达不到理想的效果,所以后来就创造了电脑,希望这个机器能够代替人脑去进行运算。
    可以这样说,电早计算机的产生就是为了解决计算问题。

    计算机解决计算问题可以分为三个步骤:

    输入(I:input): input()

    输出(O:output): print()

    这种模式也称为IPO模式

    融入输入、数学运算、输出、精度控制、字符串重复、math模块、异常处理的分析、命名规范、注释等知识。

    圆的面积计算公式为: s = π r 2 s = \pi r^2 s=πr2

    二、按IPO模式解决

    r = input()
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行程序,当我们输入一个数字时,程序出现异常:

    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)
    
    • 1
    • 2
    • 3
    • 4
    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    再次输入一个数值,发现又触发了另一个异常:

    TypeError: can’t multiply sequence by non-int of type ‘float’ 类型错误:不能够将非整数的浮点数乘到序列类型上

    因为在Python中,input()接收到的数据都做为字符串类型,字符串与整数可以相乘,但不能与浮点数相乘。

    三、 输入转数值

    有两种解决方法

    1. 将pi的值变为整数3,但结果是将输入的字符串’3’重复了3次,结果仍是字符串’333’
    r = input()
    pi = 3
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行程序时发现又触发了一个异常:

    TypeError: can’t multiply sequence by non-int of type ‘str’
    类型错误:序列不能与非整数类型字符串相乘

    出错的原因是前面3 * ‘3’结果是字符串’333’,'333’只能与整数相乘,不能与字符串相乘

    1. 将input()得到的字符串转为数值类型,将字符串转数值类型有3个函数可以使用。
      int(s): 将整数字符串转为整数,如:int(‘3’)转为 3
      float(s): 将数字字符串转为浮点数,如:float(‘3’)转为3.0
      eval(s): 将整数字符串转为整数,将浮点数的字符串转为浮点数,如eval(‘3’)转为3;eval(3.0)转为3.0
      可以将程序修改为以下三种表述:
    r = int(input())
    pi = 3
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    3
    27
    
    • 1
    • 2
    r = float(input())
    pi = 3
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    4
    48.0
    
    • 1
    • 2
    r = eval(input())
    pi = 3
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    4
    48
    
    • 1
    • 2

    尝试运行上面三个程序,分别输入整数和浮点数,观察运行结果。
    可以发现,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)
    
    • 1
    • 2
    • 3
    • 4
    3.4
    36.2984
    
    • 1
    • 2

    不同用户、不同应用场景下,圆周率取值可能不同,这时会得到不同的处理结果:

    r = float(input())
    pi = 3.1416
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    3
    28.2744
    
    • 1
    • 2
    r = float(input())
    pi = 3.14159265
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    3
    28.274333850000005
    
    • 1
    • 2
    r = float(input())
    pi = 3.141592653589793
    s = pi * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    3
    28.274333882308138
    
    • 1
    • 2

    上面三个程序,在输入为3时的输出分别为:

    28.2744
    28.274333850000005
    28.274333882308138
    
    • 1
    • 2
    • 3

    五、精度问题解决方法

    这种精度不同导致的结果不同是我们在程序设计中应该避免的问题,一般有以下两种方法处理:

    1. 使用相同的圆周率值

    例如约定都使用math库中圆周率的值:3.141592653589793
    math库中的圆周率值可以用以下语句获取:

    import math
    
    print()
    
    • 1
    • 2
    • 3
    3.141592653589793
    
    • 1

    上面程序可修改为:

    import math
    
    
    r = float(input())
    PI = math.pi   # 用大写字符做变量名,表示这是一个符号常量,确定值3.141592653589793
    s = PI * r * r
    print(s)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 使用相同输出精度

    python中精度控制主要有三种方法:

    • round(digit, n): 浮点数digit保留n位小数,n省略时保留0位小数的最短表示(省略小数末尾无意义的0),返回整数。
    • ‘{:.nf}’.format(digit):round(digit, n): 浮点数digit精确保留n位小数,n省略时保留0位小数,返回整数。
    • f’{digit:.nf}':浮点数digit精确保留n位小数(保留小数末尾无意义的0),n省略时保留0位小数,返回整数。
    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位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    5
    78.53981633974483
    78.54
    78.540
    78.540
    
    • 1
    • 2
    • 3
    • 4
    • 5

    六、变量命名规范

    上述程序中r和s为单字母变量名,语义不清晰,一般建议用具有明确语义的单词或单词组合做变量名,修改程序如下:

    import math
    
    
    radius = float(input())      
    PI = math.pi                 
    area = PI * radius * radius  
    print(f'{area:.3f}')         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4
    50.265
    
    • 1
    • 2
    import math
    # import 一般放在程序开头,后面空1到2行
    
    diameter = float(input())       
    PI = math.pi                   
    area = PI * (diameter/2) ** 2    
    print(f'{area:.3f}')           
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4
    12.566
    
    • 1
    • 2

    七、注释

    注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。

    python中注释一般建议用 “#” 开头,可放行首或语句末尾,放在语句末尾时,至少与语句间空2个字符

    import math
    # import 一般放在程序开头,后面空1到2行
    
    radius = float(input())      # 输入半径
    PI = math.pi                 # 用大写字符做变量名,表示这是一个符号常量,确定值3.141592653589793
    area = PI * radius * radius  # 输入为半径时直接参与运行
    print(f'{area:.3f}')         # 精确保留小数点后3位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4
    50.265
    
    • 1
    • 2
    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位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4
    12.566
    
    • 1
    • 2
  • 相关阅读:
    java-php-python-ssm学术会议信息网站计算机毕业设计
    【Numpy】练习题100道(26-50题)
    【arduino】时间相关函数
    Python开发6年,整理的《Python从入门到精通学习笔记》免费下载
    Java-day13(IO流)
    UI设计中按钮如何设计,常见的按钮设计类型
    如何用selenium库自动登录校园网网址?
    25.1 MySQL SELECT语句
    【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...
    下载stm32f4xx标准外设库
  • 原文地址:https://blog.csdn.net/qq_52417436/article/details/127912320