书接上回,学习到了库
6.3 库
定义:库是一个更大的集合,通常包含多个包,用于实现特定功能(例如数据处理,机器学习等)。
举例:
NumPy:提供高效的数组操作 Pandas:用于数据分析 Scikit-learn:用于机器学习
先安装 scikit-learn库
# bash终端
conda activate sc
# 安装 scikit-learn库
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple scikit-learn
Scikit-learn案例:
# scikit-learn 使用案例:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成样本数据
X, y= make_blobs(n_samples=100, centers=3, random_state=42)
# 使用 KMeans 聚类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
print("Cluster Centers:", kmeans.cluster_centers_)
模块的导入有三种方式:
导入整个模块 使用别名导入 从模块中导入特定函数
import math # 导入整个模块
import math as n # 使用别名导入
from math import sqrt # 从模块中导入特定函数
# 导入包/库的方式
import numpy
import numpy as np
from numpy import sum
7.列表的生成和取子集:01:15:57
列表:可以包含多种数据类型的数据结构,是数据的容器
7.1 列表的创建
用一堆方括号 []
创建列表,每个元素之间使用 , 分隔列表可以宝行多种数据类型
# 创建一个包含整数的列表
numbers = [1,2,3,4,5]
# 创建一个包含字符串的列表
names = ["xiaobai","xiaoxin","nini","fengjian","zhengnan","adai","xiaokui"]
# 创建一个混合数据类型的列表
mixed = [1,"hello",3.14,True]
# 创建一个空列表
empty_list = []
print(numbers)
print(names)
print(mixed)
print(empty_list)
7.2 列表取子集
1、根据索引取子集
索引就是index,即下标,python的索引从0开始 使用方括号 [ ] 从列表中提取子集 使用 负索引 可以从列表的尾部访问,-1 表示最后一个元素
fruits = ["apple", "banana", "cherry", "banana"]
# 访问单个元素
print(fruits[0])
print(fruits[-1])
print(fruits[-2])
print(fruits[-1])
2、通过切片取子集
提取多个元素使用切片,即 :
。在指定范围内,包含起始值,不包含结束值。
使用 start:stop
的形式:取从start
索引到stop-1
索引的元素start
默认从头开始,stop
默认到结尾结束步长step可选,格式为: start:stop:step
冒号隔开的值允许空着: 第一个值空着,表示从0位开始 第二个值空着,表示到最后一位结束 前两个值空着,写第三个值,表示所有元素每隔指定步长去一个数
8.诡异的赋值修改
如果y=x
,对 y
进行了修改,这个修改居然会同步给x
!
在 python 中,变量赋值是通过引用进行的,而不是创建独立的副本。这种机制对于可变对象(如列表,字典,数据框等)非常重要,因为修改其中一个引用会影响其他引用。
解决办法是浅拷贝:y = x.copy()
看完后呢,就跟着操作:
x = ['a', 'b', 'c']
print(x)
y = x.copy
y[1] = '?'
print(y)
然后运行就报错:
TypeError Traceback (most recent call last)
Cell In[32], line 5
2 print(x)
4 y = x.copy
----> 5 y[1] = '?'
6 print(y)
TypeError: 'builtin_function_or_method' object does not support item assignment
问人工智能大模型kimi,你的学习好伙伴:
这个错误是因为你没有正确地调用
copy
方法来创建列表x
的副本。在 Python 中,copy
是一个方法,需要使用括号()
来调用它。如果不使用括号,y
变量将被赋值为copy
方法本身,而不是x
的副本。因此,当你尝试修改y
时,会出现'builtin_function_or_method' object does not support item assignment
的错误。错误代码
x = ['a', 'b', 'c']
print(x)
y = x.copy # 错误:没有调用 copy 方法
y[1] = '?'
print(y)正确代码
x = ['a', 'b', 'c']
print(x)
y = x.copy() # 正确:调用 copy 方法
y[1] = '?'
print(y)解释
错误代码: y = x.copy
这行代码将copy
方法本身赋值给了y
,而不是x
的副本。因此,y
是一个方法对象,而不是一个列表,所以不能对其进行索引和赋值操作。正确代码: y = x.copy()
这行代码正确地调用了copy
方法,创建了x
的一个副本,并将其赋值给y
。因此,y
是一个列表,可以对其进行索引和赋值操作。运行正确代码后的输出将是:
['a', 'b', 'c']
['a', '?', 'c']
嗯,可能这就是我上课给别人讲的,眼睛会了,脑子会了,但是手还没学会,一敲命令就出错!!!
少了一个括号,再来:
x = ['a', 'b', 'c']
print(x)
y = x.copy()
y[1] = '?'
print(y)
这回好了吧!
9.列表的操作
9.1 列表的基本操作
追加元素: append
方法将元素添加到列表末尾插入元素: insert
方法在指定位置插入元素删除元素: remove
按值删除,del
按索引删除
# 追加元素
numbers = [1,2,3]
numbers.append(4)
print(numbers)
# 插入元素
numbers.insert(1,10)
print(numbers)
# 删除指定值的元素
numbers.remove(10)
print(numbers)
# 按索引删除
del numbers[0]
print(numbers)
9.2 列表的计算和操作
列表可以进行加法(连接)和乘法(重复操作) 使用 len()
获取列表长度
# 列表相加
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
# 列表重复
print(a * 2)
# 列表长度
print(len(a))
10.字典的生成和取子集 01:46:12
python不能给列表的元素命名,字典相关于是有元素名字的列表
每个元素是一个键值对,元素之间用逗号 ,
隔开
10.1 字典的创建
键要求独一无二,不能有重复
创建:用一对大括号 { }
创建,并以 键值对的形式存储,键和值用冒号 :
分隔,多个键值对之间用逗号 ,
分隔
# 最基本的方式
# 一个来自北京的25岁的Tom
dict1 = {"name":"Tom", "age":25, "city":"Beijing"}
# dict()函数
dict2 = dict(name='Tom', age=25, city='Beijing')
# dict + zip
# 把键和值分开创建之后zip到一起
keys = ['name', 'age', 'city']
values = ['Tom', 25, 'Beijing']
dict3 = dict(zip(keys, values))
print(dict1)
print(dict2)
print(dict3)
10.2 字典取子集(单个元素)
不能用索引来提取子集 只能用键提取 也可以使用 get()
:提取给定的键对应的值,如果键不存在返回一个默认值(None)
# 用键提取
print(dict1['name'])
# 用get()方法
print(dict1.get('name'))
print(dict1.get('Name'))
print(dict1.get('Name','unknown'))
10.3 提取多个元素
如果需要提取多个元素,可以这样写:
values = [dict1['name'], dict1['age']]
print(values)
但是上面这样操作存在一些问题:
如果键较多,每次手动写容易出错 键名可能不存在时,会抛出KeyError,需要额外处理 难以与其他函数如 sorted()
,map()
灵活配合,显得冗长
解决办法:引入 itemgetter
itermgetter
是python的标准库operator
模块中的一个工具,专门用于高效提取一个或多个键对应的值。
from operator import itemgetter
# 创建提取器
getter = itemgetter('name','age')
person1 = {'name':'xiaoxin', 'age':5, 'city':'chunribu'}
person2 = {'name':'xiaokui', 'age':2, 'city':'chunribu'}
print(getter(person1))
print(getter(person2))
10.4 单独提取字典的键和值
.keys()
方法提取键,.values()
方法提取值,.items()
方法提取所有键值对元素,并一一封装在元组
中
(元组tuple)是带上枷锁的列表,也允许不同的数据类型,区别在于用小括号而非中括号,且不能单独修改元组中的某个值
11.元组
11.1 元组定义
元组是python中的一种不可变数据结构,与列表类似,但有以下区别:
用小括号 ()
定义,如:
tuple1 = (1,2,3)
tuple1
不可修改:元组中的元素无法倍增删改,如:
支持不同数据类型:一个元组中可以存放多种类型的数据
11.2 元组的优势
安全性:不可变,更适合作为键值对或某些数据的封装容器,防止意外修改 效率更高:元组占用内存比列表少,运行速度更快
课后习题
练习 1.1: 识别数据类型
根据以下变量,请判断它们的数据类型:
a = 42
b = 3.14
c = "hello world"
d = [1, 2, 3]
e = {"name": "Alice", "age": 30}
练习 1.2: 方法与属性
列出 str
类型的常用方法并试验upper()
方法。
列出 list
的常用方法,尝试使用append()
添加一个新元素到列表。
练习 2.1: 创建一个模块
在当前目录下创建一个名为 my_math.py
的模块,编写以下代码:
def add(a, b):
return a + b
编写一个主程序文件,导入 my_math
模块,并调用 add
函数。
练习 2.2: 使用现成库
使用 math
模块计算以下数学公式的结果:
圆的面积 ( A = \pi r^2 ) (假设 ( r = 5 ))
平方根 ( \sqrt{16} )
练习 3.1: 创建和访问列表
创建一个包含以下元素的列表,并完成操作:
[10, 20, 30, 40, 50]
取出第一个和最后一个元素。 取出从第二个到第四个元素。
练习 3.2: 列表操作
用 append
方法向列表中添加60
。用 remove
删除30
。将列表倒序输出。
练习 4.1: 创建字典
创建一个描述你最喜欢电影的字典,包含以下键:
title
: 标题year
: 上映年份genre
: 类型
你看出来是什么电影了吗?嘿嘿。
练习 4.2: 提取值
从字典中提取 title
和year
,并打印它们。
练习 4.3: 键与值
使用 .keys()
和.values()
方法分别打印字典的所有键和所有值。
练习 5.1: 结合列表和字典
创建一个包含以下内容的字典列表:
students = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 90},
{"name": "Charlie", "score": 75}
]
提取每位学生的名字。
计算学生的平均分。
练习 5.2: 使用 itemgetter
使用 itemgetter
提取每位学生的 name
和 score
。
练习 6.1: 创建元组
创建一个元组,包含你的名字、年龄、城市。 访问元组中的每个元素,并打印。
练习 6.2: 元组的不可变性
试图修改元组中的一个值,观察会发生什么。
练习 6.3: 元组与效率
用 timeit
模块比较元组和列表的创建速度:
元组速度更快呀!