当前位置:首页>python>第 2 章 Python 数据类型

第 2 章 Python 数据类型

  • 2026-04-16 07:09:38
第 2 章 Python 数据类型

在 Python 程序设计中,数据类型是构建一切程序逻辑的基础。无论是进行数值计算、文本处理,还是构建复杂的数据结构,本质上都是对不同类型数据的存储、操作与转换。合理理解和使用数据类型,不仅能够提升代码的可读性与可维护性,还直接关系到程序的执行效率与健壮性。同时,Python 作为一门动态类型语言,其数据类型机制具有灵活性强、表达能力高的特点,但也对开发者提出了更高的规范性要求。因此,系统掌握 Python 数据类型及其相关操作,是深入学习编程语言与提升开发能力的关键前提。

基于此,本章将围绕 Python 中的常用数据类型展开,介绍其基本概念、使用方式及典型操作,帮助读者建立清晰的数据类型认知体系,为后续章节的学习打下坚实基础。

1. Python 数据类型简介

在学习 Python 数据类型之前,需要首先掌握语言的一些基本语法规则。这些规则直接影响代码的编写方式与程序的执行结果,是理解数据类型及其操作的前提。

① 大小写敏感性。

Python 是一门区分大小写的编程语言。在标识符命名中,不同大小写会被视为不同的名称。例如,变量名 age 与 Age 会被解释为两个彼此独立的变量,因此在使用过程中必须保持命名的一致性,避免因大小写混用而引发错误。

② 代码块的标识方式。

Python 采用缩进来划分代码块结构,而不是像其他多数编程语言那样通过分号(;)作为语句结束标志,或使用花括号({})来界定代码块范围。这种基于缩进的语法设计,使代码结构更加清晰直观,但也对缩进规范提出了更高要求。

③ 缩进规范。

在 Python 中,缩进可以使用制表符(Tab)或空格来实现。按照通行规范,1 个制表符通常等价于 4 个空格。需要注意的是,在同一代码块中必须保持缩进方式的一致性,不能混用 Tab 与空格,否则会引发 IndentationError: unindent does not match any outer indentation level(缩进不匹配错误),从而导致程序无法正常运行。

2. Python 常用数据类型概述

在 Python 中,数据类型(Data Type) 是变量存储数据的形式,它决定了变量在内存中的表现方式以及可进行的操作类型。Python 是一种动态类型语言,变量在定义时无需显式声明类型,解释器会根据赋值内容自动推断。表 2-1 列出了 Python 中常见的数据类型。

图2-1 Python 中常见的数据类型

名称

类型

描述

是否引用复制

整数

int

整数类型,如 -5016

浮点数

float

带小数点的数值,如 10.250.043.14159

字符串

str

有序的字符序列,如 "Aloha"

布尔值

bool

表示逻辑真 True 或假 False

列表

list

有序的数据序列,如 [12, "Hello", True]

字典

dict

无序的键值对集合,如 {"name": "Wilson"}

元组

tup

有序且不可变的对象序列,如 (10, "100", "Hello")

集合

set

无序且不重复的元素集合,如 {"a", "b"}

从上表可以看出,Python 的数据类型既包括基础类型(如 intfloatstrbool),也包括容器类型(如 listdicttupleset)。其中,基础类型变量在赋值或传参时会复制数值本身(Copy by Value),而容器类型变量则会引用同一内存地址(Copy by Reference)。这意味着对容器对象的修改会影响到所有引用它的变量。

例如:

# 基础类型:值复制a = 10b = ab = 20print(a)  # 输出 10,不受影响# 容器类型:引用复制x = [1, 2, 3]y = xy.append(4)print(x)  # 输出 [1, 2, 3, 4],原列表被修改

上例中,int 类型变量 a 和 b 是独立的内存副本;而 list 类型变量 x 和 y 实际上指向同一个列表对象,因此当 y 发生修改时,x 也随之改变。

Python 的这种数据类型设计既提供了灵活性,也要求开发者在编写程序时关注可变与不可变对象的差异,以避免在函数传参或数据共享时出现意外的逻辑错误。

3. 数字类型(Number)

数字是 Python 中最常用的数据类型之一,主要分为两种:整数(int浮点数(float

  • 整数
    用于表示没有小数点的数值,如 -5042
  • 浮点数
    用于表示带有小数点的数值,如 3.140.5-2.75

Python 支持丰富的数值运算,包括:

  • 加法(+
    :如 3 + 2,结果为 5
  • 减法(-
    :如 5 - 2,结果为 3
  • 乘法(*
    :如 4 * 3,结果为 12
  • 除法(/
    :如 10 / 4,结果为 2.5
  • 取余(%
    :如 10 % 3,结果为 1
  • 幂运算(**
    :如 2 ** 3,结果为 8

示例代码如下:

a = 10b = 3print(a + b)   # 加法:13print(a - b)   # 减法:7print(a * b)   # 乘法:30print(a / b)   # 除法:3.333...print(a % b)   # 取余:1print(a ** b)  # 幂运算:1000

通过这些基本的算术运算,Python 可以方便地完成从日常计算到复杂数学建模等多种任务。

4. 函数(Function)

如果你是编程初学者,不妨先从“函数”这个概念开始。在 Python 中,函数(Function)就像数学中的函数一样,用来接收输入并产生输出。回想一下数学课上的例子:

f(x) = 3x+6

在这个公式中,f 是函数名,x 是输入(参数),而 3x + 6 的结果就是输出。每次给出一个输入值 x,就会得到唯一的输出结果。

同样的道理,在 Python 中,函数也具有类似的结构。一个函数可以接收输入参数,也可以没有输入参数;它可以返回一个输出值,也可以不返回值。函数的作用就是把一段可以重复使用的逻辑封装起来,方便在程序中多次调用。

例如:

def add(x, y):    return x + yresult = add(35)print(result)  # 输出 8

在上面的代码中:

  • def
     是定义函数的关键字;
  • add
     是函数名;
  • x
     和 y 是函数的输入参数;
  • return
     表示函数的输出结果。

通过定义函数,我们可以让代码更加简洁、清晰、易于维护,也能避免重复编写相同的逻辑。

5. 数字的内置方法(Built-in Functions for Numbers)

除了基本的算术运算,Python 还提供了许多针对数字的内置方法,可以帮助我们更高效地进行数值处理和类型转换。以下是一些常见的方法介绍:

  • abs(x)
    :返回数字 x 的绝对值。示例:abs(-5) 的结果是 5
  • pow(x, y)
    :返回 x 的 y 次幂,相当于 x ** y示例:pow(2, 3) 的结果是 8
  • max(a, b, c, …)
    :返回给定参数中的最大值。示例:max(3, 8, 5) 的结果是 8
  • min(a, b, c, …)
    :返回给定参数中的最小值。示例:min(3, 8, 5) 的结果是 3
  • round(x, n)
    :将数字 x 四舍五入到保留 n 位小数。示例:round(3.14159, 2) 的结果是 3.14

此外,Python 还提供了三个常用的类型转换函数

  • str(x)
    :将数字 x 转换为字符串类型。
  • int(x)
    :将数值或可转换的字符串转换为整数类型。
  • float(x)
    :将数值或可转换的字符串转换为浮点数类型。

示例:

num = -4.7print(abs(num))            # 输出 4.7print(pow(25))           # 输出 32print(max(10205))      # 输出 20print(round(3.141592))   # 输出 3.14print(str(100))            # 输出 "100"print(int(3.6))            # 输出 3print(float("2.5"))        # 输出 2.5

这些内置方法使数字的处理更加灵活,既能方便地进行数学计算,也能完成不同类型之间的转换,为后续编程打下坚实的基础。

6. 数学模块(Math Module)

在 Python 中,除了内置的数值运算和函数外,还有许多功能更强大的数学方法需要借助 数学模块(math 才能使用。

所谓模块(Module),可以理解为一个功能集合,它将一组相关的函数、常量和类组织在一起,方便我们在程序中直接调用。关于模块的详细用法,将在后续章节中深入介绍。这里先重点了解数学模块中一些常用的常量和方法

① 常用常量:

  • math.e
    :自然常数,约等于 2.718
  • math.pi
    :圆周率常数,约等于 3.14159

② 常用方法:

  • math.floor(x)
    :向下取整,返回小于或等于 x 的最大整数。
  • math.ceil(x)
    :向上取整,返回大于或等于 x 的最小整数。
  • math.sqrt(x)
    :返回 x 的平方根。

示例代码如下:

import mathprint(math.e)        # 输出 2.718281828459045print(math.pi)       # 输出 3.141592653589793num = 9.8print(math.floor(num))  # 输出 9(向下取整)print(math.ceil(num))   # 输出 10(向上取整)print(math.sqrt(16))    # 输出 4.0(平方根)

通过 math 模块,Python 能够轻松处理更复杂的数学计算,如三角函数、对数运算、幂运算等。这些方法在科学计算、图形绘制、数据分析等领域都非常实用。

7. 变量与赋值(Variable and Assignment)

变量(Variable)是所有编程语言中的核心概念之一。可以把变量理解为一个“容器”,用来存储各种数据。在 Python 中,通过赋值符号=将数据存入变量。

需要特别注意的是:

Python 中的 = 与数学中的“等号”概念并不相同!在数学中,= 表示左右两边的值相等;而在 Python 中,= 表示的是赋值操作,即“将右侧的值放入左侧的变量中”。

例如:

x = 5x = x + 1print(x)

执行后,变量 x 的结果为 6这是因为第二行代码表示“取出当前的 x 值(即 5),加上 1,再把结果存回变量 x 中”。

Python 还提供了一种更简洁的写法,称为语法糖(Syntax Sugar),可以把 x = x + 1 简化为:

x += 1

这两种写法效果完全相同,只是后者更加简洁高效。类似的还有:

  • x -= 1
     表示 x = x - 1
  • x *= 2
     表示 x = x * 2
  • x /= 3
     表示 x = x / 3

这种复合赋值运算符在实际编程中非常常见,既能让代码更短,也能提升可读性。

8. 字符串(String)

字符串(String) 是由一系列字符组成的有序序列,例如 "Hello" 或 'Python'。在程序中,字符串常用于表示文字内容、用户输入、文件路径等信息。

① 字符串的基本特征。

字符串是有序的,这意味着我们可以通过索引(indexing)和切片(slicing)来访问其中的字符。

需要注意的是,Python 的索引是从 0 开始的,也就是说,第一个字符的索引为 0,第二个为 1,以此类推。

示例:

text = "Hello"print(text[0])   # 输出 H(索引访问)print(text[1:4]) # 输出 ell(切片访问,从索引13

② 引号的使用规则。

在 Python 中,单引号 ' ' 和双引号 " " 作用完全相同,都可以用来定义字符串。例如,以下两种写法都是合法且等价的:

msg1 = 'Python is fun'msg2 = "Python is fun"

选择哪种引号主要取决于代码风格或字符串内容的需要,例如当字符串中包含单引号时,可以使用双引号来包裹:

sentence = "It's a sunny day"

通过这些规则,我们可以灵活地创建和操作字符串,从而实现更丰富的文本处理功能。

9. 字符串拼接(String Concatenation)

在 Python 中,字符串可以通过多种方式组合和连接,从而构建出更复杂的文本信息。下面介绍几种常见的字符串拼接与换行方法。

① 使用换行符 \n

换行符 \n 用于在字符串中创建新的一行。当 Python 解释器遇到 \n 时,会将其后的内容输出到下一行。

示例:

print("Hello\nWorld")

输出结果为:

HelloWorld

这在格式化输出或打印多行文本时非常实用。

② 使用加号 + 进行拼接。

如果在两个字符串之间使用加号 +,Python 会将它们拼接成一个新的字符串。

示例:

greeting = "Hello"name = "Alice"message = greeting + " " + nameprint(message)

输出结果为:

Hello Alice

③ 字符串与数字的拼接。

需要注意的是,在 Python 中字符串和数字不能直接拼接以下代码会报错:

age = 18print("I am " + age + " years old")  # 错误

正确的做法是先将数字转换为字符串:

age = 18print("I am " + str(age) + " years old")  # 正确

④ 字符串的不可变性(Immutable)。

Python 中的字符串是不可变的(immutable),也就是说,一旦字符串被创建,其内容就无法被直接修改。当我们进行拼接操作时,其实是生成了一个新的字符串对象,而不是在原字符串上修改内容。

示例:

text = "Hello"text += " World"print(text)  # 实际上创建了一个新的字符串 "Hello World"

理解这一特性对于编写高效的 Python 程序非常重要,尤其是在处理大量字符串拼接的场景中,应优先考虑使用 join() 或格式化字符串(如 f-string)来提升性能。

10. Python 内置字符串方法

在掌握字符串的基本概念与常见操作之后,进一步了解 Python 提供的内置字符串方法,对于提升字符串处理效率具有重要意义。Python 为字符串类型内置了丰富的方法,用于完成长度计算、大小写转换、查找替换、格式化输出等常见操作。这些方法不仅语法简洁,而且功能强大,是日常开发中处理文本数据的核心工具。接下来将对常用的字符串方法进行逐一介绍。

len()

作用: 返回字符串的长度(字符个数)。

text = "Hello World"print(len(text))   # 输出 11

注意:空格、符号也会计入长度。

② int()

作用: 将字符串(或数字)转换为整数类型。

num_str = "123"print(int(num_str))   # 输出 123(整数)

⚠️ 如果字符串中包含非数字字符,会报错:ValueError

③ float()

作用: 将字符串(或数字)转换为浮点数类型。

num_str = "3.14"print(float(num_str))   # 输出 3.14

④ str()

作用: 将任意数据类型转换为字符串。

age = 18print("I am " + str(age) + " years old.")  # 输出:I am 18 years old.

在字符串拼接时常用此方法。

⑥ upper()

作用: 将字符串中的所有字母转换为大写。

text = "hello"print(text.upper())   # 输出 HELLO

⑦ lower()

作用: 将字符串中的所有字母转换为小写。

text = "hello"print(text.upper())   # 输出 HELLO

⑧ isupper()

作用: 判断字符串是否全为大写字母,返回布尔值(True / False)。

text1 = "HELLO"text2 = "Hello"print(text1.isupper())   # 输出 Trueprint(text2.isupper())   # 输出 False

⑨ index()

作用: 返回指定字符(或子字符串)在字符串中第一次出现的位置索引。

text = "Python Programming"print(text.index("P"))     # 输出 0print(text.index("gram"))  # 输出 10

⚠️ 如果未找到匹配项,会抛出 ValueError 异常。

replace(old, new[, count])

用途:返回一个新字符串,将原字符串中出现的 old 子串全部(或最多 count 次)替换为 new

参数:

  • old
    :要被替换的子串(必需)。
  • new
    :替换成的子串(必需)。
  • count
    :可选,指定最多替换多少次(从左到右)。

返回值:替换后的新字符串(原字符串不变)。

示例

s = "apple banana apple"t = s.replace("apple""pear")# t -> "pear banana pear"

注意:若 old 未找到,返回原字符串的副本(或相同字符串)。替换不会改变原字符串(字符串不可变)。

⑫ split(sep=None, maxsplit=-1)

用途:将字符串按指定分隔符拆分,返回字符串列表

参数:

  • sep
    :分隔符,默认 None 表示以任意空白字符(空格、制表符、换行等)为分隔,且连续的空白视为一个分隔符。若指定为 ''(空字符串)会引发 ValueError
  • maxsplit
    :可选,表示最多拆分多少次,剩余部分作为最后一个元素;默认 -1 表示不限制。

返回值:字符串列表。

示例

s = "a b   c\n d"print(s.split())                   # ['a''b''c''d']print("one,two,three".split(","))  # ['one''two''three']print("a b c d".split(" "2))     # ['a''b''c d']

注意点

  • 当 sep=None 时,前后多余的空白不会产生空字符串元素;但当显式指定 sep=" " 时,连续的空格会产生空元素。
  • 常用于把一行文本拆成字段,或按空格切分单词。

⑬ list(s)

用途:将字符串 s 的每个字符逐个转换为列表元素,返回字符列表。

返回值:由字符串中每个字符组成的列表(每个元素为长度为 1 的字符串)。

示例

s = "hello"print(list(s))  # ['h''e''l''l''o']

常见用法:用于需要按字符操作或将字符串转换为可变序列(列表)以便修改。

format(args, kwargs)

用途:格式化字符串,将位置参数或命名参数插入到模板字符串中。返回格式化后的新字符串。

占位与参数

  • 使用大括号 {} 作为占位符,内部可以写索引或名称,如 {0}{name}
  • 支持格式说明符:{:.2f}{:>10} 等,用于控制小数位、对齐、填充等。

示例

# 位置参数"{} + {} = {}".format(123)    # "1 + 2 = 3"# 索引与命名参数"{0} {1} {0}".format("A""B")    # "A B A""Name: {name}, Age: {age}".format(name="Alice", age=30)# "Name: Alice, Age: 30"# 格式控制"Pi ≈ {:.3f}".format(3.1415926)   # "Pi ≈ 3.142"

补充:Python 3.6 之后常用 f-string(格式化字符串字面量)

name = "Bob"f"Hello, {name}"   # 推荐、直观且性能较好

f-string 与 str.format() 功能相似但语法更简洁;在本章中将同时介绍两者及各自适用场景。

⑮ count(sub[, start[, end]])

用途:返回子串 sub 在字符串中出现的次数,可选地在 start 到 end 范围内计数(半开区间 [start, end))。

返回值:出现次数(整数)。

示例

s = "ababa"print(s.count("a"))       # 3print(s.count("aba"))     # 1print(s.count("a"14)) # 1 (在索引 1 到 3 范围内)

注意count 是非重叠匹配计数(但对于单字符或不重叠的子串,行为直观)。在需要判断某子串是否存在并频次多少时非常方便。

⑯ find(sub[, start[, end]])

用途:返回子串 sub 第一次出现的位置索引(从 start 开始到 end 结束),若未找到则返回 -1

返回值:首次出现的索引或 -1

示例

s = "hello world"print(s.find("o"))    # 4print(s.find("z"))    # -1

与 index() 的区别index() 在未找到时会抛出 ValueError,而 find() 返回 -1 —— 在需要避免异常处理时更安全。

⑰ startswith(prefix[, start[, end]])

用途:判断字符串是否以指定前缀 prefix 开头;prefix 可以是字符串或字符串元组(多个前缀任一匹配即为真)。可通过 startend 指定检查范围。

返回值:布尔值 True 或 False

示例

s = "python.txt"print(s.startswith("py"))            # Trueprint(s.startswith(("py""ja")))    # Trueprint(s.startswith("t"2))          # True (从索引2开始)

常见用途:判断文件扩展名、URL 前缀、快速判断字符串类型等。

⑱ endswith(suffix[, start[, end]])

用途:判断字符串是否以指定后缀 suffix 结尾;参数与 startswith 类似,suffix 可为字符串或元组。

返回值:布尔值。

示例

filename = "report.pdf"print(filename.endswith(".pdf"))             # Trueprint(filename.endswith((".pdf"".docx")))  # True

常见用途:判断文件类型、URL 是否以特定尾缀结束等。

11. 字符串的其他规则

在掌握常用字符串方法之后,还需要进一步了解字符串的一些重要特性与使用规则。这些内容虽然不属于具体方法调用,但在实际开发中同样具有重要影响,直接关系到字符串的使用方式与程序行为。下面将从字符串的不可变性、特殊运算形式以及格式化方式等方面进行补充说明。

① 不可变性(Immutability)

  • 对字符串调用任何方法(如 replaceupperstrip 等)都不会修改原字符串,而是返回一个新的字符串。如果需要保存结果,必须把返回值赋回变量或另存,示例代码如下。
s = "hello"s.upper()print(s)      # 仍为 "hello"s = s.upper() # 现在 s -> "HELLO"

这点在阅读代码时非常关键:误以为方法会就地修改字符串,常会导致程序逻辑错误。

  • 在 Python 中,字符串是不可变的(immutable)。这意味着,一旦字符串被创建,它的内容就不能被直接修改。任何对字符串“修改”的操作,实际上都会生成一个新的字符串对象,而原有的字符串保持不变。示例代码如下。
s = "Hello"s[0] = "h"       # 错误:字符串内容不可修改
  • 如果希望改变字符串的内容,只能通过重新赋值来实现,示例代码如下。
s = "Hello"s = "h" + s[1:]   # 创建一个新字符串 "hello"print(s)          # 输出:hello

这种设计让字符串在多线程或函数调用中更加安全,也方便被缓存和优化,因此几乎所有现代语言(如 Java、JavaScript)都采用类似的机制。

② 字符串与数字的相乘

在 Python 中,字符串和整数之间的“乘法”是一种合法且非常实用的操作。这一特性可能会让来自其他语言的开发者感到惊讶。语法形式如下。

字符串 * 整数

该语句的作用是重复字符串指定的次数,例如:

print("Hi" * 3)     # 输出:HiHiHiprint("-" * 10)     # 输出:----------

这种写法在生成分隔线、重复输出或格式化输出时非常方便。例如:

title = "Python 字符串"print(title)print("=" * len(title))   # 输出长度匹配的下划线

这比手动拼接字符串更高效、语义更清晰,也是 Python 表达式灵活性的体现。

③ 字符串的格式化方式

在程序中,我们经常需要在字符串中嵌入变量或表达式的值。Python 提供了多种方式实现字符串格式化,其中最常用的有两种:format() 方法和 f-string(格式化字符串字面值)

  • 使用 format() 方法

format() 方法通过占位符 {} 在字符串中预留位置,然后用 format() 传入的参数进行替换。这个在上文中已经介绍过了。

  • 使用 f-string(Python 3.6+ 推荐语法)

f-string 是 Python 3.6 引入的格式化方式,语法更简洁、更高效。在字符串前加 f,并在花括号 {} 中直接嵌入变量或表达式:

name = "David"age = 25print(f"My name is {name} and I am {age} years old.")

甚至可以直接在花括号中计算表达式:

print(f"Next year, I will be {age + 1}.")

输出:

Next year, I will be 26.
  • format() 与 f-string 的区别

format() 和 f-string 的功能本质相同,都是为了在字符串中插入动态内容。区别在于:

    • format()
       可用于早期 Python 版本(兼容性更好);
    • f-string 可读性更高、性能更优,适合现代 Python 开发。

例如,下面两种写法的效果完全相同:

# 使用 format()print("Welcome, {}!".format("Lucy"))# 使用 f-stringname = "Lucy"print(f"Welcome, {name}!")

12. 列表(List)

在 Python 中,列表(List) 是一种用于存储有序数据序列的数据结构。列表中的每个元素都按照插入的顺序被存储和访问,例如:

my_list = [12"Hello"True]

在其他编程语言中,列表的概念类似于数组(Array),但 Python 的列表更加灵活。它不仅可以存放相同类型的数据,还可以在同一个列表中同时包含整数、字符串、布尔值、甚至其他列表。这种灵活性使得列表成为 Python 中最常用、最强大的数据结构之一。

① 列表的特点。

  • 有序性(Ordered)
    列表中的元素都有固定的顺序,可以通过索引(index)访问。第一个元素的索引是 0,第二个是 1,依此类推。
data = [10, 20, 30]print(data[0])  # 输出 10
  • 可变性(Mutable)
    列表是可变的数据类型,允许在创建后进行修改。例如,可以直接修改某个元素的值:
data[1] = 200print(data)  # 输出 [10, 200, 30]
  • 可嵌套(Nested)
    列表中可以再嵌套其他列表,形成“列表的列表”(List of Lists)。这种结构常用于“表示矩阵(Matrix)”或二维数据。例如:
matrix = [    [1, 2, 3],    [4, 5, 6],    [7, 8, 9]]print(matrix[1][2])  # 输出 6

上述代码定义了一个 3×3 的矩阵,并访问了第二行第三列的元素。

② 列表的常见用途。

  • 存储同类数据
    :例如保存多个学生的姓名或多笔商品价格。
  • 批量处理
    :在循环结构中可以依次处理列表中的每个元素。
  • 矩阵运算
    :通过列表的嵌套结构,可以实现二维或多维数据的表示和计算。

13. 列表的基本操作

在掌握了列表的基本概念之后,需要进一步了解它的常用操作。Python 提供了许多内置函数与方法,使得对列表的查询、修改、拼接与统计都非常便捷。

① 查看列表长度:len() 函数。

len() 函数用于返回列表中元素的个数。例如:

data = [10203040]print(len(data))  # 输出 4

无论列表中包含什么类型的元素,len() 都会准确计算元素数量,这在循环遍历或判断列表是否为空时非常有用。

② 索引与切片规则。

与字符串类似,列表的元素也可以通过索引(index)访问。索引从 0 开始,负数索引表示从末尾反向访问:

nums = [1, 2, 3, 4, 5]print(nums[0])   # 输出 1(第一个元素)print(nums[-1])  # 输出 5(最后一个元素)

同样,列表支持切片(slicing)操作,可以提取出子列表:

print(nums[1:4])  # 输出 [2, 3, 4]

③ 统计与查找。

  • count() 方法
    :用于统计指定元素在列表中出现的次数。
  • index() 方法
    :用于返回指定元素第一次出现的位置索引。

示例:

fruits = ["apple""banana""apple""cherry"]print(fruits.count("apple"))  # 输出 2print(fruits.index("banana")) # 输出 1

④ 列表与集合的转换。

使用 set() 函数可以将列表转换为集合,从而去除重复元素例如:

data = [1, 2, 2, 3, 3, 3]unique = set(data)print(unique)  # 输出 {123}

转换为集合后,元素顺序会丢失,因为集合(set)是无序的数据结构。

⑤ 列表拼接与重复。

  • 使用 “+” 运算符拼接列表:
a = [1, 2]b = [3, 4]c = a + bprint(c)  # 输出 [1, 2, 3, 4]
  • 列表与整数相乘实现重复:
x = ["Hi"]print(x * 3)  # 输出 ['Hi''Hi''Hi']

这种语法在快速生成初始化数据或测试数据时非常实用。

⑥ 可变性(Mutability)。

列表是可变(mutable)的数据类型,这意味着它的内容可以被修改。例如:

items = ["A""B""C"]items[1] = "X"print(items)  # 输出 ['A''X''C']

相比之下,字符串(String)是不可变的,无法像列表那样直接修改其中的字符。这也是列表在数据存储和动态处理上比字符串更灵活的重要原因。

14. Python 列表的内置方法

除了基本的索引与切片操作外,Python 还为列表(List)提供了一系列内置方法(Built-in Methods),用于实现插入、删除、清空、排序、反转、复制等常见操作。这些方法使得列表在数据处理、算法实现和结构化存储中都极为灵活。

① insert() —— 在指定位置插入元素。

insert() 方法用于在列表的指定索引处插入一个新元素。语法格式:

list.insert(index, element)

示例:

numbers = [10, 20, 30]numbers.insert(115)print(numbers)  # 输出 [10, 15, 20, 30]

插入操作不会覆盖原有元素,而是将其向后顺移。

② remove() —— 删除指定元素。

remove() 方法用于删除列表中第一个匹配的指定值如果该值不存在,将引发 ValueError 错误。

fruits = ["apple""banana""apple""cherry"]fruits.remove("apple")print(fruits)  # 输出 ['banana''apple''cherry']

③ clear() —— 清空列表。

clear() 方法会删除列表中的所有元素,使其变为空列表。

data = [123]data.clear()print(data)  # 输出 []

④ sort() —— 列表排序。

sort() 方法用于对列表进行原地排序(in-place sort),即直接修改原列表的顺序。默认按升序排列,也可通过参数 reverse=True 进行降序排序。

nums = [5291]nums.sort()print(nums)  # 输出 [1, 2, 5, 9]nums.sort(reverse=True)print(nums)  # 输出 [9, 5, 2, 1]

注意:sort() 方法只能用于可以比较的元素,如数字或字符串。

⑤ reverse() —— 反转列表。

reverse() 方法会将列表中元素的顺序反转,同样是原地修改操作。

letters = ["A""B""C"]letters.reverse()print(letters)  # 输出 ['C''B''A']

⑥ append() —— 在末尾追加元素。

append() 方法用于在列表的末尾添加一个新元素。

colors = ["red""green"]colors.append("blue")print(colors)  # 输出 ['red''green''blue']

此方法常用于动态构建列表,如循环中逐步收集数据。

⑦ pop() —— 弹出元素。

pop() 方法用于删除并返回指定索引位置的元素(默认是最后一个)。

data = [10, 20, 30]x = data.pop()print(x)      # 输出 30print(data)   # 输出 [10, 20]

当需要获取并同时移除元素时,pop() 是非常实用的方法。

⑧ copy() —— 复制列表。

在 Python 中,列表(list)属于引用类型,而非基本数据类型。如果直接通过赋值操作进行复制,实际上只是复制了引用,两者会指向同一块内存区域,例如:

data = [10, 20, 30]x = data.pop()print(x)      # 输出 30print(data)   # 输出 [10, 20]

要创建真正的副本,应使用 copy() 方法:

a = [1, 2, 3]b = a.copy()b.append(4)print(a)  # 输出 [1, 2, 3]print(b)  # 输出 [1, 2, 3, 4]

这样即可实现独立的浅拷贝(shallow copy),避免相互影响。

15. 字典(Dictionaries)

在 Python 中,字典(Dictionary) 是一种用于存储无序键值对(key-value pairs)的数据结构。字典中的每个元素由两个部分组成:键(key) 和 值(value),二者通过冒号 : 分隔,多个键值对之间使用逗号 , 分隔。例如:

person = {"name""Wilson""age"25}

在其他编程语言中,字典的概念与 对象(object) 或 映射(map) 类似。Python 字典是可变(mutable)的,这意味着可以在创建后对其内容进行修改、添加或删除。

(1)字典的特点

① 键值映射(Key-Value Mapping)。

字典通过键(key)访问对应的值(value),而不是依靠索引位置。

print(person["name"])  # 输出 Wilson

② 键的唯一性。

字典中的键必须是唯一的;如果定义时出现重复键,后者会覆盖前者的值。

data = {"a"1"b"2"a"3}print(data)  # 输出 {'a': 3, 'b': 2}

③ 可变性(Mutable)。

字典的内容可以随时修改:

person["age"] = 26print(person)  # 输出 {'name''Wilson''age'26}

③ 键的类型限制。

键(key)必须是可哈希(hashable)的类型,通常为不可变类型,如字符串、数字或元组。值(value)则没有限制,可以是任意 Python 对象。

(2)字典的常用方法

Python 提供了多种内置方法用于快速访问字典中的键、值和键值对。

① keys():返回所有键的视图对象。

person = {"name""Wilson""age"25}print(person.keys())  # 输出 dict_keys(['name''age'])

② values():返回所有值的视图对象。

print(person.values())  # 输出 dict_values(['Wilson', 25])

③ items():返回所有键值对的视图对象。

print(person.items())  # 输出 dict_items([('name''Wilson'), ('age', 25)])

这些“视图对象”虽然看起来像列表,但实际上是可迭代的动态视图,会随字典内容的变化而更新。

(3)字典的常见操作

操作

示例

说明

访问值

person["name"]

根据键访问对应的值

添加键值对

person["gender"] = "male"

新增键与值

修改值

person["age"] = 26

更新已有键对应的值

删除键值对

del person["age"]

删除指定键及其对应值

判断键是否存在

"name" in person

返回布尔值

示例:

person = {"name""Wilson""age"25}person["gender"] = "male"     # 添加person["age"] = 26            # 修改del person["name"]            # 删除print(person)                 # 输出 {'age': 26, 'gender': 'male'}

(4)进阶知识:字典的哈希原理

Python 中的字典底层是通过哈希表(hash table)实现的,这意味着它在设计上追求快速查找与插入的性能。

哈希表通过对键(key)进行哈希运算,将其映射到特定的内存位置,从而实现常数时间复杂度 O(1) 的查找。无论字典中存放 10 个还是 10 万个键值对,访问某个键所需的时间几乎不变。

这种高效机制使得字典成为 Python 中最常用的数据结构之一,尤其适合需要快速查询或建立映射关系的场景。例如,学生成绩表、配置项、数据缓存等应用中都能见到字典的身影。

💡 对比说明:

  • 字典查找
    :通过哈希计算定位 → 时间复杂度 O(1)
  • 列表查找
    :通过逐项遍历索引 → 时间复杂度 O(n)

16. 什么可以作为字典的键(Key)

在 Python 的字典(Dictionary)中,键(key) 是用于标识和访问对应值(value)的唯一标识符。由于字典底层基于哈希表(hash table)实现,因此对“键”的使用有严格的限制条件。理解这些限制,是正确使用字典的关键。

① 键必须是不可变的(Immutable)。

所谓不可变,是指对象在创建后,其内容无法被修改。如果键是可变的,那么它的哈希值就可能发生改变,这将导致字典无法准确定位对应的值。

Python 中常见的不可变类型包括:

  • 整数(int
  • 浮点数(float
  • 布尔值(bool
  • 字符串(str
  • 元组(tuple

以上类型都可以安全地用作字典的键。例如:

data = {    1"one",    3.14"pi",    True"yes",    "name""Alice",    (1020): "coordinates"}print(data["name"])     # 输出 Aliceprint(data[(1020)])   # 输出 coordinates

② 键必须是可哈希的(Hashable)。

哈希(hashing) 是一种将对象转换为固定长度数值的过程。Python 字典通过哈希值快速定位键的位置,从而实现常数时间复杂度 O(1) 的查找。

一个对象若想作为键,必须满足两个条件:

  • 该对象在生命周期中哈希值不会改变
  • 它实现了 __hash__() 方法。

可哈希对象意味着它能参与哈希计算,并在字典中被唯一识别。例如:

print(hash("hello"))    # 输出一个哈希值,例如:696005672print(hash((123)))  # 元组也可被哈希

相反,列表(list)集合(set)等可变对象因为内容可随时改变,无法被哈希,因此不能作为字典键。

data = {}# 以下操作会报错:TypeError: unhashable type: 'list'data[[12]] = "test"

③ 用元组替代列表作为键。

在某些应用场景中,我们希望使用多个值组合来作为键,例如地理坐标(经纬度)、三维坐标点等。由于列表不可哈希,Python 通常使用元组(tuple)来代替:

locations = {    (39.90, 116.40): "Beijing",    (34.05, -118.24): "Los Angeles"}print(locations[(39.90, 116.40)])  # 输出 Beijing

元组是不可变的,因此它是构建多维键的理想选择。

④ 自定义类型的哈希实现。

在高级用法中,若希望自定义类的对象也能作为字典键,可通过实现 __hash__() 和 __eq__() 方法来自定义哈希规则。例如:

class Point:    def __init__(self, x, y):        self.x, self.y = x, y    def __hash__(self):        return hash((self.x, self.y))  # 基于坐标生成哈希值    def __eq__(self, other):        return (self.x, self.y) == (other.x, other.y)p1 = Point(12)p2 = Point(12)data = {p1: "A point"}print(data[p2])  # 输出 A point(因为哈希值与比较结果一致)

通过自定义哈希函数,我们可以让自定义对象像内置类型一样作为键使用。

17. 元组(Tuples)

元组(Tuple) 是一种有序且不可变(immutable)的序列类型,用于存储一组不可修改的数据。例如:

t = (10, "100", "Hello")

与列表类似,元组也可以包含不同类型的元素,但与列表不同的是,元组一旦创建就不能修改,这意味着不能添加、删除或更改其中的元素。

① 元组的基本特征。

  • 使用圆括号 () 定义
numbers = (123)
  • 支持不同类型的元素
mixed = (10"Python", True, 3.14)
  • 可通过索引访问
print(mixed[1])  # 输出 "Python"
  • 支持嵌套
nested = (1, (23), 4)print(nested[1][0])  # 输出 2

② 常用内置函数与方法。

方法/函数

功能说明

示例

len()

返回元组中元素的个数

len(t)→ 3

count(x)

统计元素 x 出现的次数

(1, 2, 1, 3).count(1)→ 2

index(x)

返回元素 x 第一次出现的位置索引

(1, 2, 3, 2).index(2) → 1

set()

将元组转换为集合(去除重复)

set((1, 2, 2, 3)) → {1, 2, 3}

③ 元组的不可变性。

元组的最大特点是不可变性。创建后不能执行如下操作:

t = (123)t.append(4)   # ❌ 报错:tuple 没有 append 方法t.pop()       # ❌ 报错:tuple 没有 pop 方法t[0] = 99     # ❌ 报错:元组元素不可修改

④ 使用场景与优势。

  • 适用于不可修改的数据集合(如坐标、配置参数等)
  • 元组的访问速度比列表快
  • 可以作为字典的键(key)或集合的元素(set element)(因为其不可变)

元组(Tuple)是 Python 中常用的数据结构之一。为了更高效地处理多值数据,Python 提供了元组打包(Tuple Packing)元组解包(Tuple Unpacking) 这两项非常实用的特性。

18. 元组的打包与解包(Tuple Packing & Unpacking)

① 元组打包(Tuple Packing)。

元组打包 指的是:Python 会自动将多个用逗号分隔的值打包成一个元组

换句话说,即使不显式加上圆括号 (),Python 也能识别出一个元组。

# 显式打包t = (102030)# 隐式打包(省略括号)t = 102030print(t)      # 输出 (102030)print(type(t))  # 输出 <class 'tuple'>

这种方式常用于同时返回多个值的场景,例如函数返回多个结果时:

def get_point():    return 1020  # 自动打包成元组point = get_point()print(point)  # 输出 (10, 20)

② 元组解包(Tuple Unpacking)。

元组解包 指的是:将元组中的多个元素,按顺序分别赋值给多个变量

这是一种非常简洁且高效的写法。

t = (102030)a, b, c = t  # 解包print(a, b, c)  # 输出 10 20 30

如果解包的变量数量与元组元素数量不匹配,会触发 ValueError 异常。

t = (123)a, b = t   # ❌ 报错:too many values to unpack

为了解决这种情况,可以使用星号(*)语法接收多余的值:

a, *b = (10203040)print(a)  # 10print(b)  # [20, 30, 40]

或仅保留最后一个值:

*a, b = (10, 20, 30, 40)print(a)  # [10, 20, 30]print(b)  # 40

③ 应用场景示例。

  • 在机器学习与数据分析中,元组解包是一项 极为常用的技巧,例如:
# 导入numpy库,用于数值计算与统计分析import numpy as np# 设定随机种子,保证每次运行结果一致np.random.seed(0)# 生成两个长度为5的随机数组x、y,作为相关系数计算的样本数据x, y = np.random.rand(5), np.random.rand(5)# 计算x与y的相关系数矩阵,并提取[0,1]位置的相关系数值# 同时手动设定显著性水平p_value为0.05corr, p_value = np.corrcoef(x, y)[01], 0.05# 输出计算得到的相关系数与设定的显著性水平。print(corr, p_value)

上述代码可能的执行结果:

0.123456789 0.05
  • 或在循环中同时遍历索引与值:
# 使用 enumerate() 同时遍历列表的索引和对应元素for index, value in enumerate(["A""B""C"]):    # 输出索引值和对应的元素内容。    print(index, value)

上述代码的输出结果:

0 A1 B2 C

19. 集合(Sets)

集合(Set)是 无序且元素唯一 的数据结构,用于存储一组 不重复的对象在 Python 中,可以使用大括号 {} 或 set() 函数创建集合,例如:

my_set = {"a""b"20}print(my_set)        # 输出:{'a''b'20}print(type(my_set))  # 输出:<class 'set'>

集合中的每个元素都必须是 可哈希(hashable) 的,也就是说,它们的内容在生命周期中不可改变。因此,整数、字符串、元组等都可以作为集合元素,但列表、字典等可变对象则不行。

(1)集合的特点

① 无序性(Unordered)。

集合中的元素没有固定顺序,因此不能通过索引访问。

② 唯一性(Unique Elements)。

集合会自动去重。例如:

s = {1213}print(s)  # 输出:{123}

③ 可变性(Mutable)。

集合本身是可变的,可以添加或删除元素。

④ 数学特性。

Python 集合的设计借鉴了 离散数学(Discrete Mathematics) 的集合概念,因此它支持交集、并集、差集等数学运算。

(2)常用的集合内置方法

方法

功能说明

示例

add(elem)

向集合中添加元素,若元素已存在则忽略

s.add("x")

clear()

清空集合所有元素,使其变为空集

s.clear()

copy()

返回集合的浅拷贝

new_s = s.copy()

discard(elem)

移除指定元素,若不存在不报错

s.discard("y")

remove(elem)

移除指定元素,若不存在则报错

s.remove("y")

pop()

随机移除一个元素(集合无序,无法指定)

s.pop()

(3)集合的数学运算方法

Python 集合支持多种 数学集合运算,如下表所示:

运算类型

方法

含义

示例

并集(Union)

union()

合并两个集合的所有元素(去重)

a.union(b)

 或 a | b

交集(Intersection)

intersection()

取两个集合的公共元素

a.intersection(b)

 或 a & b

差集(Difference)

difference()

取当前集合中有、其他集合中没有的元素

a.difference(b)

 或 a - b

对称差集(Symmetric Difference)

symmetric_difference()

取只存在于一个集合中的元素

a.symmetric_difference(b)

 或 a ^ b

子集判断

issubset()

判断当前集合是否为另一个集合的子集

a.issubset(b)

 或 a <= b

超集判断

issuperset()

判断当前集合是否包含另一个集合

a.issuperset(b)

 或 a >= b

不相交判断

isdisjoint()

判断两个集合是否没有交集

a.isdisjoint(b)

(4)示例代码

A = {1234}B = {3456}print(A.union(B))                 # 并集:{123456}print(a | b)                      # 并集:{123456}print(A.intersection(B))          # 交集:{34}print(A.difference(B))            # 差集:{12}print(A.symmetric_difference(B))  # 对称差集:{1256}

(5)应用场景举例

集合在实际开发中应用广泛,例如:

  • 去重操作:
names = ["Alice""Bob""Alice""Tom"]unique_names = set(names)print(unique_names)  # {'Alice''Bob''Tom'}
  • 快速成员检测:
s = {"python""java""c++"}print("python" in s)  # True
  • 集合运算统计:
# 比较两位学生喜欢的编程语言stu1 = {"Python""C++""Java"}stu2 = {"Python""Go""Rust"}print(stu1 & stu2)  # 两人共同喜欢:{'Python'}

20. 布尔类型(Boolean)

在编程中,我们经常需要判断某件事情的结果是“真(True)”还是“假(False)”。

例如,在一个电影院售票系统中,我们可能会设置如下规则:

height = 110if height < 120:    print("免费入场")else:    print("票价:100元")

在这个示例中,表达式 height < 120 的计算结果是一个 布尔值(Boolean),其取值只有两种可能:

  • True
     —— 表示条件成立(真)
  • False
     —— 表示条件不成立(假)

布尔类型是 Python 中的一种基本数据类型,用于表示逻辑判断的结果。

① 布尔值的基本概念。

Python 中的布尔类型只有两个常量:

TrueFalse

务必注意,它们的 首字母必须大写

例如:

is_adult = Truehas_ticket = False

如果误写为 true 或 false,Python 会提示错误:

>>> trueNameError: name 'true' is not defined

② 布尔类型的来源。

实际上,Python 的布尔类型是从整数类型(int)派生而来:

print(isinstance(Trueint))  # 输出:Trueprint(True == 1)              # 输出:Trueprint(False == 0)             # 输出:True

这意味着布尔值可以参与数值运算:

print(True + True + False)  # 输出:2

③ 常见的布尔运算。

运算符

含义

示例

结果

==

判断相等

3 == 3

True

!=

判断不等

3 != 4

True

< 、>

判断大小

5 > 2

True

<= 、>=

判断大小关系

6 >= 6

True

and

逻辑与(同时为真)

True and False

False

or

逻辑或(任一为真)

True or False

True

not

逻辑非(取反)

not True

False

这些运算通常用于控制语句(如 ifwhile)中,用来决定程序的执行路径。

④ 布尔值的隐式转换。

在 Python 中,任何对象都可以被转换为布尔值以下对象在布尔上下文中被视为 False

  • 0(整数零)
  • 0.0(浮点数零)
  • ''(空字符串)
  • [](空列表)
  • {}(空字典)
  • set()(空集合)
  • None

其他所有对象都被视为 True

例如:

print(bool(0))      # Falseprint(bool(""))     # Falseprint(bool([1]))    # Trueprint(bool("Hi"))   # Tru⑤ 为什么 True 和 False 必须首字母大写?

在 Python 中,保持语言内部一致性 是首要设计原则之一。所有内置常量(如 NoneTrueFalse)的首字母均采用 大写形式,以与变量区分。这也是 Python 与许多其他语言(如 JavaScript 的 truefalse)在语法风格上的区别。

官方文档对此有明确说明,可参考:📘Python 官方文档 - Built-in Constants

21. Python 中的注释(Comments)

在编程过程中,注释(Comment) 是一种非常重要的书写习惯。它不会被 Python 解释器执行,主要用于解释代码逻辑、记录设计意图或提示使用方法。

编写高质量注释不仅能帮助自己更好地理解代码,也能让他人更轻松地维护与协作。

① 为什么需要注释?

  • 帮助自己理解代码功能
当你在几个月后回看旧代码时,注释可以帮助你快速回忆代码的逻辑和设计思路。
  • 帮助同事阅读与协作
在团队开发中,代码常由多人共同维护。清晰的注释能让团队成员更快理解你的意图,减少沟通成本。
  • 帮助社区开发者学习
如果你将代码发布到 GitHub、Gitee 等平台,良好的注释能让他人更容易理解并复用你的代码。

② 单行注释(Single-line Comment)。

在 Python 中,单行注释 以井号 # 开头,解释器会忽略该符号后的所有内容。

# 这是一个单行注释name = "Alice"  # 给变量赋值

提示:在 VS Code 中,可选中要注释的代码,按下快捷键:

  • Windows / Linux:Ctrl + /
  • macOS:Command + /

即可快速为多行代码添加或取消注释。

③ 多行注释(Multi-line Comment)。

Python 没有专门的多行注释语法,但可以使用 三个引号(''' 或 """) 包裹多行文本,实现类似效果:

'''这是一个多行注释的示例可用于解释模块、函数或复杂逻辑'''print("Hello, Python!")

这种写法常用于 文档说明(Documentation) 或 函数说明(Docstring),例如:

def greet(name):    """    函数说明:    greet(name) 用于打印问候语。    参数:        name (str):用户名。    返回:        无    """    print(f"Hello, {name}!")

④ 文档字符串(Docstring)

Python 中的函数、类与模块都支持 文档字符串(Docstring),用于描述其用途、参数与返回值。Docstring 通常写在函数或类定义的首行,并使用三引号包裹。

示例:

def add(a, b):    """返回两个数的和。"""    return a + bprint(add.__doc__)  # 输出:返回两个数的和。

💡建议:

  • 单行注释用于简短说明。
  • 多行注释用于记录复杂逻辑或算法。
  • Docstring 用于函数、类或模块说明,是编写专业 Python 代码的必要习惯。

22. 类型检查(Type Checking)

在 Python 中,声明变量时无需指定数据类型

这与 Java、C 等静态类型语言不同——在那些语言中,变量在声明时必须明确数据类型,而 Python 属于 动态类型语言(Dynamically Typed Language),变量类型会根据赋值内容自动推断。

例如:

x = 10          # 整数类型(int)y = "Python"    # 字符串类型(str)z = 3.14        # 浮点数类型(float)

在编写代码时,这种灵活性让开发更加简洁,但有时也会带来一个问题:

“我们并不总能清楚变量当前是什么类型。”

为了解决这个问题,Python 提供了一个非常实用的内置函数——type()

① type() 函数的基本用法。

type() 是 Python 的内置类型检查函数,用于 返回对象所属的数据类型

基本语法如下:

type(object)

其中:

  • object
     表示要检测的变量或值;
  • 函数返回一个 类型对象(type object)

示例:

a = 123b = "Hello"c = 3.14d = Trueprint(type(a))  # <class 'int'>print(type(b))  # <class 'str'>print(type(c))  # <class 'float'>print(type(d))  # <class 'bool'>

输出结果表明,type() 会返回对象对应的类型名称,例如 intstrfloatbool 等。

② type() 函数的典型应用场景。

  • 调试时检查变量类型。
user_input = input("请输入数字:")print(type(user_input))  # 输出:<class 'str'>

尽管输入的是数字,但 input() 函数总是返回字符串类型,因此在使用前通常需要类型转换。

  • 判断类型后执行特定逻辑。
data = [123]if type(data) == list:    print("这是一个列表")

相比直接比较 type,更推荐使用 isinstance() 进行类型判断。

  • 快速查看复杂对象的类型。
student = {"name""Alice""age": 18}print(type(student))  # <class 'dict'>

③ 与 isinstance() 的区别。

虽然 type() 可以判断变量类型,但在实际开发中,Python 更推荐使用 isinstance() 进行类型检测。

区别如下:

对比项

type()

isinstance()

判断精度

严格判断(类型必须完全匹配)

支持继承判断(子类对象也可通过)

推荐程度

一般用于调试、查看类型

推荐用于逻辑判断

示例

type(x) == int

isinstance(x, int)

示例说明:

class Animal:    passclass Dog(Animal):    passdog = Dog()print(type(dog) == Animal)       # Falseprint(isinstance(dog, Animal))   # True ✅

23. 数据类型的其他信息

(1)复数(Complex Numbers)

在 Python 中,复数由实部虚部组成,语法形式为:

a + bj

其中:

  • a
     是实部(real part),可以是整数或浮点数;
  • b
     是虚部(imaginary part)前的系数,j 表示虚数单位,等价于数学中的 √(−1)。

例如:

z = 3 + 2jw = 8 - 5jresult = z + wprint(result)   # 输出 (11 - 3j)

Python 使用 j(而不是其他语言常用的 i)来表示虚数单位。

复数在科学计算、信号处理等领域非常常见,例如在 NumPy 中用于傅里叶变换等运算。

(2)None 类型

除了常见的数值、字符串、布尔值等类型,Python 还提供了一种特殊类型:None

None 表示 “空” 或 “无值”,通常用于以下几种场景:

  • 函数没有返回值时
    ,默认返回 None
  • 表示变量尚未赋值
     或 占位
  • 用作条件判断
    ,例如 if result is None:

示例:

def hello():    print("Hello, Python!")result = hello()       # 函数未返回任何内容print(result)          # 输出 None

(3)函数引用与函数调用的区别

若定义了一个函数:

def hello():    return "Hello, World!"
  • print(hello)
    👉 输出函数对象的内存地址,例如:<function hello at 0x7f93f80ce280>这是函数在内存中的引用,而不是执行结果。
  • print(hello())
    👉 正确调用函数,执行后输出:Hello, World!

这一区别在调试与传递函数参数时尤其重要。

(4)浮点数的精度问题(Floating Point Precision)

在 Python 中执行如下运算:

print(0.1 + 0.2 - 0.3)

你可能直觉上认为结果应为 0,但实际输出为:

5.551115123125783e-17

这是一个非常接近 0 的极小数原因在于:二进制浮点数无法精确表示所有十进制小数

例如,十进制的 0.1 在二进制中是一个无限循环小数,因此 Python 只能以近似值进行存储与计算。这种情况不仅出现在 Python 中,C、Java、JavaScript 等语言也存在相同的问题。

若需要精确的小数计算(如货币、财务运算),应使用:

from decimal import Decimalprint(Decimal('0.1'+ Decimal('0.2'- Decimal('0.3'))  # 输出 0.0

(5)一切皆对象(Everything is an Object)

Python 是一门面向对象(Object-Oriented)的语言。

这意味着:在 Python 中,一切数据都是对象,包括数字、字符串、列表、字典,甚至函数与模块。

每个对象都包含:

  • 属性(Attributes)
    :对象所拥有的数据;
  • 方法(Methods)
    :对象能够执行的操作。

举例:

name = "Python"print(name.upper())  # 输出 'PYTHON'

这里,字符串对象 name 拥有一个名为 .upper() 的方法,用于将字母转换为大写。同样,列表、字典、集合等类型也都有各自的方法与行为。

就像现实中的对象(汽车能行驶、手机能响铃)一样,Python 中的对象也能“做事”,这正是面向对象编程的核心思想。

(6)join() 方法的应用

join() 是字符串对象的一个常用方法,用于将一个可迭代对象(如列表、元组、集合)中的所有元素拼接成一个新的字符串

语法:

'分隔符'.join(可迭代对象)

示例:

words = ["Python""is""fun"]sentence = " ".join(words)print(sentence)  # 输出:Python is fun

该方法在需要将多个字符串合并时非常高效,尤其是在从 列表、元组、集合 生成字符串的场景中常被使用。

24. 按值复制与按引用复制(Copy by Value or Reference)

在 Python 中,给变量赋值时,变量存储的并非值本身,而是对象或对象引用。

根据赋值方式不同,Python 的赋值可以分为 按值复制(Copy by Value) 和 按引用复制(Copy by Reference)

① 按值复制(Copy by Value)。

按值复制指的是:

  • 复制对象本身的值
  • 生成一个全新的对象
  • 将这个新对象存入变量。

适用的数据类型主要是 不可变类型

  • 整数(int
  • 浮点数(float
  • 布尔值(bool
  • 字符串(str

示例:

a = 10b = a          # 按值复制b += 5print(a)  # 10print(b)  # 15

这里,a 与 b 分别指向不同的整数对象,修改 b 并不会影响 a

② 按引用复制(Copy by Reference)。

按引用复制指的是:

  • 复制对象在内存中的 引用地址
  • 变量指向 同一个对象
  • 对该对象的修改会影响所有引用该对象的变量。

适用的数据类型主要是 可变类型

  • 列表(list
  • 字典(dict
  • 集合(set
  • 元组(tuple,如果元组包含可变元素)

示例:

lst1 = [1, 2, 3]lst2 = lst1    # 按引用复制lst2.append(4)print(lst1)  # [1, 2, 3, 4]print(lst2)  # [1, 2, 3, 4]

可以看到,修改 lst2 同时也改变了 lst1,因为它们指向同一个列表对象。

③ 创建对象副本(Copying Objects)。

为了避免引用共享带来的副作用,可使用复制方法:

  • 浅拷贝(Shallow Copy)

适用于列表、字典、集合,可创建对象的新副本,但只复制一层结构

lst1 = [1, 2, 3]lst2 = lst1.copy()  # 浅拷贝lst2.append(4)print(lst1)  # [1, 2, 3]print(lst2)  # [1, 2, 3, 4]
  • 深拷贝(Deep Copy)

适用于元组或嵌套数据结构,需要使用 deepcopy() 函数:

from copy import deepcopyt1 = ([12], [34])t2 = deepcopy(t1)t2[0].append(99)print(t1)  # ([1, 2], [3, 4])print(t2)  # ([1, 2, 99], [3, 4])

💡注意

  • 元组本身是不可变的,但若元组中包含可变对象(如列表),按引用复制会导致嵌套对象共享;
  • deepcopy()
     可确保嵌套对象也被复制,从而避免意外修改。

25. 排序(Sort)与 sorted() 函数

在编程中,排序是一项非常常见的操作。Python 提供了多种方式对数据进行排序,但需要注意的是:可变对象和不可变对象的排序方式不同

① 列表的内置方法 sort()

列表(list)是可变对象,因此可以使用 列表自身的 sort() 方法 对其进行排序。

numbers = [5, 2, 9, 1]numbers.sort()  # 直接修改原列表print(numbers)  # [1, 2, 5, 9]
  • sort()
     方法会 直接修改原列表,不会返回新列表;
  • 支持关键字参数:
    • reverse=True
      :降序排序
    • key=函数名
      :按照指定规则排序

示例(降序排序):

numbers = [5291]numbers.sort(reverse=True)print(numbers)  # [9, 5, 2, 1]

② 不可变对象与 sorted() 函数。

对于 不可变数据类型(如元组、字符串)以及其他可迭代对象(如集合、字典的键或值),它们 没有内置的排序方法

Python 提供了一个内置函数 sorted(),可以从任何可迭代对象生成一个 新的排序后的列表,并且不会修改原始数据。

# 元组排序t = (4173)sorted_t = sorted(t)print(sorted_t)  # [1, 3, 4, 7]print(t)         # (4173)# 字符串排序s = "python"sorted_s = sorted(s)print(sorted_s)  # ['h', 'n', 'o', 'p', 't', 'y']# 集合排序set_data = {5291}sorted_set = sorted(set_data)print(sorted_set)  # [1, 2, 5, 9]

 特点总结:

  • sorted()不会修改原对象
  • 无论原对象是否可变,sorted() 都会返回一个 新列表
  • 同样支持 reverse=True 与 key=函数名 参数。

③ 结合 key 参数的排序示例。

key 参数可以指定一个函数,用于从元素中提取用于排序的关键值。例如,对字符串按长度排序:

words = ["apple""banana""fig""cherry"]sorted_words = sorted(words, key=len)print(sorted_words)  # ['fig''apple''banana''cherry']

26. Python 中的成员运算符

在编程中,我们经常需要判断某个元素是否存在于一个序列或集合中。Python 提供了 成员运算符(Membership Operators) 来实现这一功能,使判断操作简单而高效。

① 成员运算符概览。

运算符

描述

in

若元素存在于指定序列中,返回 True;否则返回 False

not in

若元素不存在于指定序列中,返回 True;否则返回 False

 注意:成员运算符可用于所有 序列类型 和 集合类型,包括字符串、列表、元组、字典和集合。

② 示例演示。

  • 字符串。
text = "Python"print("y" in text)      # Trueprint("z" not in text)  # True
  • 列表。
numbers = [1, 2, 3, 4, 5]print(3 in numbers)      # Trueprint(6 not in numbers)  # True
  • 元组。
colors = ("red""green""blue")print("green" in colors)      # Trueprint("yellow" not in colors) # True
  • 字典。
student = {"name""Alice""age": 18}print("name" in student)      # Trueprint("Alice" in student)     # False,字典默认检查键而非值
  • 集合。
fruits = {"apple""banana""cherry"}print("banana" in fruits)      # Trueprint("orange" not in fruits)  # True

③ 成员运算符的优势。

  • 简洁高效
    :无需写复杂算法或循环即可判断元素是否存在;
  • 通用性强
    :可作用于多种序列和集合类型;
  • 提高可读性
    :代码更加直观,逻辑清晰。

💡 如果没有成员运算符,你可能需要借助循环或算法判断元素是否存在于序列中,这会繁琐且易出错。

27. 本章小结

本章系统介绍了 Python 中的数据类型体系及其核心使用方式。首先,从编程基础出发,阐述了数据类型在程序设计中的重要性,并说明了 Python 的基本语法规则,如大小写敏感性、缩进结构及代码块划分方式。随后,对常见数据类型进行了整体概述,明确了基础类型与容器类型的分类,以及按值复制与按引用复制的区别。

在具体内容上,本章重点讲解了数字类型及其运算规则、常用内置函数与 math 模块的使用;结合变量与赋值,帮助读者理解数据在内存中的存储与变化机制。针对字符串,系统介绍了其基本特性、拼接方式、内置方法以及不可变性等关键规则,并补充了格式化输出与特殊操作技巧。

在数据结构部分,详细分析了列表、字典、元组与集合的定义方式、核心特征及典型应用场景,重点强调了可变与不可变对象的差异及其对程序行为的影响。同时,通过字典键的限制、元组的打包与解包、集合的数学运算等内容,进一步深化了对数据结构的理解。

此外,本章还介绍了布尔类型与逻辑运算、注释规范、类型检查方法(type 与 isinstance)、以及复数、None、浮点精度等补充知识,并对排序操作(sort 与 sorted)及成员运算符的使用进行了说明。

通过本章的学习,读者应能够全面掌握 Python 数据类型的基本概念、常用操作及其底层特性,为后续控制结构、函数设计及面向对象编程等内容的学习奠定坚实基础。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-16 10:42:09 HTTP/2.0 GET : https://f.mffb.com.cn/a/485784.html
  2. 运行时间 : 0.110922s [ 吞吐率:9.02req/s ] 内存消耗:4,908.59kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=39e271ed523329645c8d1f1c0c35d569
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000789s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001342s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000583s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000665s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001033s ]
  6. SELECT * FROM `set` [ RunTime:0.000475s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001187s ]
  8. SELECT * FROM `article` WHERE `id` = 485784 LIMIT 1 [ RunTime:0.001340s ]
  9. UPDATE `article` SET `lasttime` = 1776307329 WHERE `id` = 485784 [ RunTime:0.001599s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000607s ]
  11. SELECT * FROM `article` WHERE `id` < 485784 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001023s ]
  12. SELECT * FROM `article` WHERE `id` > 485784 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000975s ]
  13. SELECT * FROM `article` WHERE `id` < 485784 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002110s ]
  14. SELECT * FROM `article` WHERE `id` < 485784 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002191s ]
  15. SELECT * FROM `article` WHERE `id` < 485784 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002510s ]
0.116007s