V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
codists
V2EX  ›  问与答

翻译:《实用的 Python 编程》01_03_Numbers

  •  
  •   codists · 2021-02-15 23:12:24 +08:00 · 588 次点击
    这是一个创建于 1383 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.3 数字

    本节讨论数学计算。

    数字类型

    Python 有 4 种类型的数字:

    • 布尔型
    • 整型
    • 浮点型
    • 复数(虚数)

    布尔型( bool )

    布尔型数字有两个值:TrueFalse

    a = True
    b = False
    

    在数值上,它们被计算成值为 10 的数。

    c = 4 + True # 5
    d = False
    if d == 0:
        print('d is False')
    

    但是,不要像上面这样写代码,这会很奇怪。

    整型( int )

    任意大小的有符号值,或者以任意数为基数的有符号值。

    a = 37
    b = -299392993727716627377128481812241231
    c = 0x7fa8      # Hexadecimal
    d = 0o253       # Octal
    e = 0b10001111  # Binary
    

    常用操作:

    x + y      Add
    x - y      Subtract
    x * y      Multiply
    x / y      Divide (produces a float)
    x // y     Floor Divide (produces an integer)
    x % y      Modulo (remainder)
    x ** y     Power
    x << n     Bit shift left
    x >> n     Bit shift right
    x & y      Bit-wise AND
    x | y      Bit-wise OR
    x ^ y      Bit-wise XOR
    ~x         Bit-wise NOT
    abs(x)     Absolute value
    

    浮点型( float )

    使用十进制或者指数表示法来指定浮点数的值:

    a = 37.45
    b = 4e5 # 4 x 10**5 or 400,000
    c = -1.345e-10
    

    使用浮点数表示 IEEE 754 标准的双精度。这与 C 语言中的 double 类型相同。

    17 digits of precision
    Exponent from -308 to 308

    请注意,当代表小数时,浮点数是不精确的。

    >>> a = 2.1 + 4.2
    >>> a == 6.3
    False
    >>> a
    6.300000000000001
    >>>
    

    这不是 Python 的问题,而是 CPU 硬件上底层浮点硬件的问题。

    常用操作:

    x + y      Add
    x - y      Subtract
    x * y      Multiply
    x / y      Divide
    x // y     Floor Divide
    x % y      Modulo
    x ** y     Power
    abs(x)     Absolute Value
    

    除了按位运算符之外,浮点数的运算符与整数的运算符是一样的。

    其它数学函数可以在 math 中找到。

    import math
    a = math.sqrt(x)
    b = math.sin(x)
    c = math.cos(x)
    d = math.tan(x)
    e = math.log(x)
    

    比较

    下面的比较 /关系运算符可以应用于数字:

    x < y      Less than
    x <= y     Less than or equal
    x > y      Greater than
    x >= y     Greater than or equal
    x == y     Equal to
    x != y     Not equal to
    

    可以使用 andornot 组成更复杂的布尔表达式。

    这里有一些例子:

    if b >= a and b <= c:
        print('b is between a and c')
    
    if not (b < a or b > c):
        print('b is still between a and c')
    

    转换数字

    类型名可以被用来将其它数据转换为数字。

    a = int(x)    # Convert x to integer
    b = float(x)  # Convert x to float
    

    试试下面这些操作:

    >>> a = 3.14159
    >>> int(a)
    3
    >>> b = '3.14159' # It also works with strings containing numbers
    >>> float(b)
    3.14159
    >>>
    

    习题

    提醒:这些习题假定你正在 practical-python/Work 目录中操作,具体在 mortgage.py 文件。

    习题 1.7:戴夫的抵押贷款

    戴夫决定从 Guido 的抵押贷款、股票投资和比特币交易公司获得 50 万美元的 30 年期固定利率抵押贷款。利率是 5%,每月还款额是 2684.11 美元。

    下面这个程序用于计算戴夫在抵押期内需要支付的总金额:

    # mortgage.py
    
    principal = 500000.0
    rate = 0.05
    payment = 2684.11
    total_paid = 0.0
    
    while principal > 0:
        principal = principal * (1+rate/12) - payment
        total_paid = total_paid + payment
    
    print('Total paid', total_paid)
    

    输入该程序并执行,你应该会得到答案为 966,279.6

    习题 1.8:额外付款

    假设戴夫在抵押期的前 12 个月每月额外支付 1000 美元。

    修改程序以包含这部分额外的付款,并且输出已支付的总金额以及所需的月数。

    当你执行这个新程序时,它应该报告 342 个月的总付款额是 929,965.62

    习题 1.9:制作一个额外的付款计算器

    修改程序,以便可以更一般地处理额外的付款信息。做到这一点,以便用户可以设置下面这些变量:

    extra_payment_start_month = 61
    extra_payment_end_month = 108
    extra_payment = 1000
    

    使程序查看这些变量,并适当地计算总付款额 。如果戴夫从抵押期的第五年开始,每月额外支付 1000 每月并支付 4 年,那么他将要支付多少?

    习题 1.10:制作表格

    修改程序,使其显示迄今为止支付的月数,支付的总金额和剩余的本金。输出看起来应该像下面这样:

    1 2684.11 499399.22
    2 5368.22 498795.94
    3 8052.33 498190.15
    4 10736.44 497581.83
    5 13420.55 496970.98
    ...
    308 874705.88 3478.83
    309 877389.99 809.21
    310 880074.1 -1871.53
    Total paid 880074.1
    Months 310
    

    习题 1.11:奖金

    使用该程序时,请修复程序以纠正发生在上个月的超额支付。

    习题 1.12:一个谜

    int() 函数和 float() 函数可以将其它类型的数据转换为数字类型。示例:

    >>> int("123")
    123
    >>> float("1.23")
    1.23
    >>>
    

    考虑到这一点,你能否解释下面这种行为?

    >>> bool("False")
    True
    >>>
    

    注:完整翻译见 https://github.com/codists/practical-python-zh

    2 条回复    2021-02-16 11:30:59 +08:00
    hsfzxjy
        1
    hsfzxjy  
       2021-02-16 10:06:21 +08:00 via Android
    个人感觉运算符的名字(代码块里的)译出来会更好
    codists
        2
    codists  
    OP
       2021-02-16 11:30:59 +08:00
    @hsfzxjy
    感谢大佬的建议,后续在 github 上修改。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:06 · PVG 17:06 · LAX 01:06 · JFK 04:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.