2. Python 简介

本节只介绍 Python 的基础语法,原则上不涉及任何库的使用。

本节适合通读,而并不需要读者记录任何用法;本节中的所有内容会在后续章节中系统地进行介绍。

2.1. 编程人员快速上手

注意

本节专为有过其他编程语言经验的技术人员设置;如果您是编程新手,可以向下滚动以跳过此节。

如果您曾经使用过其他编程语言,那么您可能需要知道 Python 的以下特性。

  • Python 是一门解释型语言(Interpreted language),代码由解释器(Interperter)直接逐行执行。与之相对的是编译型语言(Complied language),例如 C++;编译型语言的代码会先被编译器(Compiler)编译为机器码,然后执行。

  • Python 是一门动态类型语言(Dynamically typed language)——这意味着它在运行时(而不是编译时)才进行类型检查。它同时也是*强类型**(Strongly typed)的。

  • Python 中的函数是第一类对象(First class object),可以赋值给变量或容器、作为参数传入、作为返回值。

用一段列表扼要介绍 Python 的语法特点:

  • 代码文件的扩展名是 .py

  • 变量/函数声明:

    • 赋初值,但无需指明类型关键字(函数无需指明返回值类型)

    • 没有硬常量类型

  • 行尾标识:无(没有分号!)

  • 变量名/函数名:

    • 大小写敏感,比如 yY 是两个变量

    • 通常使用小写字母 a~z,大写字母 A~Z,数字 0~9 以及下划线 _ 组成

    • 不可使用 Python 原生的关键字(保留字),参考 Keywords - Python 官方文档。目前版本的关键字有:

      False      await      else       import     pass
      None       break      except     in         raise
      True       class      finally    is         return
      and        continue   for        lambda     try
      as         def        from       nonlocal   while
      assert     del        global     not        with
      async      elif       if         or         yield
      
  • 数据类型:简要介绍几种易与其他语言类比的数据类型。

    1. 字符串 str:Python 没有单字符类型,单个字符仅仅是长度为 1 的字符串。

    2. 列表 list:类似于数组、矩阵类型。

    3. 字典 dict:键值对数据,类似于哈希表。

    4. 整型 int,浮点型 float:常见的数字类型。

    5. 布尔型 bool:逻辑类型,真或假。

    6. 空 NoneType:对应保留字 None,类似于某些语言的 null 或 nil

  • 注释:行内注释使用井号 # 开启,例如 a = 1  #comment

  • 代码块:

    • 按缩进识别,第一层四个空格,第二层八个,以此类推

    • 代码块的内部结构以冒号开启,比如

      if i < n:
          i += 1
      else:
          m = i
      
    • 无需花括号!

    • 在代码块结束时,不需要 end,也不需要额外的空白行

  • 全局标记:用 global 关键字在函数内标记一个变量,它的值会被保留到函数外(全局)。参考下例:

[1]:
a = 1
def f():
  global a
  a = 2
f()
print(a)
2

2.2. 引言:从数字运算熟悉语法

Python 的基础语法非常简单,让我们先从数字开始吧。

2.2.1. 变量的使用

Python 中的变量不需要声明类型,可以直接赋值使用。比如,我们现在记录两个数字到变量 ab

[2]:
a = 5
b = 2

上面两行代码就创建了两个整型变量 ab。一些注意点:

  • Python 的赋值符号是简单的等号 =,而不是 := 之类的东西

  • 每一行是一条语句。语句末尾不需要 ; 或任何断行标记

  • 行内的空格不是必需的,只是为了更好的可读性。你也可以把 a = 5 紧凑地写为 a=5

  • 行首不可以有空格,除非正使用代码块

2.2.2. 数字运算

数字间的四则运算与大多数编程语言一样,加、减、乘、除分别是 +-*/

[3]:
a + b, a - b, a * b, a / b
[3]:
(7, 3, 10, 2.5)

上述非 print 的写法只在交互式的 Python 命令行中有效,在执行 .py 文件时是不会输出结果的。正规的写法是利用 print() 函数,将它们依次打印到屏幕(print() 函数默认以空格分隔每一项)。

  • 函数 print 被调用了,其右侧的括号内是函数的输入参数。

  • 函数的各个输入参数之间用英文逗号分隔

[4]:
print(a + b, a - b, a * b, a / b)
7 3 10 2.5

函数 print() 可以用 sep 参数来指定以什么分隔符来分隔多个要输出的项(默认是空格)。比如用换行符 \n

[5]:
print(a + b, a - b, a * b, a / b, sep='\n')
7
3
10
2.5

稍微复杂一点的数字运算是整除、取余和乘方,分别是 //%**

[6]:
print(a // b, a % b, a ** b)
2 1 25

在同时计算整除与取余时,Python 还提供了一个函数 divmod(),它返回一个长度为 2 的元组,即 divmod(x, y) = (x//y, x%y)

[7]:
print(divmod(a, b))
(2, 1)

在 Python 中,圆括号代表高优先级;方括号与花括号在 Python 中有另外的含义,因此在做数学运算的时候,你只能不断地叠用圆括号:

[8]:
(2 + (2 * 2)) // 5
[8]:
1

2.2.3. 存储计算结果

要将结果储存起来,使用之前介绍的赋值号 =

[9]:
c = a + b
d = divmod(a, b)
e, f = divmod(a, b)
print(c, d, e, f)
7 (2, 1) 2 1
  • 在 Python 中,用井号(Sharp 号)# 来开始一个行内注释,它右侧的内容会被注释掉。

  • 赋值不必是一对一的;如果赋值号右侧的表达式返回一个长度为 n 的元组,那么左侧也可以用 n 个由逗号连接的变量来接受按顺序拆分的结果。

    • 上例中 d 接受了一个长度为 2 元组的返回值,因此 d 是一个的元组,值是 (2,1)

    • 上例中 e, f 接受了元组 (2,1) 的赋值,因此 e 被赋值为 2, f 被赋值为 1。

2.3. 注释

Python 用 # 符号来将本行内该符号右侧的内容标记为注释,方便用户输入说明性的文字。

[10]:
a = 1
# a = 2
b = 3  # We know b > a
print(a, b)
1 3

2.4. 代码块

Python 中的代码块(比如函数的定义、判断语句的内容)并不使用花括号包裹,也不用 end 作为结尾.

  • 开启代码块的行一般以英文冒号结尾,比如 if, for 语句

  • Python 使用 四个空格 的行首缩进来标出代码块的层级

  • 代码块每嵌套一次,就在行首再多添加四个空格

  • 代码块以行首减少四个空格的新航来自然结束

[11]:
x = 2
if x > 1:
    print(x)
print("Outside the block")
2
Outside the block

嵌套的代码块:

[12]:
x = 2
if x > 1:
    print("Block")
    if x < 3:
        print("Nested block")
    print("Block")
print("Outside")
Block
Nested block
Block
Outside

2.5. 加载库*

Python 的丰富生态由多种多样的库构成,它们提供了许多外部的功能。要使用库,需要在调用库的函数前加载。

  • 使用 import lib 来加载名为 lib 的库

  • 使用 lib.func() 来使用 lib 库中定义的函数 func

这些库中,一部分是标准库,它们随 Python 安装,比如标准数学库 math

[13]:
import math

print(math.log(2.71828))
0.999999327347282

另一些库是外部库,它们是由社区提供的,需要先安装到本地才能加载。关于如何安装外部库,参考上一章的 pip 安装命令。

在安装了外部库后,它们就可以像上面的标准库一样加载与使用了:

  • 加载时的 as 命令可以给库设置一个自定义的名称。

[14]:
import numpy as np

print(np.exp(1))
2.718281828459045

有时我们只需要用到库中的个别函数,这时候可以用 from ... import 语句:

[15]:
from numpy import pi, sin
from numpy import exp as npexp

print(sin(pi/2), npexp(1), sep='\n')
1.0
2.718281828459045

上例中引入了 numpy 库中的 pi 常量与 sin 函数(需要注意不要与已有的变量/函数名冲突),还引入了 exp 函数并设置 npexp 为它的自定义名称。

更多的关于库的使用,参考后文的相关章节。