V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
codists
V2EX  ›  Python

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

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

    1.2 第一个程序

    本节讨论有关如何创建一个程序、运行解释器和调试的基础知识。

    运行 Python

    Python 程序始终在解释器中运行。

    解释器是一个“基于控制台”的应用程序,通常从命令行 shell 启动。

    python3
    Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    

    老练的程序员以这种方式使用解释器时通常都没有问题,但对于初学者来说,这种方式并不是那么友好。您可能会使用一个为 Python 提供不同接口的环境,但是学会如何运行 Python 终端仍然是一项有必要了解的技能。

    交互模式

    当启动 Python 时,可以进入一种交互的模式,在这种模式下,可以进行编程实验。

    如果输入代码完毕,这些代码将会马上运行。没有 edit/compile/run/debug 等流程。

    >>> print('hello world')
    hello world
    >>> 37*42
    1554
    >>> for i in range(5):
    ...     print(i)
    ...
    0
    1
    2
    3
    4
    >>>
    

    这就是所谓的“读取-求值-输出-循环”(译者注:简写为 REPL,也有人译为 “交互式解释器”,正像 Python 这个词一样,为了更好地理解,这里不翻译。),对于代码调试和探索非常有用。

    暂停:如果您不知道如何与 Python 进行交互,先停止您正在做的事情,然后弄清楚如何与 Python 进行交互。如果您正在使用的是集成开发环境( IDE ),它可能隐藏在一个菜单选项或者其它窗口后面。本课程的许多部分都假定您能与解释器进行交互。

    让我们仔细看看 REPL 的元素:

    • >>> 提示符用于开始一个新的语句。
    • ... 提示符用于继续一个语句,输入一个空行表示全部输入结束,并运行所输入的代码。

    ... 提示符可能会显示,也可能不会显示,这取决于使用的环境。对于本课程,将 ... 提示符显示为空白,以便于剪切、粘贴示例代码。

    下划线 _ 保存最后的结果。

    >>> 37 * 42
    1554
    >>> _ * 2
    3108
    >>> _ + 50
    3158
    >>>
    

    仅在交互模式下如此(指下划线 _ 保存最后的结果),永远不要在程序中使用这种方式。

    创建程序

    程序写在 .py 文件中。

    # hello.py
    print('hello world')
    

    你可以使用你最喜欢的文本编辑器来创建这些 .py 文件。

    运行程序

    要执行程序,请在终端中使用 python 命令执行它。示例,在 Unix 系统的命令行中是这样执行一个 Python 程序的:

    示例,在 Unix 系统的命令行中执行程序:

    bash % python hello.py
    hello world
    bash %
    

    或者,从 Windows shell 中执行一个 Python 程序:

    C:\SomeFolder>hello.py
    hello world
    
    C:\SomeFolder>c:\python36\python hello.py
    hello world
    

    注意:在 Windows 系统上,可能需要指定 Python 解释器的完整路径,例如 c:\python36\python。但是,如果 Python 是以通常的方式安装的,可能只需要输入程序文件名即可,例如 hello.py

    示例程序

    让我们解决以下的问题:

    一天早上,您走出去,在芝加哥的西尔斯大厦旁的人行道上放 1 美元钞票。从那以后的每一天,您放的钞票都是前一天的两倍。这叠钞票需要多长时间才能超过塔的高度。

    这是答案:

    # sears.py
    bill_thickness = 0.11 * 0.001 # Meters (0.11 mm)
    sears_height = 442 # Height (meters)
    num_bills = 1
    day = 1
    
    while num_bills * bill_thickness < sears_height:
        print(day, num_bills, num_bills * bill_thickness)
        day = day + 1
        num_bills = num_bills * 2
    
    print('Number of days', day)
    print('Number of bills', num_bills)
    print('Final height', num_bills * bill_thickness)
    

    当执行 sears.py 程序的时候,会得到下面的输出:

    bash % python3 sears.py
    1 1 0.00011
    2 2 0.00022
    3 4 0.00044
    4 8 0.00088
    5 16 0.00176
    6 32 0.00352
    ...
    21 1048576 115.34336
    22 2097152 230.68672
    Number of days 23 
    Number of bills 4194304 
    Final height 461.37344
    

    使用此程序作为指南,您可以学到许多重要的关于 Python 的核心概念。

    语句

    一个 Python 程序是由一系列的语句组成。

    a = 3 + 4
    b = a * 2
    print(b)
    

    每个语句以换行符终止。语句会一个接一个地执行,直到控制流达到文件的末尾。

    注释

    注释是不会被解释器执行的文本。

    a = 3 + 4
    # This is a comment
    b = a * 2
    print(b)
    

    注释由 # 号表示,并延伸到行的末尾。

    变量

    变量是一个值的名称。可以使用从 a 到 z 的字母(小写和大写都可以)表示,也可以使用下划线 _ 符号表示。数字也可以作为变量名的一部分,但第一个字符除外。

    height = 442 # valid
    _height = 442 # valid
    height2 = 442 # valid
    2height = 442 # invalid
    

    类型

    变量不需要使用值的类型进行声明。类型与右侧的值关联,而不是变量名。

    height = 442           # An integer
    height = 442.0         # Floating point
    height = 'Really tall' # A string
    

    Python 是动态语言。当程序执行时,变量的感知“类型”可能会发生改变,这取决于赋给变量的当前值。

    大小写敏感

    Python 语言是大小写敏感的(即区分大小写),大写字母和小写字母被认为是不同的字母。下面这些都是不同的变量:

    name = 'Jake'
    Name = 'Elwood'
    NAME = 'Guido'
    

    Python 语言自带的语句总是小写:

    while x < 0:   # OK
    WHILE x < 0:   # ERROR
    

    循环

    while 语句执行一个循环:

    while num_bills * bill_thickness < sears_height:
        print(day, num_bills, num_bills * bill_thickness)
        day = day + 1
        num_bills = num_bills * 2
    
    print('Number of days', day)
    

    只要 while 之后的表达式的值是 truewhile 下面缩进的语句就会被执行。

    缩进

    缩进用于表示放在一起的语句组。考虑前面的示例:

    while num_bills * bill_thickness < sears_height:
        print(day, num_bills, num_bills * bill_thickness)
        day = day + 1
        num_bills = num_bills * 2
    
    print('Number of days', day)
    

    缩进将下面的语句分组为一个重复的操作:

        print(day, num_bills, num_bills * bill_thickness)
        day = day + 1
        num_bills = num_bills * 2
    

    因为在末尾的 print() 语句(即 print('Number of days', day))没有缩进,所以不属于循环。空行只是为了可读性,并不影响程序的执行。

    缩进的最佳实践

    • 使用空格( spaces )而不是制表符( tabs )。
    • 每级使用四个空格。
    • 使用支持 Python 的编辑器。

    Python 唯一的要求就是同一代码块内的缩进必须一致。例如,下面的缩进是错误的:

    while num_bills * bill_thickness < sears_height:
        print(day, num_bills, num_bills * bill_thickness)
            day = day + 1 # ERROR
        num_bills = num_bills * 2
    

    条件语句

    if 语句用来执行一个条件:

    if a > b:
        print('Computer says no')
    else:
        print('Computer says yes')
    

    为了检查多个条件,可以使用 elif来添加额外的检查。

    if a > b:
        print('Computer says no')
    elif a == b:
        print('Computer says yes')
    else:
        print('Computer says maybe')
    

    输出

    print 函数将传入的参数值输出成一行文本。

    print('Hello world!') # Prints the text 'Hello world!'
    

    也可以将变量进行输出。输出的文本将是变量的值,而不是变量的名字。

    x = 100
    print(x) # Prints the text '100'
    

    如果将两个以上的值传递给 print 函数,它们在输出的时候被空格分开。

    name = 'Jake'
    print('My name is', name) # Print the text 'My name is Jake'
    

    print() 函数总是将换行符放在最后。

    print('Hello')
    print('My name is', 'Jake')
    

    上面的代码会输出如下的内容:

    Hello
    My name is Jake
    

    额外的换行符可以被抑制:

    print('Hello', end=' ')
    print('My name is', 'Jake')
    

    上面的代码将会输出如下内容:

    Hello My name is Jake
    

    用户输入

    要读取一行类型化的用户输入,可以使用 input() 函数:

    name = input('Enter your name:')
    print('Your name is', name)
    

    input()函数向用户输出一句提示,并且返回他们的响应。

    这对于一个简短的程序、学习练习或者简单的调试是非常有用的。

    但这并未广泛应用于实际的程序中。

    pass 语句

    有时候需要指定一个空的代码块,那么可以使用 pass 关键字。

    if a > b:
        pass
    else:
        print('Computer says false')
    

    pass 语句也称为 “无操作” 语句,它什么也不做。它用作语句的占位符,可能以后会被添加。

    习题

    这是需要创建 Python 文件并且运行这个文件的第一组练习。从现在开始,假定你正在编辑的文件位于practical-python/Work/ 目录。为了帮您找到合适的 位置,已经创建了许多具有合适的文件名的空的启动文件。请找到在第一个练习中使用的Work/bounce.py文件。

    习题 1.5: 弹跳球

    一个橡胶球从 100 米高的地方落下来,球每次撞到地面时弹到原来高度的 3/5 。编写一个程序 bounce.py ,输出一张表格,显示前 10 次反弹的高度。

    程序生成的表格大概像下面这样:

    1 60.0
    2 36.0
    3 21.599999999999998
    4 12.959999999999999
    5 7.775999999999999
    6 4.6655999999999995
    7 2.7993599999999996
    8 1.6796159999999998
    9 1.0077695999999998
    10 0.6046617599999998
    

    注意:如果使用 round() 函数,可以使输出稍微简洁一些。请尝试使用 round() 函数将输出四舍五入到 小数点后 4 位。

    1 60.0
    2 36.0
    3 21.6
    4 12.96
    5 7.776
    6 4.6656
    7 2.7994
    8 1.6796
    9 1.0078
    10 0.6047
    

    习题 1.6: 调试

    下面的代码片段包含来自于西尔斯大厦问题 的代码,它还有一个 bug:

    # sears.py
    
    bill_thickness = 0.11 * 0.001    # Meters (0.11 mm)
    sears_height   = 442             # Height (meters)
    num_bills      = 1
    day            = 1
    
    while num_bills * bill_thickness < sears_height:
        print(day, num_bills, num_bills * bill_thickness)
        day = days + 1
        num_bills = num_bills * 2
    
    print('Number of days', day)
    print('Number of bills', num_bills)
    print('Final height', num_bills * bill_thickness)
    

    将上面显示的代码复制并粘贴到一个名为 sears.py的新程序中。当执行 sears.py 里的代码时,将会收到一条导致程序奔溃的错误信息。错误信息如下所示:

    Traceback (most recent call last):
      File "sears.py", line 10, in <module>
        day = days + 1
    NameError: name 'days' is not defined
    

    读取错误信息是 Python 代码的重要组成部分。如果程序奔溃,则回溯消息的最后一行是程序为什么奔溃的实际原因。在此(NameError: name 'days' is not defined)之上,你应该可以看到源代码片段( day = days + 1)、可识别的文件名( sears.py)和错误代码的行号( line 10)。

    • 哪行是错误的?
    • 错误是什么?
    • 解决错误。
    • 成功运行程序。Run the program successfully

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

    7 条回复    2021-02-14 07:25:46 +08:00
    renmu123
        1
    renmu123  
       2021-02-13 11:18:33 +08:00 via Android   ❤️ 1
    pull request 直接不翻译或者看一下 github 官方文档怎么翻译再加个(pull request)。
    其中有几个数字和中文字符之间没有空格。
    我是倾向把 you 翻译成你而不是您
    renmu123
        2
    renmu123  
       2021-02-13 11:20:34 +08:00 via Android
    看起来还是有翻译腔的感觉,一家之言
    hsfzxjy
        3
    hsfzxjy  
       2021-02-13 13:31:55 +08:00
    感觉有些翻译腔。英文翻译成中文有些时候需要变换句式,以符合中文的阅读习惯。举几个例子:

    「可以使用从 a 到 z 的字母(小写和大写都可以)表示,也可以使用下划线 _ 符号表示。」->「变量名可以包含从 a 到 z 的字母(小写或大写),也可以包含下划线 _ 符号。」

    「因为在末尾的 print() 语句(即 print('Number of days', day))没有缩进,所以不属于循环。」->「在末尾的 print() 语句(即 print('Number of days', day))没有缩进,因此不属于循环。」

    「使用此程序作为指南,您可以学到许多重要的关于 Python 的核心概念。」->「你可以从这个程序中学到许多 Python 重要的核心概念。」

    「当执行 sears.py 里的代码时,将会收到一条导致程序奔溃的错误信息。」->「若执行 sears.py 里的代码,程序会崩溃,并展示一条错误信息。」(此处原文 'causes the program to crash' 修饰 error message,个人认为是不正确的)

    「读取错误信息是 Python 代码的重要组成部分。」->「读懂错误信息是编写 Python 代码的重要一步。」
    codists
        4
    codists  
    OP
       2021-02-13 21:10:48 +08:00
    @renmu123
    感谢指点。关于大佬所说的三点问题:
    1 、pull requests,指的应该是 README.md 文件里面的。后续改为“拉取请求( pull requests )”。参考资料: https://docs.github.com/cn/github
    2 、数字和中文字符之间没有空格。后续修改。
    3 、关于“you”的翻译问题,我也更倾向于不翻译或者翻译成“你”、“我们”。介于这不是官方文档,后续选择不翻译或者翻译成“你”,“我们”。
    以上三点问题后续都在 github 上修改,各平台文章不再修改,也希望大佬有时间能够多多在 github 上提 issue 。再次感谢。
    codists
        5
    codists  
    OP
       2021-02-13 21:33:54 +08:00
    @hsfzxjy
    感谢指点。关于大佬所说的几点问题:
    1 、翻译腔问题。这个问题确实存在,主要还是我功夫不够,翻译的时候生怕漏掉一些内容,所以尽量保持和原文一致。从结果来看,确实不理想,后续我将不断改进,使翻译更符合中文的阅读习惯。
    2 、“causes the program to crash” 的问题。当初翻译的时候确实疏忽了,现修改为“将会收到一条显示程序为什么奔溃的错误信息”
    如还有其它问题,期待与大佬继续探讨,再次感谢。
    IgniteWhite
        6
    IgniteWhite  
       2021-02-13 23:14:04 +08:00 via iPhone
    奔溃 -> 崩溃
    codists
        7
    codists  
    OP
       2021-02-14 07:25:46 +08:00
    @IgniteWhite
    感谢大佬指点,是我手残。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2903 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:00 · PVG 21:00 · LAX 06:00 · JFK 09:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.