Python从入门到精通(微课精编版)
上QQ阅读APP看书,第一时间看更新

2.1 Python语法基础

2.1.1 代码缩进

Python没有像其他语言那样采用{}或者begin……end来分隔代码块,而是采用"冒号+缩进"的语法格式来区分代码之间的层级,缩进语法是Python语言最鲜明的特点,这种语法风格的优点概括如下。

➢ 代码足够精简、干净,没有冗余的字符。

➢ 程序的可读性大大增强,随时可以轻松阅读和理解曾经写过的代码。

提示:在Python语言中,代码块主要包括程序结构(如分支结构、循环结构)、函数体、类结构、异常处理和上下文管理等。

【示例1】新建test1.py文件,输入下面代码:要求用户输入姓名,然后打印欢迎信息,演示效果如图2.1所示。

    while True:                                               # 无限循环
        name = input("你叫什么?\n>>>")                       # 要求输入姓名
        if name:                                              # 显示欢迎信息
            print("%s,欢迎学习Python语言。" % name)
            break                                             # 结束循环
        else:                                                 # 如果为空,则返回提示输入
            print("不要匿名。\n%s" %("-"*50) )
            continue                                          # 返回继续询问

代码缩进量没有明确限制,但是相同代码块的代码必须保持相同的缩进量。如果相同代码块中各行代码缩进不统一,Python将抛出IndentationError异常。

【示例2】下面示例中print ( "Hello!" )和print ( "Python" )两句同属一个代码块,但是print ( "Hello!" )缩进4个空格,print ( "Python" )缩进3个空格,执行时将抛出IndentationError异常,如图2.2所示。

    if True:
        print ( "Hello!" )
       print ( "Python" )

图2.1 简单的交互程序

图2.2 抛出IndentationError异常

代码块的首行为命令行,以冒号结束,代码块的主体必须缩进显示。缩进结束,表示一个代码块的结束。同理,嵌套代码块采用相同的语法,进一步缩进显示。

    命令行:
        缩进代码块
        嵌套命令行:
            嵌套代码块
            …
        嵌套代码块结束
        …
    缩进代码块结束

【示例3】不同代码块的缩进量可以不同。在下面示例中,while代码块缩进1个空格,if代码块缩进2个空格,而else代码块缩进4个空格。为了方便代码阅读和维护,建议Python程序中所有代码块都应保持相同的缩进量,特别是相同层级的代码块,必须保持相同的缩进量,如if和else两个代码块,这样才能够更好地区分代码的层级。

    while True:                                          # while代码块缩进1个空格
     name = input("你叫什么?\n>>>")
     if name:                                            # if代码块缩进2个空格
       print("%s,欢迎学习Python语言。" % name)
       break
     else:                                               # else代码块缩进4个空格
         print("不要匿名。\n%s" %("-"*50) )
         continue

缩进可以使用空格键、Tab键表示。一个Tab键默认等于4个空格宽度,在IDLE中可以修改这个默认宽度。一般建议使用4个空格表示一个层级的缩进宽度。

2.1.2 代码行

在Python源代码中,行是一个重要概念,所谓的一行代码表示一条语句,这里的行是逻辑行,而非物理行。两者区分如下。

➢ 物理行:在窗口中所见的一行行代码,它通过回车符(CR)或换行符(LF)终止,在嵌入式源代码中则通过"\n"终止。

➢ 逻辑行:表示一条语句,通过NEWLINE(新行)形符终止。

一般情况下,一个物理行就是一个逻辑行。当然,多个物理行也可以构成一个逻辑行,这样一条语句可以分多行显示。实现方法有如下两种。

1.显式连接

在一个物理行的末尾添加续行符(\)。续行符后面不能附加任何代码,必须直接换行,行内也不能包含任何注释。通过续行符把多个物理行连接为一个逻辑行,其中的缩进也没有任何语法意义。

【示例1】下面示例定义一个字符串,通过续行符把它分多行显示。

    hi = 'Hello' \
          ',' \
          'Python'
    print(hi)               # 输出为  Hello,Python

2.隐式连接

在小括号(())、中括号([])、大括号({})内包含多行代码,不需要添加续行符,Python能够自动把它们视为一个逻辑行。在隐式连接中,行内可以添加注释。

【示例2】针对示例1,也可以按如下方式编写。

    hi = ('Hello'            # 物理行1
          ','               # 物理行2
          'Python')          # 逻辑行
    print(hi)                # 输出为 Hello,Python

如果多条相邻语句属于同一个代码块,可以合并在一个物理行内显示,语句之间使用分号(;)分隔。例如:

    while True:
        name = input("你叫什么?\n>>>")
        if name: print("%s,欢迎学习Python语言。" % name); break          # 代码块全部并行显示
        else:
            print("不要匿名。\n%s" %("-"*50) ); continue                  # 代码块内,局部两条语句并行
            pass                                                          # 最后一句,单独一行缩进显示

从上面示例代码可以看出:如果代码块首行与代码块主体合并一行显示,则不能包含缩进的语句;如果仅是代码块主体语句,则可以局部语句合并一行显示。

注意:一般不建议在同一行内编写多条语句,这不符合Python推荐的编码习惯。

2.1.3 代码注释

Python解析器不解析注释字符,注释字符有两种格式:单行注释和多行注释。

(1)单行注释以#开头,从符号#开始,直到物理换行符为止的所有字符将被忽略。例如:

    print("Hello, Python")          # 打印提示信息

(2)多行注释使用3个引号'''和"""定义。例如:

    '''多行
    注释信息'''
    """多行注释
    信息"""

单行注释可以出现在源代码中任意位置,可以灵活地为某条语句进行注解;多行注释一般位于程序的开头,或者代码块的开头,用于对Python模块、类、函数等添加说明。

注意:在多行注释中,开头3个引号必须顶格书写,由于Python允许使用3个引号定义字符串,如果3个引号出现在语句之中,那么它包含的信息就不是注释,而是字符串。

例如,下面语句中3个单引号包含的信息是字符串。

    print('''Hello, Python''')

2.1.4 空字符和空行

空字符表示各种不可见字符,如空格、Tab字符、换行符等。这些空字符在逻辑行的开头具有语法意义,表示缩进。在字符串中具有实际字符的含义。但是,在其他位置,空字符没有任何语义,不会被解析,主要作用是区分不同的形符。

1个空字符和10个空字符没有本质区别,都具有相同的作用:分隔两个形符。例如,abc表示1个形符,而a b c表示3个形符。

空行表示一个只包含空格符、制表符、进纸符或者注释的逻辑行。空行将被Python解析器忽略,不被解析。空行的作用:分隔两段不同功能的代码块,便于代码阅读和维护。例如,函数体、类结构、类方法之间可以使用空行分隔,表示一段新代码的开始。

提示:在交互模式中,一个完全空白的逻辑行,不包含空格或注释,能够结束一条多行复合语句。如函数、循环、条件等。

2.1.5 形符

形符是各种名称、符号、字符序列或抽象概念的统称,主要包括:标识符、关键字、保留字、运算符、分隔符、字面值、NEWLINE(新行)、INDENT(缩进)和DEDENT(突出)。

注意:除了行终止符外,其他空字符不是形符,而是形符之间的分界符。

1.标识符

标识符就是各种有效的名称,如关键字、保留字、变量、类、函数、方法等。标识符的第一个字符是字母或下画线(_),其余部分由字母、数字或下画线组成。标识符的长度没有限制,对大小写敏感。

提示:Python 3.0开始引入了ASCII范围外的字符定义标识符,如双字节汉字。例如:

    变量 = "Python"          # 使用汉字定义变量名
    print(变量)              # 引用变量,打印为 Python

2.关键字

关键字是Python预定义的、具有特殊功能的标识符。

使用keyword模块的kwlist集合可以查看当前Python版本支持的关键字。例如:

    import keyword
    print(keyword.kwlist)              # Python 3.9.0版本支持的关键字

输出为:

    ['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally',
    'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

3.保留字

保留字以下画线开头或结尾,是包含特殊含义的标识符。

➢ _*:开头包含单下画线,表示模块私有名称。不会被from module import *导入。

➢ __*__:开头和结尾包含双下画线,表示Python预定义名称,也称魔法变量或魔术方法。

➢ __*:开头包含双下画线,表示类的私有名称,仅在当前类中使用,不能在类外访问,也不能够被继承。

4.运算符

运算符就是执行各种运算的符号,如+、-、*、**、/、//、%、@等,详细说明见参3.1.2节。

5.分隔符

分隔符不执行运算,仅表示语法分隔的作用,如小括号(())、中括号([])、大括号({})、逗号(,)、冒号(:)、点号(.)、分号(;)、单引号(')、双引号(")、井号(#)、反斜杠(\)等。

6.字面值

字面值表示一些内置类型的常量。字面值一旦声明,就不再变化。例如:

    123               # 数字字面值
    "python"          # 字符串字面值

7.特殊符

NEWLINE(新行)、INDENT(缩进)和DEDENT(突出)是3个抽象的概念,没有具体的名字,仅在解析时表示特定的语法标志。例如,NEWLINE表示一个逻辑行的结束,INDENT表示一个缩进层级,DEDENT表示一个缩进层级的结束。