python杂项函数/用法积累(持续更新)
三元表达式
以及其在字符串格式化中的运用
基本语法:
value_if_true if condition else value_if_false- 使用情况:
condition是一个布尔表达式,值为true或者false
一句话说完怎么用:中间为true,返回左边,为false,返回右边
比如:
1 | from PyPDF2 import PdfReader |
这里面在输出文本的时候,如果中间的information.author有这个值的话,即为True,使用左边的值,如果不存在,即为False,那么返回右边的值
Python列表推导式
简单来说,它的作用就是简单生成一个列表
生成列表:
对于for i in range(1,10),这个简单的式子要生成列表:
1 | result = [number_list for a in range(1,10)] |
这里的结果为:[1,2,3,4,5,6,7,8,9]
而不是像for i in range(1,10)
单纯输出1,2,3…
举个例子:
1 | from pprint import pprint |
相当于for前面的就是for后面两个参数在每次迭代的时候,要赋值的位置,q,a就是对每次迭代的元组里的两个值进行了定义。
嵌套关系:
它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以 if 和 for 语句为上下文的表达式运行完成之后产生。 列表推导式的执行顺序:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边第一条语句是最后一层。 [x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]
他的执行顺序是:
1 | for x in range(1,5) |
zip函数
zip 函数基础:zip 函数在Python中用于将多个可迭代对象(如列表、元组等)中的元素按顺序配对,返回一个可迭代的 zip 对象。例如:
1 | a = [1, 2, 3] b = ['a', 'b', 'c'] zipped = zip(a, b) print(list(zipped)) ``` 上述代码中,`zip(a, b)` 将 `a` 和 `b` 中的元素按顺序配对,输出 `[(1, 'a'), (2, 'b'), (3, 'c')]`。 |
* 解包操作符:* 在Python中可以用于解包可迭代对象。例如: python my_list = [1, 2, 3] print(*my_list) 这里的 *my_list 会将 my_list 解包,等同于 print(1, 2, 3),输出 1 2 3。 3. texts, labels = zip(*train_data) 解释:假设 train_data 是一个列表,其中每个元素是一个包含两个元素的元组,
例如
train_data = [('问题1', 0), ('问题2', 1), ('问题3', 0)]。这里的*train_data会将train_data解包,即把[('问题1', 0), ('问题2', 1), ('问题3', 0)]变成('问题1', 0), ('问题2', 1), ('问题3', 0)。然后
zip函数作用于这些解包后的元组,将它们的第一个元素组合在一起,第二个元素组合在一起。也就是把所有问题文本组合成一个可迭代对象,所有标签组合成一个可迭代对象。最后,通过
texts, labels =...将这两个可迭代对象分别赋值给texts和labels。所以texts会是一个包含所有问题文本的可迭代对象(如('问题1', '问题2', '问题3')),labels会是一个包含所有标签的可迭代对象(如(0, 1, 0))。在实际应用中,这一步常用于将训练数据集中的文本和对应的标签分开,以便后续分别用于特征提取(对
texts操作)和模型训练(同时使用texts对应的特征和labels)。例如在之前的朴素贝叶斯文本分类代码中,后续会对texts使用CountVectorizer进行特征提取,然后用提取的特征和labels来训练朴素贝叶斯分类器。
lambda匿名函数
1. 定义与基本概念
在 Python 中,lambda 函数也被称为匿名函数,它是一种轻量级、临时的、没有名称的函数。常规函数使用 def 关键字来定义,而 lambda 函数使用 lambda 关键字来创建。
2. 语法结构
lambda 函数的基本语法如下:
1 | lambda 参数列表: 表达式 |
- 参数列表:这部分用于定义函数接收的参数,可以包含零个、一个或多个参数。如果有多个参数,它们之间用逗号分隔。
- 表达式:这是
lambda函数的核心部分,函数会计算这个表达式的值并将其作为返回结果。需要注意的是,lambda函数只能包含一个表达式,不能包含多条语句。
3. 简单示例
以下是几个不同形式的 lambda 函数示例:
- 无参数的
lambda函数:
1 | get_five = lambda: 5 |
在这个例子中,lambda 函数不接收任何参数,每次调用时都会返回数字 5。
- 单参数的
lambda函数:
1 | square = lambda x: x ** 2 |
这里的 lambda 函数接收一个参数 x,并返回 x 的平方。
- 多参数的
lambda函数:
1 | add = lambda a, b: a + b |
此 lambda 函数接收两个参数 a 和 b,并返回它们的和。
4. 应用场景
4.1 作为参数传递给高阶函数
lambda 函数常被用作高阶函数(如 map()、filter()、sorted() 等)的参数,用于定义简单的操作逻辑。
map()函数示例:
1 | numbers = [1, 2, 3, 4] |
在这个例子中,map() 函数会将 lambda 函数应用到 numbers 列表的每个元素上,返回一个包含平方结果的迭代器,最后使用 list() 函数将其转换为列表。
filter()函数示例:
1 | numbers = [1, 2, 3, 4, 5, 6] |
这里的 filter() 函数会根据 lambda 函数的条件过滤 numbers 列表中的元素,只保留能被 2 整除的元素。
sorted()函数示例:
1 | students = [('Alice', 25), ('Bob', 20), ('Charlie', 22)] |
在这个例子中,sorted() 函数根据 lambda 函数指定的规则对 students 列表进行排序,排序的依据是每个元组的第二个元素(年龄)。
4.2 临时使用的简单函数
当你只需要一个简单的函数,并且这个函数只在特定的代码片段中使用一次时,使用 lambda 函数可以避免定义一个完整的常规函数,使代码更加简洁。
5. 局限性
- 功能受限:由于
lambda函数只能包含一个表达式,它无法实现复杂的逻辑,如循环、条件判断语句块等。如果需要实现复杂的功能,还是应该使用常规的def函数。 - 可读性问题:虽然
lambda函数可以让代码更简洁,但如果表达式过于复杂,会降低代码的可读性,因此在使用时需要权衡简洁性和可读性
匿名函数闭包问题
本质:闭包问题的根源在于匿名函数在定义时不会立即获取外部变量的值,而是在调用时才去获取。当外部变量的值在函数调用前发生了改变,就会导致所有函数获取到的是同一个最终值。使用默认参数可以在函数定义时就将当前变量的值保存下来,为每个函数创建独立的变量副本,从而避免闭包问题。
错误代码:
functions = [] for k in range(3): functions.append(lambda: k) for func in functions: print(func())1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
* 这里的输出为:`2,2,2`
原因:
`for`循环中`k`的值会依次取为`0,1,2`,但是每次循环就单纯把这个匿名函数添加到了列表中,没有其他操作,`k`最后的值为`2`。
* 在第二个`for`循环中,`print()`函数的调用也是调用了`lamba`匿名函数,但是此时的`k`值为`2`,所以三个逐个调用都是输出`2`。
* 正确代码:
* ```python
functions = []
for k in range(3):
functions.append(lambda x=k: x)#主要是这个地方进行了修改
for func in functions:
print(func())在这个修改后的代码中,使用了默认参数
x=k,这样每个匿名函数在定义时就把当前k的值保存下来了(相当于进行了调用),调用时就能返回不同的值。
.key()方法
在 Python 中,.keys() 是字典(dict)、pandas 的 Series 和 DataFrame 等数据结构的常用方法,作用是获取数据结构中所有的键(key)。
- 字典(
dict)的.keys()方法:对于字典,.keys()方法返回一个可迭代对象,包含字典中所有的键。这个可迭代对象可以直接用于循环遍历,也能转换为列表等其他数据类型。示例如下:
1 | my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'} |
pandas的Series的.keys()方法:在pandas的Series中,.keys()方法返回Series的索引(index)。Series可以看作是带索引的一维数组,索引类似于字典中的键。示例如下:
1 | import pandas as pd |
pandas的DataFrame的.keys()方法:对于pandas的DataFrame,.keys()方法返回DataFrame的列名。DataFrame是二维表格结构,列名类似于字典中的键。示例如下:
1 | import pandas as pd |



