跳转至

Python基础知识

约 3989 个字 277 行代码 预计阅读时间 17 分钟

Python中的注释

在Python中有两种注释的方式:

  1. 行内注释:使用#开头
  2. 多行注释:使用三个引号,既可以是单引号'''也可以是双引号"""

例如下面的代码:

Python
1
2
3
4
5
6
7
8
9
# 单行注释

'''
多行注释
'''

"""
多行注释
"""

Python中的输入和输出

对于输入来说,在Python中可以使用input函数进行输入,其可以传递一个字符串,表示提示文字。需要注意,在Python中,input函数的返回值始终是一个字符串,如果输入的数值并且这个数值后面需要做算术运算,那么必须要进行强制类型转换

对于输出来说,在Python中可以使用print函数进行输出,默认情况下,print函数在输出完参数内容后会自动换行,如果不希望进行默认的换行,可以使用end=""指定结尾转义字符,默认情况下是end="\n"

如果使用print函数一次性输出多个内容,则这些内容需要使用逗号,进行分隔,在输出结果中,每一个由逗号隔开的内容中间会多一个逗号,原因就是print中的一个参数sep=' '决定的,如果不希望该空格替换逗号,则可以考虑将空格替换为空字符串,即sep=''

与C语言/C++一样,可以在print函数中使用格式化输出,对应的格式化字符与C语言/C++一致,但是对于包含格式化字符的字符串和待输出的值来说,二者中间的分隔符号为%对于待输出的值如果有多个,则需要使用括号包裹

Note

注意,不同于C语言/C++,在Python中不可以在结尾添加;作为语句结尾符号

例如下面的代码:

Python
1
2
3
4
5
6
7
8
# # 获取输入
name = input("请输入名字:") # 输入:mark
print(name) # mark

# 格式化输出
name = "Tom"
age = 20
print("你的名字是:%s, 你的年龄是:%d" % (name, age)) # 你的名字是:Tom, 你的年龄是:20

如果不想使用格式化字符串,也可以使用f-string,即带格式的字符串,使用在需要输出的字符串前写上f,在常量字符串中使用{}包裹需要输出的变量或者表达式(更多内容见Python输出与文件操作),例如下面的代码:

Python
1
2
a = 1
print(f"a的值是:{a}")

Python中的数据类型

定义变量

在Python中,定义变量的方式如下:

Python
1
变量名 = 

Note

需要注意,在Python中创建变量不需要关键字,注意和其他编程语言包括JavaScript进行区分

除了上面最基础的方式对变量进行赋值外,还可以通过连等对多个变量赋予同一个值,例如:

Python
1
num1 = num2 = num3 = 10;

如果想对多个变量分别赋予不同的值,则可以使用元组赋值

在元组赋值中,第一个变量对应赋值符号右侧的第一个值,第二个变量对应赋值符号右侧的第二个值,以此类推

例如下面的代码:

Python
1
2
a, b = 10, 20
print(a, b) # 10 20

Note

如果担心定义的变量名与关键字冲突,可以通过keyword类中的属性kwlist查看Python中的关键字,例如下面的代码:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 引入keyword类
import keyword
# 输出所有关键字
print(keyword.kwlist)

输出结果
['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']

与JavaScript一样,这种赋值方式可以更容易实现变量值的交换,例如下面的代码:

Python
1
2
3
4
5
6
7
# 元组赋值
a, b = 10, 20
print(a, b) # 10 20

# 交换两个变量的值
a, b = b, a
print(a, b) # 20 10

学习JavaScript时,了解到JavaScript是动态弱类型语言,对于Python来说,其与JavaScript类似,但不完全是动态弱类型,例如下面的代码:

Python
1
2
3
4
num = "10" # 字符串
print(num) # 10
num = 10 # 整数
print(num) # 10

Python和JavaScript的部分区别

  1. 强类型 vs. 弱类型:

    • JavaScript是一种弱类型语言,这意味着它在类型转换时更加宽松,允许不同类型之间进行隐式转换。例如,"5" + 1会得到"51",而不是抛出错误
    • Python则是一种强类型语言,严格区分不同的数据类型。尝试在不同类型之间进行不明确的操作时,会抛出类型错误。例如,"5" + 1在Python中会引发TypeError
  2. 类型提示:

    • Python引入了类型提示(Type Hints),允许开发者在代码中明确指定变量的类型,这有助于提高代码的可读性和可维护性,并辅助静态类型检查工具(如mypy)进行类型检查
    • JavaScript不原生支持类型提示,虽然可以通过使用TypeScript等超集语言来实现
  3. 对象模型和继承:

    • Python的对象模型更加严格,支持基于类的继承,并且提供了丰富的内置数据类型和方法,鼓励开发者遵循明确的接口和协议
    • JavaScript的原型继承机制较为灵活,有时可能导致难以预料的行为,尤其是在大型项目中
  4. 错误处理:

    • Python在类型错误和其他运行时错误方面更加严格,促使开发者在编写代码时更加注意类型的一致性
    • JavaScript的错误处理机制较为宽容,某些类型错误可能被忽略或被隐式转换处理

定义常量

因为Python中定义变量不需要使用任何关键字,这就导致Python中的常量实际上就是变量,只是在命名习惯上,常量一般是所有字母都大写,变量只需要满足变量命名规则和规范即可,例如:

Python
1
2
# 圆周率
PI = 3.1415916

数据类型

在Python中,数据类型分为简单数据类型和组合数据类型:

  1. 简单数据类型:

    1. 整型(int
    2. 浮点型(float
    3. 布尔类型(bool
    4. 字符串类型(str
  2. 组合数据类型:

    1. 复数类型(Complex
    2. 列表(list
    3. 元组(tuple
    4. 集合(set
    5. 字典(dict

本次先介绍简单数据类型,对于组合数据类型会在后面单独讲解

在Python中,如果想查看一个数值或者变量的类型,可以使用type函数或者isinstance函数判断

Note

需要注意,在JavaScript中有一个typeof关键字有着类似的功能,但是其是关键字,不是函数,所以使用时可以带括号,也可以不带,但是type必须带括号,因为它是函数

整型:

在C语言/C++、Java和JavaScript中,整型都是有长度限制的,但是在Python中,理论上可以处理任意长度的整数,例如下面的代码:

Python
1
2
num = 214838246236387462867861746782367346176234
print(type(123)) # <class 'int'>

布尔类型: 对于布尔类型来说,其值只有两种:TrueFalse,但是需要注意值的大小写,在C++、Java和JavaScript中,布尔类型值都为truefalse

字符串类型: 对于字符串来说,与JavaScript一样,可以使用单引号或者双引号包裹,如果包裹的字符串中有单引号或者双引号可以看情况使用下面的两种方法:

  1. 内部是单引号,外部就用双引号,否则相反
  2. 使用\对内部的引号进行转义

在Python中,也可以使用原始字符串,通过在字符串前添加rR来定义,告诉Python忽略字符串中的转义字符,这对于处理文件路径、正则表达式等需要大量反斜杠的场景非常有用,例如下面的代码:

Python
1
2
3
4
5
6
7
# 普通字符串,需要转义反斜杠
path = "C:\\Users\\Name\\Documents"
print(path)  # C:\Users\Name\Documents

# 原始字符串,不需要转义反斜杠
raw_path = r"C:\Users\Name\Documents"
print(raw_path)  # C:\Users\Name\Documents

注意,原始字符串不能以单个反斜杠结尾,例如r"C:\Users\Name\"会导致语法错误

在Python中,字符串也可以通过索引取出其中的字符,索引可以为正数,也可以为负数,如果为正数,就是正向,否则就是反向,例如:

Python
1
2
3
str = "hello"
print(str[0]) # h
print(str[-1]) # o

Python中的字符串有两种运算:

  1. 字符串加法:将不同的字符串进行拼接,但是注意,不可以将字符串和非字符串进行拼接,除非将非字符串通过强制转换为字符串
  2. 字符串乘法:将指定字符串重复指定次数

例如下面的代码:

Python
1
2
3
4
5
6
# 字符串拼接
str1 = "hello"
str2 = "world"
print(str1 + str2) # helloworld
# 字符串重复
print(str1 * 3) # hellohellohello

因为字符串在Python中属于可迭代对象,所以可以使用切片:

可迭代对象

可迭代对象(Iterable)是指可以逐一返回其成员的对象。在Python中,许多内置的数据类型都是可迭代的,这使得它们能够与for循环、生成器表达式以及其他需要迭代的结构一起使用。理解可迭代对象对于编写高效、简洁的Python代码至关重要。

一个对象如果实现了特殊的方法__iter__()__getitem__(),使得可以逐个访问其元素,那么它就是一个可迭代对象。这些对象可以被用于迭代器协议,允许我们使用for循环来遍历它们的元素。

以下是Python中常见的可迭代对象:

  1. 字符串(str
  2. 列表(list
  3. 元组(tuple
  4. 字典(dict
  5. 集合(set
  6. 文件对象
  7. 生成器(Generators)
  8. 自定义可迭代对象

切片语法如下:

Python
1
2
3
4
5
变量名[起始索引:终止索引:步长]

# 起始索引:表示从第几个元素开始取(包括该字符),默认从0开始
# 终止索引:表示取到终止索引的元素的前一个元素(不包括终止索引的元素),默认取到-1
# 步长:表示移动距离,正数表示正向移动,默认为1,负数表示逆向移动

Note

注意,起始索引和终止索引可以是不同方向的,例如起始索引从-1开始,步长为-1,此时就是逆向遍历且每一次移动一个元素,若终止索引是1,则此时表示正向遍历的第二个元素

例如下面的代码:

Python
1
2
3
str1 = "hello"
print(str1[-1:1:-1]) # oll
# 从o开始,逆向遍历并每次移动一个字符,直到正向遍历的第二个字符结束

例如下面的代码:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 切片
str = "hello"
print(str[1:3]) # el
print(str[1:]) # ello
print(str[:3]) # hel
print(str[:]) # hello
num = "0123456789"
print(num[1:4:2]) # 13
print(num[::2]) # 02468
print(num[::-1]) # 9876543210

其他数据类型与其他编程语言基本一致,此处不在赘述

强制类型转换

在Python中,可以使用下面的方式进行相关类型的强制转换:

  1. int(x, [基数]):将其他数据类型转换为整型,需要注意:
    1. 如果待转换的类型是浮点类型,转换后的结果不会包括小数点及后面的数字(即截断)
    2. 如果待转换的类型是字符串类型,则字符串中不可以包含包括小数点在内的非数字字符
    3. 如果待转换的类型是布尔类型的值,则True值为1,False值为0
  2. float(x):将其他数据类型转换为浮点类型,需要注意:
    1. 如果待转换的类型是整型,转换后的结果会自动加上.0
    2. 如果转换的类型是字符串类型,则字符串中不可以包含除小数点和数字字符以外的字符
    3. 如果转换的类型是布尔类型的值,则True值为1.0,False值为0.0
  3. bool(x):将其他数据类型转换为布尔类型,在Python中,有下面几种值会被强制转换为False
    1. None
    2. 0
    3. 0.0
    4. False
    5. 所有的空容器(空列表、空元组、空字典、空集合、空字符串)
  4. str(x):将其他数据类型转换为字符串

关于None

在 Python 中,None 是一个特殊的常量,它代表空值或无。NoneNoneType类型的唯一实例,通常用于表示缺少值、函数没有返回任何显式值的情况,或者作为默认参数来表示某个参数是可选的

  1. 表示缺失值

当一个变量被初始化为 None 时,这意味着该变量目前没有任何实际的数据值。

Python
1
value = None

  1. 函数返回值

    如果一个函数不显式地返回任何值,那么它将默认返回 None

    Python
    1
    2
    3
    4
    5
    def do_something():
        print("Doing something")
    
    result = do_something()
    print(result)  # 输出: None
    

  2. 默认参数

    在定义函数时,可以使用 None 作为参数的默认值,表示这个参数是可选的。

    Python
    1
    2
    3
    4
    5
    6
    7
    8
    def greet(name=None):
        if name is None:
            print("Hello, stranger!")
        else:
            print(f"Hello, {name}!")
    
    greet()  # 输出: Hello, stranger!
    greet("Alice")  # 输出: Hello, Alice!
    

  3. 测试存在性

    None 常用于检查某个对象是否已经被赋值。

    Python
    1
    2
    3
    4
    5
    data = get_data_from_somewhere()
    if data is not None:
        process(data)
    else:
        print("No data available.")
    

  4. 清理引用

    在某些情况下,为了释放资源或明确表明不再需要某个变量,可以将其设置为 None

    Python
    1
    2
    3
    large_list = [i for i in range(1000000)]
    del large_list  # 删除列表
    large_list = None  # 清理引用
    

  5. 比较操作

    使用 isis not 操作符来检查一个变量是否为 None

    Python
    1
    2
    3
    4
    5
    x = None
    if x is None:
        print("x is None")
    if x is not None:
        print("x is not None")
    

  6. 数据结构中的占位符

    在字典或其他数据结构中,None 可以用作占位符来表示键的存在但没有对应的值。

    Python
    1
    options = {"option1": "value1", "option2": None}
    

  7. 与布尔上下文的关系

    在布尔上下文中(如 if 语句),None 被视为 False

    Python
    1
    2
    3
    4
    if None:
        print("This will not be printed")
    else:
        print("None is treated as False in a boolean context")
    

注意:

  • 在 Python 中,不要将 None 与其他类型的值进行直接比较,除了使用isis not。例如,None == 0None == ""都会返回 False
  • 尽管 None 在布尔上下文中被视为 False,但在判断一个变量是否真正为 None 时,应使用isis not来确保准确性

运算符

算术运算符

在Python中,有下面的几种算术运算符:

  1. +:加法
  2. -:减法
  3. /:浮点数除法
  4. *:乘法
  5. //:取整除法
  6. %:取模运算
  7. **:求幂运算

Note

注意,在Python中,%代表的是取模运算,而不是取余运算,具体可见取余运算和取模运算

赋值运算符

除了最基本的赋值运算符=外,还有前面的算术运算符与赋值运算结合的运算符,例如**=//=等,计算方式与JavaScript一样,此处不再赘述

Note

在Python中没有自增运算符++和自减运算符--

比较运算符

与C语言/C++、Java一样,此处不再赘述

逻辑运算符

  1. and(并且)
  2. or(或者)
  3. not(逻辑取反)

与其他编程语言不同的是,在表达数学中的表达式\(1 \le a \le 2\)时,在C、C++、Java或者JavaScript中都是表示为:

Text Only
1
a >= 1 && a <= 2

但是在Python中支持链式法则,即按照数学方式进行书写:

Python
1
1 <= a <= 2 # 表示a在1和2之间

另外,Python的逻辑运算符运算结果参考JavaScript逻辑运算符的运算方式,二者完全相同

除了名字不同、计算结果和链式法则,使用和其他编程语言基本一样,但是注意,在Python中没有条件运算符? :

位运算符

与C语言/C++一样,此处不再赘述

成员运算符和身份运算符

在Python中,成员运算符用于测试序列中是否存在某个值。Python提供了两个成员运算符:

  1. in:判断一个元素是否存在于某个序列中
  2. not in:判断一个元素是否不存在于某个序列中

语法如下:

Python
1
2
元素 in 序列
元素 not in 序列

基本使用如下:

Python
1
2
3
str = "hello"
print("he" in str) # True
print("hi" not in str) # True

身份运算符用于比较两个对象的内存地址是否相同。Python提供了两个身份运算符:

  1. is:判断两个变量是否引用自同一个对象()
  2. is not:判断两个变量是否引用自不同的对象

is==的区别

如果使用的是==在比较时,比较的是内容,is则比较的是地址

在Python中,可以使用id()函数查看变量的编号,可以理解为变量的地址,对于值范围在[-5, 256]中的整数来说,存在「小整数优化」

小整数优化

当你在Python中创建一个整数对象时,Python会根据该整数的值动态地为其分配内存空间。对于小整数,Python会使用一种称为“小整数缓存”的机制来优化内存使用。这个缓存池中的整数对象会被重复利用,而不是为每个新创建的小整数分配新的内存空间。这样可以减少内存分配和释放的开销,提高程序的性能。

语法如下:

Python
1
2
变量1 is 变量2
变量1 is not 变量2

例如下面的代码:

Python
1
2
3
4
5
6
a = 1
b = a
c = 2

print(a is b) # 输出: True
print(a is c) # 输出: False

Python运算符优先级

运算符 描述
** 指数 (最高优先级)
~+- 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
*/%// 乘,除,取模和取整除
+- 加法减法
>><< 右移,左移运算符
& 位 'AND'
^| 位运算符
<=<>>= 比较运算符
<>==!= 等于运算符
=%=/=//=-=+=*=**= 赋值运算符
isis not 身份运算符
innot in 成员运算符
notandor 逻辑运算符

分支语句

Python语言是一个严格要求缩进(标准要求4个空格)的语言,其缩进代表层次,同一个层次为一个代码块,在执行程序时,会根据层次判断执行方式

Abstract

分支基本逻辑和C++相同,下面只讲述Python中的格式

if语句和if-else语句

在Python中,使用下面的格式书写if语句

Python
1
2
3
4
5
6
7
if 条件:
    执行语句1
    执行语句2

执行语句3

# 注意,执行语句1和执行语句2是平级的,执行语句3和if语句块平级

使用下面的格式书写if-else语句:

Python
1
2
3
4
5
if 条件:
    执行语句1
    执行语句2
else:
    执行语句3

例如实例:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 判断一个数是奇数还是偶数

num = int(input("请输入一个整数:"))
if num % 2 == 0:
    print(f"输入的数是{num}")
    print(f"{num}是偶数")
else:
    print(f"输入的数是{num}")
    print(f"{num}是奇数")

print("不论是if还是else都会执行")

输入和输出
请输入一个整数5
输入的数是5
5是奇数
不论是if还是else都会执行

if-else if-else语句

在Python中,也存在else if语句,但是在代码中,else if写为elif,整体语法格式如下:

Python
1
2
3
4
5
6
7
if 条件1:
    执行语句1
elif 条件2:
    执行语句2
...
else
    执行语句3

例如实例:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 判断一个数是正数、负数还是零

num = int(input("请输入一个整数:"))
if num > 0:
    print(f"输入的数是{num}")
    print(f"{num}是正数")
elif num < 0:
    print(f"输入的数是{num}")
    print(f"{num}是负数")
else:
    print(f"输入的数是{num}")
    print(f"{num}是0")

print("不论是if还是else都会执行")

输入和输出
请输入一个整数-1
输入的数是-1
-1是负数
不论是if还是else都会执行

match匹配

在Python中没有switch语句,但是有功能类似的match语句,其基本写法如下:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# if
score = 'B'
if score == 'A':
    print('score is A.')
elif score == 'B':
    print('score is B.')
elif score == 'C':
    print('score is C.')
else:
    print('invalid score.')

# match
score = 'B'

match score:
    case 'A':
        print('score is A.')
    case 'B':
        print('score is B.')
    case 'C':
        print('score is C.')
    case _: # _表示匹配到其他任何情况
        print('score is ???.')

不同于其他语言的switch语句,Python中的match还可以用于复杂匹配:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
age = 15

match age:
    case x if x < 10:
        print(f'< 10 years old: {x}')
    case 10:
        print('10 years old.')
    case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
        print('11~18 years old.')
    case 19:
        print('19 years old.')
    case _:
        print('not sure.')

在上面这个示例中,第一个case x if x < 10表示当age < 10成立时匹配,且赋值给变量x,第二个case 10仅匹配单个值,第三个case 11|12|...|18能匹配多个值,多个值中间用|分隔

除此之外,match还可以用于匹配列表:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
args = ['gcc', 'hello.c', 'world.c']

match args:
    # 如果列表只有gcc一个元素
    case ['gcc']:
        print('gcc: missing source file(s).')
    # 出现gcc和一个文件
    case ['gcc', file1]:
        print('gcc compile: ' + file1)
    # 仅出现clean:
    case ['clean']:
        print('clean')
    case _: # 以上情况都不满足时,执行默认匹配
        print('invalid command.')

Pass语句

在Python中,pass语句表示空语句,一般用于占位

Python
1
2
3
4
5
6
# pass语句
num = -1
if num > 0:
    pass
else:
    print("num小于0")

上面的代码等价于:

Python
1
2
if num < 0:
    print("num小于0")

循环语句

Abstract

基本逻辑与C++和Java类似,下面仅展示Python中的格式

while循环

在Python中,while循环的基本结构如下:

Python
1
2
3
while 循环判断条件:
    循环执行语句1
    循环执行语句2

例如实例:

Python
1
2
3
4
5
6
# 打印1 - 10
i = 1
while i <= 10:
    print(i)
    i += 1
print("while循环同样遵循缩进规则,循环体内的代码要缩进。")

for循环

在Python中,for循环的基本结构和C++差别比较大,下面是基本结构:

Python
1
2
3
for 迭代变量 in range(起始值, 终止值, (可选)步长)/可迭代对象:
    循环执行语句1
    循环执行语句2
  • 迭代变量:相当于C++中的循环变量,用于控制循环
  • 起始值:迭代变量的初始值
  • 终止值:迭代变量最大值,注意,最后迭代变量不会等于最大值
  • 步长:可以理解为增量,起始值每一次循环需要加步长,默认情况下步长为1,步长也可以为负数

例如实例:

Python
1
2
3
# 打印0 - 11中的偶数
for i in range(0, 11, 2):
    print(i)
  • 对于range部分来说,也可以选择迭代对象为其他类型,例如字符串
Python
1
2
3
# 使用可迭代对象
for i in "Hello World":
    print(i)

上面的代码中,使用字符串作为可迭代对象,此时打印的即为每一个字符串中的每一个字符

Note

Python中是没有字符的概念,上面代码中的每一个字符本质还是一个字符串

break语句和continue语句

Note

基本逻辑与C++相同,使用方式也基本一致,但是需要遵循Python的格式,可参考pass语句的书写方式

循环与else语句

在Python中,循环可以结合else语句,执行逻辑为:当循环未执行完毕时,正常执行循环不执行else语句,否则执行else语句,格式如下:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# while和else
while 循环条件:
    循环语句1
    循环语句2
else
    分支语句1
    分支语句2

# for和else
for 迭代变量 in range(起始值, 终止值, (可选)步长):
    循环语句1
    循环语句2
else
    分支语句1
    分支语句2

Note

需要注意,如果循环是因为break结束的,则else语句依旧不会执行