# 基本语法

# 语法特点

  • Python 是一种脚本语言,属于解释型语言、动态语言。

  • Python 借鉴了 C、Shell 等语言的特性,比如标识符的命名规则、运算符。

  • 与其它编程语言相比, Python 的语法特点:

    • 脚本文件的扩展名为 .py 。
    • 在每条语句的末尾,使用一个换行符,表示这条语句的结束。
      • 也可以用分号 ; 表示一条语句的结束,从而将多条语句写在同一行,比如 x=1; y=2,但是看起来不简洁。
    • # 声明单行注释。
    • 将缩进作为语法的一部分,强制要求代码缩进,从而提高可读性。
    • 支持定义函数。
    • 支持定义类,进行面对对象编程。
    • 不需要主动管理对象占用的内存,会自动分配内存、回收内存。
    • 代码与平台解耦,同一段 Python 代码可以被不同平台的 Python 解释器执行。

# 程序示例

编写一个脚本文件 test.py :

#!/usr/bin/python
# -*- coding : utf-8 -*-

x = 1                       # 创建一个变量,名为 x ,赋值为 1
x = "Hello World!"          # 给变量 x 赋值一个字符串
print(x)                    # 将一个值打印到终端

def test_print(x, y):       # 定义一个函数
    print(x, y)

test_print(3.14, "Hello")   # 调用函数
  • 第一行的注释 #!/usr/bin/python 可以省略。
    • 该注释用于在类 Unix 系统上执行该脚本时,自动找到一个 Python 解释器。
  • 第二行的注释 # -*- coding: utf-8 -*- 可以省略。
    • 该注释用于声明该脚本的编码格式,让 Python 解释器正确识别。
    • Python2 的脚本才需要加入该注释。Python3 默认按 utf-8 编码读取脚本文件,因此省略该注释。

# 代码风格

  • Guido van Rossum 认为,一段代码被阅读的次数,远远多于被编写、修改的次数。因此写代码时,应该尽量提高代码的可读性,使得代码容易被人阅读、理解。

    • 例如:如果使用单个字母作为变量名,则写代码时省事一些,但其他人看到这个字母时,难以理解这个变量的含义。
    • 例如:使用 lambda 等高级语法,可以使代码更简短,但是可能难以阅读。
  • 即使人们刻意提高代码的可读性,但不同人写代码的风格可能不同,比如标识符的命名格式。如果大部分人都采用同一种代码风格,则可以进一步提高代码的可读性。

    • 因此,Guido van Rossum 发表了 PEP 8 (opens new window) ,建议 Python 开发者采用一些代码风格,从而提高 Python 代码的可读性。

# 关于排版

  • 在一个语句块中嵌套另一个语句块时,内语句块的每行代码,应该在行首增加缩进。
    • 缩进应该使用空格,而不是制表符。
    • 每层缩进,建议为 4 个空格。
    • 同一个语句块中,每行代码的缩进长度必须相同。否则 Python 解释器会认为它们不属于同一个语句块,在执行这段代码时报错。
  • 同级别的语句块之间,应该插入一个空行作为间隔。例如两个函数之间。
  • 一个语句块的内容不能为空,即至少应该包含一行代码。如果不想写代码,可以写一个关键字 pass ,表示不进行任何操作。
  • 在运算符的两侧、逗号的右侧加上一个空格,从而美化排版,但是括号的两侧不需要加空格。例如:a = max(1, 2) + max(3, 4)
  • 每行代码不应该太长。
    • 建议每行代码的长度,不超过显示器宽度的一半,这样方便在显示器中并排查看两个文件(经常有这种需求,比如用 git 比较文件差异)。
    • 如果严格要求,则建议每行代码不超过 79 个字符(包括行首缩进)。如果超过该长度,则应该将一行代码写作多行。例如:
      msg = 'one two three four' + \  # 使用反斜杠 \ 之后,可以插入换行符
            'five six seven eight'    # 这里添加几个空格的缩进,使得上下两行字符串对齐,容易阅读
      
      msg = ('one'      # 将一个表达式用括号包住之后,可以插入换行符
            + 'two'
            + 'three'
            + 'four'
            )
      

# 关于命名

  • 变量名、函数名等名称,统称为标识符。Python 要求标识符遵守以下命名规则,否则语法报错:

    • 标准符可以由阿拉伯数字、英文字母、下划线组成。
      • 不能以数字开头。
      • 字母要区分大小写。例如 man 与 Man 是两个不同的标识符。
    • 某些字符串是 Python 的关键字或保留字,不允许被用户用作标识符。
      • 例如 import、with、and 是关键字。
  • 如果标识符由多个英文单词组成,如何分隔每个单词,从而方便供人阅读?

    • 在 C、Java 等编程语言中,有以下几种常见的命名风格:
      • 下划线命名法:在单词之间插入下划线。例如 my_name
      • 大驼峰命名法:将所有单词的首字母大写,直接拼接在一起。例如 MyName
      • 小驼峰命名法:类似于大驼峰命名法,但是将第一个单词的首字母小写。例如 myName
      • 匈牙利命名法:类似于大驼峰命名法,但是在标识符前加上一个小写字母,表示数据类型。例如 sMyName
        • 现代的 IDE 通常能自动提示标识符的数据类型,因此没必要使用匈牙利命名法。
    • 在 Python 中,建议采用以下命名风格:
      • 变量名、函数名的所有字母都小写,因此适合下划线命名法。例如:my_name
      • 类名采用大驼峰命名法。例如 MyName
      • 常量名的所有字母都大写,因此适合下划线命名法。例如:MY_NAME

# 注释

  • 在一行代码中插入 # ,即可将右侧的字符串声明为单行注释。如下:

    # 这个注释位于上方
    x = 2
    
    x = 1     # 这个注释位于右方
    
  • 在多行代码的开头、结尾,加上三个引号 '''""" ,即可声明多行注释,又称为块注释(block comment)。

  • Python 解释器执行 Python 代码时,

    • 会忽略单行注释,相当于它们不存在。
    • 会将多行注释记录起来,作为说明文档。
  • 每个函数的 def 语句之后,可以紧接着插入多行注释,作为该函数的说明文档。如下:

    >>> def fun1(x, y):
    ...     """Hello World"""
    ...
    >>> fun1.__doc__    # 通过函数的 __doc__ 属性,查看其说明文档
    Hello World
    
  • 每个 .py 文件的开头位置,可以插入多行注释,作为该文件的说明文档。如下:

    """
    This module is for test.
    """
    
    print('hello')
    

# 输入输出

# print()

通常使用 Python 的内置函数 print() 来输出字符串到终端。如下:

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    # 功能:将 value 参数的值,输出到终端
    # sep   参数:如果 value 包含多个值,就在它们之间加上一个 sep 值,从而拼接成一个字符串
    # end   参数:输出 value 之后,在末尾加上一个 end 值
    # file  参数:将 value 输出到哪个文件对象。默认会输出到终端 sys.stdout ,俗称为"打印到终端"
    # flush 参数:默认为 False ,表示调用 print() 函数时,不会立即输出到 file ,而是等缓冲了一定体积的字符串之后才输出
  • 例:
    >>> print('Hello', end='\n\n')
    Hello
    
    >>> print('Hello', 'World', '!')
    Hello World !
    
  • 例:显示一个动态进度条
    >>> for i in range(101):
    ...     print('\rProgress: {:12}{}%'.format((i // 10) * '▇', i), end='', flush=True)
    ...     time.sleep(0.1)
    ...
    Progress: ▇▇▇▇▇▇▇▇▇▇  100%
    
    这里配置了 end='' ,使得每次输出之后不换行,因此可以通过 \r 回到行首,重新输出这一行内容。

# input()

通常使用 Python 的内置函数 input() 来从终端读取一个字符串(由用户键盘输入)。如下:

input(prompt=None)
    # 功能:将 prompt 输出到 stdout ,作为提示供用户查看。然后从 stdin 读取一行字符串(会忽略末尾的换行符),将它作为 input() 函数的返回值
  • 例:
    name = input('Please input your name:')