python单细胞学习笔记-day3

学术   2025-01-11 15:46   广东  

python单细胞学习笔记-day1

python单细胞学习笔记-day2

书接上回,学习到了库

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()

拓展阅读👉https://mp.weixin.qq.com/s/zk7gPq-kR24FkJl8nLQzjA

看完后呢,就跟着操作:

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 = [123]
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: 创建和访问列表

创建一个包含以下元素的列表,并完成操作:

[1020304050]
  • 取出第一个和最后一个元素。
  • 取出从第二个到第四个元素。

练习 3.2: 列表操作

  • append 方法向列表中添加 60
  • remove 删除 30
  • 将列表倒序输出。

练习 4.1: 创建字典

创建一个描述你最喜欢电影的字典,包含以下键:

  • title: 标题
  • year: 上映年份
  • genre: 类型

你看出来是什么电影了吗?嘿嘿。

练习 4.2: 提取值

  • 从字典中提取 titleyear,并打印它们。

练习 4.3: 键与值

  • 使用 .keys().values() 方法分别打印字典的所有键和所有值。

练习 5.1: 结合列表和字典

  • 创建一个包含以下内容的字典列表:
students = [
    {"name""Alice""score"85},
    {"name""Bob""score"90},
    {"name""Charlie""score"75}
]
  • 提取每位学生的名字。
  • 计算学生的平均分。

练习 5.2: 使用 itemgetter

使用 itemgetter 提取每位学生的 namescore

练习 6.1: 创建元组

  • 创建一个元组,包含你的名字、年龄、城市。
  • 访问元组中的每个元素,并打印。

练习 6.2: 元组的不可变性

  • 试图修改元组中的一个值,观察会发生什么。

练习 6.3: 元组与效率

  • timeit 模块比较元组和列表的创建速度:

元组速度更快呀!


生信技能树
生物信息学学习资料分析,常见数据格式及公共数据库资料分享。常见分析软件及流程,基因检测及癌症相关动态。
 最新文章