Python 简介

序言

欢迎使用 Google 的 Python 在线教程。本课程以内部提供的 Python 入门课程为基础。正如“设置”页面中所述,本材料适用于 Python 3。

如果您正在寻找 MOOC 配套课程,不妨尝试 Udacity 和 Coursera 中的课程(编程入门 [初学者] 或 Python 简介)。最后,如果您观看视频,想要自学在线学习课程,不妨试试这篇博文末尾列出的课程。每项内容都有学习内容,并配有一个供您练习的 Python 交互式解释器。我们提到的“口译”是什么?您将在下一部分中了解相关信息!

语言简介

Python 是一种动态解释(字节码编译)语言。源代码中没有变量、参数、函数或方法的类型声明。这会使代码变得简短而灵活,并且您会失去源代码的编译时类型检查。Python 会在运行时跟踪所有值的类型,并标记运行过程中不合理的代码。

运行 Python 解释器并直接在其中键入代码是了解 Python 代码工作方式的绝佳方式。如果您曾有过类似“如果我将 int 添加到 list 会发生什么?”这样的问题,只需在 Python 解释器中输入该代码即可快速了解会发生什么情况,这可能是最好的方法。(请参阅下文,了解实际情况!)

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

在您输入 Python 之后、>>> 提示符之前, Python 会输出两行内容,提示您正在使用的 Python 版本及其构建位置。只要输出的第一个内容是“Python 3”,这些示例就应该适合您。

如上所示,使用变量和运算符进行实验非常简单。此外,如果代码尝试读取尚未赋值的变量,解释器会抛出(或“引发”)在 Python 中的错误。与 C++ 和 Java 一样,Python 区分大小写,因此“a”和“A”是不同的变量。一行的结尾标志着语句的结束,因此,与 C++ 和 Java 不同,Python 不需要在每个语句的结尾处添加分号。注释以“#”开头,并持续到这一行的结束。

Python 源代码

Python 源文件使用“.py”扩展名,称为“模块”。借助 Python 模块 hello.py,运行该模块的最简单方法是使用 shell 命令“python hello.py Alice”,该命令调用 Python 解释器来执行 hello.py 中的代码,并向其传递命令行参数“Alice”。 如需了解通过命令行运行 Python 时可以使用的所有不同选项,请参阅官方文档页面

下面是一个非常简单的 hello.py 程序(请注意,代码块是使用缩进(而不是大括号)严格分隔的,稍后会详细介绍!):

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

从命令行运行此程序如下所示:

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

导入、命令行参数和 len()

Python 文件(即“模块”)中最外层的语句将进行一次性设置,这些语句在模块首次导入某处时会从上到下运行,从而设置其变量和函数。Python 模块可以直接运行(如 python3 hello.py Bob 上方),也可以由其他模块导入和使用。直接运行 Python 文件时,特殊变量“__name__”将设置为“__main__”。因此,通常让上面显示的样板 if __name__ ==... 在模块直接运行时调用 main() 函数,但在其他模块导入该模块时则不调用。

在标准 Python 程序中,列表 sys.argv 以标准方式包含命令行参数,其中 sys.argv[0] 为程序本身,sys.argv[1] 为第一个参数,依此类推。如果您了解 argc 或参数数量,则只需使用 len(sys.argv) 从 Python 请求此值即可,就像我们在上面的交互式解释器代码中请求字符串的长度时一样。通常,len() 可以告诉您字符串的长度、列表和元组(另一种类似于数组的数据结构)中的元素数量,以及字典中键值对的数量。

用户定义的函数

Python 中的函数定义如下:

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

另请注意,构成函数或 if- 语句的行是如何按缩进级别相同的所有行分组的。我们还演示了 2 种重复字符串的不同方式,即使用 + 运算符,这种方法更便于用户使用,但 * 也有效,因为它是 Python 的“重复”运算符,这意味着 '-' * 10 提供了 '----------',这是一种创建屏幕上“行”的巧妙方式。在代码注释中,我们提示 * 比 + 更快,原因是 * 只会计算一次所生成对象的大小,而如果使用 +,则在每次调用 + 时都会进行计算。+ 和 * 都称为“重载”运算符,因为它们在数字和字符串(和其他数据类型)中的含义不同。

def 关键字定义函数,其形参位于圆括号内,代码缩进。函数的第一行可以是文档字符串(“文档字符串”),用于描述函数的用途。文档字符串可以是单行,也可以是多行说明(如上例所示)。(是的,这是“三引号”,这是 Python 所独有的功能!)函数中定义的变量是该函数的局部变量,因此上述函数中的“result”与另一个函数中的“result”变量是分开的。return 语句可以接受一个参数,在这种情况下,该参数是返回给调用方的值。

以下代码会调用上述 repeat() 函数,输出所返回的内容:

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

在运行时,函数必须先通过执行“def”来定义,然后才能进行调用。通常,在靠近文件底部定义 main() 函数,并使其在文件之上调用函数。

缩进

Python 有一项不同寻常的功能是,一段代码的空格缩进会影响其含义。语句的逻辑块(例如构成函数的语句)都应具有相同的缩进,通过其父函数、“if”或其他值的缩进设置。如果组中的某一行有不同的缩进,则会被标记为语法错误。

Python 对空白的使用一开始感觉有点奇怪,但这是符合逻辑的,我发现我很快就习惯了。避免使用 TAB,因为它们会使缩进方案大幅复杂化(更不用说 TAB 在不同平台上可能具有不同的含义)。将编辑器设置为在 Python 代码中插入空格而非 Tab 键。

新手经常会问:“我应该缩进多少个空格?”根据官方 Python 样式指南 (PEP 8),您应该缩进 4 个空格。(趣味小知识:Google 的内部样式指南规定缩进 2 个空格!)

在运行时检查代码

Python 在编译时几乎没有检查,会将每行的几乎所有类型、名称等检查推迟到该行运行。假设上面的 main() 按如下方式调用 repeat():

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

if 语句包含明显的错误,其中 repeat() 函数被意外输入为 repeeeet()。Python 中的有趣之处在于,只要运行时名称不是“Guido”,此代码就可以编译并运行。仅当运行时实际尝试执行 repeeeet() 时,才会注意到没有此类函数并引发错误。此代码段中还有一个错误。在与“Guido”进行比较之前,系统没有为其分配值。如果您尝试对未分配的变量求值,Python 将引发“NameError”。这些示例表明,当您首次运行 Python 程序时,最先看到的错误是简单的拼写错误或诸如此类的未初始化变量。在这方面,采用更详细的类型系统的语言(如 Java)具有优势...它们可以在编译时捕获此类错误(当然,您必须保留所有类型的信息...需要权衡)。

Python 3 引入了类型提示。通过类型提示,您可以指明函数中每个参数的类型,以及函数返回的对象类型。例如,在带注解的函数 def is_positive(n: int) -> bool: 中,参数 nint,返回值是 bool。我们稍后会详细解释这些类型的含义。不过,类型提示完全是可选的。您会看到越来越多采用类型提示的代码,因为如果您使用它们,某些编辑器(如 cider-v 和 VS.code)可以运行检查来验证是否使用正确的参数类型调用您的函数。它们甚至可以在您修改代码时建议和验证参数。本教程不涉及类型提示,但如果您听到了类型提示或在实际看到时看到此类提示,我们希望确保您了解此类提示。

变量名称

由于 Python 变量在源代码中没有拼写出任何类型,因此建议您为变量指定有意义的名称,以提醒自己正在发生的情况。因此,如果是单个名称,请使用“name”,如果是名称列表,请使用“names”,如果是元组列表,请使用“元组”。 许多基本的 Python 错误都是由于忘记每个变量中的值类型而导致的,因此请使用变量名称(所有变量名)来避免问题。

就实际命名而言,某些语言更喜欢使用 underscored_part 来代表由“多个单词”组成的变量名称,而其他语言则更喜欢使用驼峰式命名法。一般来说,Python 更倾向于使用下划线方法,但如果集成到已经使用该样式的现有 Python 代码中,则会引导开发者改用驼峰式命名法。可读性。如需了解详情,请参阅 PEP 8 中关于命名惯例的部分

正如您所猜测的,像“if”和“while”这样的关键字不能用作变量名称,否则将会发生语法错误。不过,请注意不要将内置函数用作变量名称。例如,虽然“str”“list”和“print”可能看起来很不错,但您应替换这些系统变量。内置参数不是关键字,因此很容易被新的 Python 开发者意外使用。

有关模块及其命名空间的更多信息

假设您有一个模块“binky.py”,其中包含“def foo()”。该 foo 函数的完全限定名称为“binky.foo”。这样,各种 Python 模块就可以随意为其函数和变量命名,并且变量名称不会冲突 - module1.foo 与 module2.foo 不同。在 Python 词汇中,我们认为 binky、module1 和 module2 都有自己的“命名空间”,您可以猜测,它们是变量名称到对象的绑定。

例如,我们有标准的“sys”模块,其中包含一些标准系统工具,如 argv 列表和 exit() 函数。借助语句“import sys”,您可以访问 sys 模块中的定义,并通过完全限定名称(例如 sys.exit())提供这些定义。(没错,“sys”也有命名空间!)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

还有另一个导入表单,如下所示:“from sys import argv, exit”。这样即可按简称使用 argv 和 exit();不过,我们建议使用完全限定名称的原始形式,因为要确定函数或属性的来源要容易得多。

许多模块和软件包与 Python 解释器的标准安装捆绑在一起,因此您无需执行任何额外的操作即可使用它们。这些库统称为“Python 标准库”。常用的模块/软件包包括:

  • sys - 访问 exit()、argv、stdin、stdout...
  • re - 正则表达式
  • os - 操作系统接口、文件系统

您可以在 http://docs.python.org/library 上找到所有标准库模块和软件包的文档。

在线帮助、help()dir()

您可以通过多种方式获得 Python 方面的帮助。

  • 在 Google 上进行搜索,以“python”开头,例如“python list”或“python string 保存”。第一次命中通常是答案。由于某种原因,此方法似乎更适合 Python 而非其他语言。
  • Python 官方文档网站 docs.python.org 提供了高质量的文档。尽管如此,我经常在 Google 上搜索几个字词,搜索起来更快一些。
  • 此外,我们还提供了一个官方 Tutor 邮寄名单,专门面向刚刚接触 Python 和/或编程的新手!
  • 您可以在 StackOverflowQuora 上找到许多问题(和答案)。
  • 使用 help() 和 dir() 函数(请参阅下文)。

在 Python 解释器中,help() 函数会提取各种模块、函数和方法的文档字符串。这些文档字符串类似于 Java 的 javadoc。dir() 函数会告知您对象的属性。下面是从解释器调用 help() 和 dir() 的一些方法:

  • help(len) - 内置 len() 函数的帮助字符串;请注意,它是“len”,而不是“len()”,是对函数的调用,我们不需要它
  • help(sys) - sys 模块的帮助字符串(必须先执行 import sys
  • dir(sys) - dir()help() 类似,但只是提供其已定义的符号或“属性”的简短列表
  • help(sys.exit) - sys 模块中 exit() 函数的帮助字符串
  • help('xyz'.split) - 字符串对象的 split() 方法的帮助字符串。您可以使用该对象本身或该对象的示例及其属性来调用 help()。例如,调用 help('xyz'.split) 等同于调用 help(str.split)
  • help(list) - list 对象的帮助字符串
  • dir(list) - 显示 list 对象属性,包括其方法
  • help(list.append) - list 对象的 append() 方法的帮助字符串