非正式的Python介绍

在你下载好了Anaconda版本的Python之后,让我们来写一些简单的Python代码吧!我们暂时先不编写完整的Python脚本,而只用一个方便的工具——IPython命令行——来快速地尝试一些简单的代码。Anaconda一并安装了IPython命令行;这将帮助你一步步增加代码片段,而不是要一次性执行整个脚本。

让我们打开IPython命令行。如果你是Mac或者Linux用户,打开你的命令行;如果你是Windows用户,打开 cmd.exe。输入 ipython 并敲击回车,你应该可以在屏幕上看到接下来的内容:

IPython console example

当我们输入简短的Python代码片段并输入回车时,CPython直译器会在IPython命令行中瞬间执行你的代码。

让我们熟悉一下Python的数字(number),字符串(string),和列表(list)。在这个过程中,我们会了解Python标准库的一些模组,如math模组。IPython提供的自动完成和说明文档显示功能会帮助我们探索标准库和其中Python对象(object)的功能。尝试使用Python的字符串和列表会帮助我们对Python的通用界面产生印象,并演示这些基本数据类型的方便特征。

玩玩数字

是时候执行一些简单算术的Python代码了。在IPython命令行中输入 2 + 3 并敲击回车,你应该能看到接下来的输入和输出:

[1]:
2 + 3
[1]:
5

这个命令行进程是持久性的,也就是说我们定义的变量可以在这个进程之后的代码重新调用。让我们定义变量 x 并向其赋值数值整数 10(请在命令行中跟随本教程)

[2]:
x = 10

我们可以在这个命令行里查看 x 的值。在下一行中输入 x 并回车:

[3]:
x
[3]:
10

现在,让我们在二次方程 \(x^{2} + 2x + 3\) 中调用 x,并计算结果。

[4]:
x**2 + 2*x + 3
[4]:
123

Python的“标准库”——也就是和Python核心语言一起包装的各种工具和函数——包含了很多常见的数学函数。为了组织和结构,Python将这些数学函数存在一个叫做“math”的模组里。我们必须要在代码里导入(import)这个模组来使用这些函数。

[5]:
import math

在导入完之后,math 这个单词在我们代码里将代表math模组。IPython提供了一个查看math模组所有函数的方便方法。在命令行中输入 math.(注意在单词后面的点)并敲击 <TAB>。你应该看到接下来的这个列表:

Displaying the contents of the math module

一般来说,敲击 <TAB> 会使IPython尝试自动完成你的代码。这个列表显示了所有可以在 math. 之后输入的内容。在“s”打头的函数中,我们可以看到 sqrt()。这就是一个求平方根的函数。输入 math.sq 然后在敲击 <TAB> ,你会看到IPython将自动完成你的代码成 math.sqrt

让我们用这个函数来计算 \(\sqrt{100}\)

[6]:
math.sqrt(100)
[6]:
10.0

你可能会好奇为什么计算的结果显示的是 10.0 而非 10;在模组2中我们会了解这两个输出是两种不一样的数据类型。前者被称为浮点数,因为小数点是一个漂浮的点,而后者则是一个整数。函数 math.sqrt 的定义使得它永远都会返回浮点数。

当我们想要经常使用math模组里的某个函数时,我们可能希望不需要每次都要打出math模组的前缀 math.。我们可以通过从math模组导入单独的函数来达成这个目的。我们将从math模组导入阶乘(factorial)函数。

[7]:
from math import factorial

我们现在可以在代码里直接调用 factorial 函数。5的阶乘是 \(5! = 5\times 4\times 3\times 2\times 1 = 120\)

[8]:
factorial(5)
[8]:
120

试试字符串

在代码中,我们将文字理解为一连串的字符,也就是字符串(string)。因为Python提供了很多方便,高效的字符串处理函数,所以它很适合于文本处理工作。

让我们先通过在双引号之间敲击字符来创建第一个字符串吧:

[9]:
"the cat in the hat"
[9]:
'the cat in the hat'

单引号也可以:

[10]:
'the dog in the sash'
[10]:
'the dog in the sash'

译者注:记得切换到英文输入法的引号 ’‘和 。中文的 ‘’ 和 是不会被识别的。

如果你使用单引号来创建一个字符串,那么那个字符串就可以含有双引号(反之亦然):

[11]:
'He picked up the phone, "Hello? What do you want?" Bob was a rather impolite dude.'
[11]:
'He picked up the phone, "Hello? What do you want?" Bob was a rather impolite dude.'

当然,我们也有专门的特殊字符来帮助我们改变一个字符串的被打印出时的格式。比如说,如果 \n 出现在字符串中,它会被当为一个代表回车的字符。这仅仅会在你使用自带的 print 函数(一个指示计算机将文本显示在用户电脑屏幕上的函数)来打印这个字符串时才会显示,

让我们创建一个会被 print 显示为三行文字的字符串。

[12]:
print("I like to talk to dogs.\nI like to talk to cats.\nWhat's my deal?")
I like to talk to dogs.
I like to talk to cats.
What's my deal?

当然,字符串的作用远远不及仅仅存储文本!让我们探索一些操作字符串的方法。首先,我们将创建一个字符串并将其存储到一个名为 sentence 的变量中:

[13]:
sentence = "Who would have thought that we were robots all along?"

让我们通过字符串的“length”(长度)来查看这个字符串有几个字符吧:

[14]:
len(sentence)
[14]:
53

我们可以通过切片(slice)这个字符串来查看它的前四个字符,最后六个字符,或者中间的字符。

[15]:
sentence[:4]
[15]:
'Who '
[16]:
sentence[-6:]
[16]:
'along?'
[17]:
sentence[5:22]
[17]:
'ould have thought'

我们也可以查看是否我们的这个字符串是否包含其它的某个的字符串。字符串 "robot" 是否在 sentence 中呢(is "robot" in sentence)?

[18]:
"robot" in sentence
[18]:
True

为了快速查看所有字符串可以调用的自带函数,我们可以再次使用IPython的自动完成功能。输入 sentence.(不要漏掉最后的点)并敲击 <TAB>。我们会看到一列表的函数:

Built-in functions for a string

让我们用名为count的函数来数 sentence 中有多少小写的w。

[19]:
sentence.count('w')
[19]:
3

让我们看看replace函数是做什么用的。IPython提供一个很方便的看看函数说明文档的功能,只需在函数名后输入两个问号。如下:

Looking up documentation for a function

利用我们刚得到的对字符串replace函数的理解,让我们用“computer”来代替“robot”:

[20]:
sentence.replace("robot", "computer")
[20]:
'Who would have thought that we were computers all along?'

看看列表

列表(list)是Python标准库中容器的一种。它可以存储一序列(sequence)的Python对象(object)。我们可以创建一个数字列表:

[21]:
[-1, 1/3, 10*2, 7-1]
[21]:
[-1, 0.3333333333333333, 20, 6]

列表可以存储任何类型的Python对象;它可以混合存储数字,字符串,其它列表,和任何类型的对象。

[22]:
[1, 2, "a", 0.5, "apple and orange"]
[22]:
[1, 2, 'a', 0.5, 'apple and orange']

你可以将两个列表粘连(concatenate)到一起。

[23]:
[1, 2, 3] + ["a", "b", "c"]
[23]:
[1, 2, 3, 'a', 'b', 'c']

像字符串一样,列表本质上也是一个序列,所以我们可以通过项目在列表中的位置来访问它。这个位置叫做项目的索引(index);序列第一个成员的索引永远都是0.

[24]:
my_list = [10, 20, 30, 40, 50, 60]
[25]:
my_list[0]
[25]:
10
[26]:
my_list[1]
[26]:
20

你可以使用负整数来相对于列表结尾(右边)来索引。

[27]:
my_list[-1]
[27]:
60

你也可以通过对列表中的项目赋值来修改列表的内容。

[28]:
-5 in my_list
[28]:
False
[29]:
my_list[1] = -5
[30]:
my_list
[30]:
[10, -5, 30, 40, 50, 60]
[31]:
-5 in my_list
[31]:
True

我们也同样可以通过切片(slice)这个列表来存取其中的多个项目,就像之前的字符串一样。

[32]:
my_list[:3]
[32]:
[10, -5, 30]

这个切片出的结果可以用来更新列表的前三项内容。

[33]:
my_list[:3] = "abc"
[34]:
my_list
[34]:
['a', 'b', 'c', 40, 50, 60]

为这个演示收尾,让我们在这个列表的结尾附加(append)一个新成员。

[35]:
my_list.append("moo")
[36]:
my_list
[36]:
['a', 'b', 'c', 40, 50, 60, 'moo']