序言
欢迎学习 Google 的 Python 在线教程。它基于内部提供的入门级 Python 课程。如设置页面中所述,本资料介绍了 Python 3。
如果您正在寻找配套的 MOOC 课程,不妨试试 Udacity 和 Coursera 中的课程(编程入门 [初学者] 或 Python 入门)。最后,如果您正在寻求自定进度的在线学习方式,不看视频,可以试试这篇博文结尾处列出的资源。每款工具都包含学习内容,以及您可以用来练习的 Python 交互式解释器。这个“翻译工具”是什么呢?您将在下一部分中了解到!
语言简介
Python 是一种动态的解释型(字节码编译)语言。源代码中没有变量、形参、函数或方法的类型声明。这使得代码简短而灵活,并且您无需对源代码进行编译时类型检查。Python 在运行时会跟踪所有值的类型,并标记运行时毫无意义的代码。
要了解 Python 代码的工作原理,一个绝佳方法是运行 Python 解释器并直接将代码输入其中。如果您遇到诸如“如果我向 list
添加 int
会怎样?”这样的问题,只需将其输入 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, inTypeError: 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, inNameError: 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”分离开来,变量。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() 时,它才会注意到不存在此类函数并引发错误。此代码段中还有第二个错误。name 在与“Guido”进行比较之前未赋值。Python 会引发“NameError”。这些示例旨在说明,当您首次运行某个 Python 程序时,您最初看到的一些错误是简单的拼写错误或未初始化的变量,就像这样。在这方面,具有更详细类型系统的语言(例如 Java)具有优势...它们可以在编译时捕获此类错误(当然,您必须维护所有类型信息...这是一种权衡)。
Python 3 引入了类型提示。
借助类型提示,您可以指明函数中每个参数的类型以及
函数返回的对象的类型。
例如,在带有注解的函数 def is_positive(n: int) -> bool:
中,参数
n
为 int
,返回值为 bool
。
我们稍后将介绍这些类型的含义。不过,类型提示完全是可选的。
您会看到越来越多的代码采用类型提示,因为如果使用类型提示,
某些编辑器(如 cider-v 和 VS.code)可以运行检查,以验证是否使用
正确的参数类型。他们甚至可以在您修改代码时建议和验证参数。
本教程不介绍类型提示,但我们希望确保您在听说
还是在野外看到它们。
变量名称
由于 Python 变量并没有在源代码中明确列出任何类型,因此为变量指定有意义的名称来提醒自己正在发生的情况会更有帮助。因此,请使用“name”如果是单个名称,则使用“names”如果是名称列表,则为“元组”如果是元组列表。 许多基本的 Python 错误都是由于忘记了每个变量中的值的类型导致的,因此请使用变量名称(只有您全部的变量名称)来帮助解决问题。
就实际命名而言,对于由“多个字词”组成的变量名称,有些语言更倾向于使用 underscored_parts。但其他语言更喜欢驼峰式大小写一般来说,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 字符串小写”。通常,用户首次点击时就能获得答案。由于某种原因,这种方法对于 Python 似乎比在其他语言上效果更好。
- Python 官方文档网站 — docs.python.org - 包含高质量的文档。尽管如此,我经常发现在 Google 上搜索几个字词要快一些。
- 我们还专门为刚开始接触 Python 和/或编程的用户提供了官方的导师邮寄名单!
- 您可以在 StackOverflow 和 Quora 上找到许多问题(和解答)。
- 使用 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()
方法的帮助字符串