概述
在上一节的内容中,我们介绍了Python的诞生、发展历程、特色、缺点和应用领域。从本节开始,我们将正式学习Python。Python是一门简洁和优雅的语言,有自己特殊的一些语法规则。因此,在介绍Python编程的有关知识之前,先熟悉下Python的基础语法,是非常有必要的。
截止到2023年7月,Python的最新版本为3.12,本专栏将使用Python 3.x的语法介绍相关知识。
编码格式
在Python 2.x中,源文件默认编码格式为ASCII。如果内容中含有汉字,不指定编码格式的话,便不能正确的读取和输出。可以将下面的代码放到源文件的开头,来指定编码格式为UTF-8。
python
# -*- coding: UTF-8 -*-
在Python 3.x中,源文件默认编码格式为UTF-8。故在使用Python 3.x时,通常不需要指定编码格式。
标识符
标识符是软件编程中通用的概念,用于给变量、函数、接口、类等进行命名。Python中的标识符区分大小写,由字母、数字和下划线组成,第一个字符必须是字母或下划线,不能以数字开头。在Python 3.x中,可以用中文作为标识符。
以下划线开头的标识符具有特殊含义。单下划线开头的标识符(比如:_name),表示不能直接访问的类属性,需通过类提供的接口才能访问。双下划线开头的标识符(比如:__age),表示类的私有成员。双下划线开头和结尾的标识符(比如:init()为类的构造函数),表示Python中的内置标识。
关键字
Python中的关键字,也叫保留字,不能把这些关键字用作任何标识符的名称。Python 3.11中一共有35个关键字,可用keyword模块中的kwlist输出这些关键字。
python
import platform
import keyword
print(platform.python_version())
print(keyword.kwlist)
上述代码的输出如下:
python
3.11.4
['False', 'None', 'True', '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']
注释
在Python中,单行注释使用#,多行注释使用三个单引号(''')或三个双引号(""")。
python
import platform
import keyword
#print('hello world')
'''
print(platform.python_version())
print(keyword.kwlist)
'''
"""
第一行注释
第二行注释
第三行注释
"""
print('hello CSDN')
多行
通常情况下,python一行写一条语句,结尾不需要添加任何结束符号(如:C/C++的分号)。如果语句比较长,需要跨越多行时,可以使用反斜杠'\'符号来实现多行语句。但有一个例外,在()、[]、{}中的多行语句,不需要使用反斜杠'\'符号。
python
a = 66
b = 33 + \
55 + \
77
# c为元组
c = (1, 3, 5, 7, 9)
# d为列表
d = ['hello',
'CSDN',
'Fighting']
# e为set
e = {90,
91,
92}
当然,如果需要将多条语句写在一行,Python也是允许的,在每条语句后面加上分号即可。
python
a = 66; b = 99; c = 1
print(a + b + c)
空行
空行与代码缩进有所不同,空行是程序代码的一部分,但并不是Python语法的一部分。编写Python代码时,即使不插入空行,Python解释器运行也不会报错。函数之间、类的方法之间、不同功能块之间用空行进行分隔,表示一段新的代码的开始,便于日后代码的维护和重构。
python
def func1():
print('Hello CSDN')
def func2():
print('Hello World')
func1()
func2()
缩进
与C/C++、Java等语言不同,Python不使用大括号{}来表示类、函数、逻辑块的边界范围,而是使用缩进。缩进的空格数是可变的(推荐4个空格),但是同一个代码块的语句必须包含相同的缩进空格数,否则,程序运行时会报错。
python
a = 99
if a > 100:
print('ok')
print('a is larger than 100')
else:
print('cancel')
print('a is equal to or less than 100')
# 缩进空格不一致,运行会报错:IndentationError: unindent does not match any outer indentation level
print('hello')
引号
Python可以使用单引号(')、双引号(")、三引号(''' 或 """)来表示字符串。开始的引号与结束的引号的类型必须一致,三引号可以由多行组成。当字符串中含有双引号时,可以使用单引号,这样不需要使用转移字符'\'。同样的,当字符串中含有单引号时,可以使用双引号。
python
a = 'Hello'
# 字符串中含有单引号,使用单引号时,必须使用转义字符
b = 'I\'m hope_wisdom'
# 字符串中含有单引号,使用双引号时,不需要使用转义字符
c = "I'm hope_wisdom"
d = '''I have
a dream'''
e = """成就
一亿技术人
"""
输入输出
Python提供了input函数用于输入。input函数将所有输入都当作字符串看待,返回字符串类型。
Python提供了print函数用于输出,默认的分隔符为空格符,默认会换行(结尾符为换行符),可以通过额外的sep和end参数指定分隔符和结尾符。
python
a = input('input your name: ')
print('your name is', a)
# 输出:apple-banana-lemon#
print('apple', 'banana', 'lemon', sep='-', end='#')
import
在Python中需要引入其他库和模块的功能时,使用import关键字。
将整个模块导入时,使用:import 模块名。此时调用模块中的函数时,必须带上模块名。
从模块中导入函数A、B、C时,使用:from 模块名 import A, B, C。此时调用模块中的函数时,不用带上模块名。还可以使用as将函数名指定为其他名称,比如:from 模块名 import A as A_alias(后续使用A_alias即可)。如果需要导入模块中的所有函数,可以使用:from 模块名 import *。
python
import platform
from platform import version, release
from platform import processor as my_processor
print(platform.system())
print(version(), release())
print(my_processor())
运算符
表达式由运算符和操作数两部分组成,比如:66+88是一个表达式,其中,66、88是操作数,而+则是运算符。Python中常见的运算符可参考下表。
|---------|-----------------|---------------------------|
| 运算符 | 含义 | 使用说明 |
| + | 相加 | a + b |
| - | 相减 | a - b |
| * | 相乘 | a * b |
| / | 相除 | a / b,10 / 4的结果为:2.5 |
| // | 取整除 | a // b,10 // 4的结果为:2 |
| % | 取模 | a % b,10 % 4的结果为:2 |
| ** | 取幂 | a**b,2**3的结果为:8 |
| == | 是否相等 | a == b |
| != | 是否不等于 | a != b |
| > | 是否大于 | a > b |
| < | 是否小于 | a < b |
| >= | 是否大于等于 | a >= b |
| <= | 是否小于等于 | a <= b |
| = | 赋值 | a = 100 |
| += | 加法赋值 | a += b,与a = a + b相同 |
| -= | 减法赋值 | a -= b,与a = a - b相同 |
| *= | 乘法赋值 | a *= b,与a = a * b相同 |
| /= | 除法赋值 | a /= b,与a = a / b相同 |
| //= | 整除赋值 | a //= b,与a = a // b相同 |
| %= | 取模赋值 | a %= b,与a = a % b相同 |
| **= | 取幂赋值 | a **= b,与a = a ** b相同 |
| << | 左移几位 | a << 2 |
| >> | 右移几位 | a >> 2 |
| & | 按位与 | a & b |
| | | 按位或 | a | b |
| ~ | 按位取反 | ~a |
| ^ | 按位异或 | a ^ b |
| and | 布尔与 | a and b |
| or | 布尔或 | a or b |
| not | 布尔非 | not a |
| is | 两个标识符是否引用同一个对象 | a is b |
| is not | 两个标识符是否引用不同对象 | a is not b |
| in | 是否为序列、集合或映射的成员 | a in b |
| not in | 是否不为序列、集合或映射的成员 | a not in b |
这些运算符的优先级可参看下表,表中的运算符从上到下,对应的优先级从高到低。
|-----------------------------|------------|
| 运算符 | 备注 |
| ** | 幂运算 |
| ~ + - | 按位取反、正号、负号 |
| * / % // | 乘、除、取模、取整除 |
| + - | 加法、减法 |
| >> << | 右移、左移 |
| & | 按位与 |
| | ^ | 按位或、按位异或 |
| <= < > >= | 比较运算符 |
| == != | 等于、不等于 |
| = %= /= //= -= += *= **= | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not and or | 逻辑运算符 |
条件控制
在Python中,使用if、elif、else这三个关键字进行条件判断与执行控制。
python
a = 66
if a < 66:
print('condition 1')
elif a < 88:
print('condition 2')
elif a < 100:
print('condition 3')
else:
print('condition 4')
if、else还可以用作三目运算符,用于简化代码。
python
a = 100
b = 9 if a < 188 else 10
在Python 3.10中,新增了match、case的条件判断。match后的对象会依次与case后的值进行匹配,如果匹配成功,则执行匹配到的表达式;否则,直接跳过。case _则可以匹配剩下的所有情况,但只能放在最后面,否则,运行时会提示类似的错误信息:wildcard makes remaining patterns unreachable。
python
a = 2
match a:
case 1:
print('condition 1')
case 2:
print('condition 2')
case 3:
print('condition 3')
case _:
print('all')
循环
在Python中,使用while和for in进行循环的执行。在循环体中,continue用于退出本次循环,继续执行下一次循环;break则用于退出整个循环。while和for in后面,还可以添加else语句。当循环正常退出时,会执行else里面的代码;当循环执行了break跳出时,不会执行else里面的代码。
python
i = 0
while (i < 10):
if i == 5:
i += 1
continue
print(i)
i += 1
else:
# 会执行下面的语句,因为是正常退出循环的
print('while loop completed')
a = ['C', 'S', 'D', 'N']
for item in a:
if item == 'D':
break
print(item)
else:
# 不会执行下面的语句,因为是通过break跳出循环的
print('for loop completed')
#!/usr/bin/python3的作用
在有些Python源码中,会发现文件的首行为:#!/usr/bin/python3或#!/usr/bin/env python3。这条语句在Windows下基本没什么作用,主要在Linux、Mac等系统下生效。当使用chmod +x file.py命令增加file.py文件的可执行权限后,可以通过上面的语句找到python3程序,进而通过./file.py的方式直接执行python源码文件。
#!/usr/bin/python3和#!/usr/bin/env python3区别在于:前者直接指定了python3解释器的具体路径,后者则让env去查找python3的路径,并替换作为python3解释器的具体路径。