從基礎(chǔ)到高級(jí)詳解Python與關(guān)系型數(shù)據(jù)庫(kù)交互的完全指南
引言
在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的開(kāi)發(fā)環(huán)境中,與關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行高效交互已成為Python開(kāi)發(fā)者??必備的核心技能??。無(wú)論是Web應(yīng)用、數(shù)據(jù)分析平臺(tái)還是企業(yè)級(jí)系統(tǒng),都需要與MySQL、PostgreSQL、SQLite等關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行無(wú)縫集成。Python憑借其??簡(jiǎn)潔的語(yǔ)法??、??豐富的生態(tài)系統(tǒng)??和??強(qiáng)大的庫(kù)支持??,為數(shù)據(jù)庫(kù)交互提供了多種高效靈活的解決方案。
本文將全面探討Python與關(guān)系型數(shù)據(jù)庫(kù)交互的各種方法和技術(shù),從基礎(chǔ)連接操作到高級(jí)ORM使用,從事務(wù)處理到性能優(yōu)化。無(wú)論您是初學(xué)者還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,本文都將為您提供實(shí)用的代碼示例和最佳實(shí)踐建議,幫助您構(gòu)建更健壯、高效的數(shù)據(jù)庫(kù)應(yīng)用。
關(guān)系型數(shù)據(jù)庫(kù)因其??結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)??、??ACID事務(wù)支持??和??強(qiáng)大的SQL查詢能力??,在數(shù)據(jù)處理領(lǐng)域占據(jù)重要地位。掌握Python與關(guān)系型數(shù)據(jù)庫(kù)的交互技巧,不僅能夠提高應(yīng)用程序的數(shù)據(jù)處理能力,還能為您的職業(yè)發(fā)展增添重要技能。
一、數(shù)據(jù)庫(kù)連接基礎(chǔ)
1.1 選擇適當(dāng)?shù)臄?shù)據(jù)庫(kù)驅(qū)動(dòng)
Python提供了多種數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,用于連接不同類型的關(guān)系型數(shù)據(jù)庫(kù)。根據(jù)目標(biāo)數(shù)據(jù)庫(kù)的不同,需要選擇相應(yīng)的驅(qū)動(dòng)庫(kù):
- ??MySQL??:常用的驅(qū)動(dòng)有
mysql-connector-python和PyMySQL - ??PostgreSQL??:主流選擇是
psycopg2 - ??SQLite??:Python標(biāo)準(zhǔn)庫(kù)內(nèi)置的
sqlite3模塊
安裝這些驅(qū)動(dòng)通常使用pip包管理器:
pip install mysql-connector-python pymysql psycopg2
1.2 建立數(shù)據(jù)庫(kù)連接
建立數(shù)據(jù)庫(kù)連接是與數(shù)據(jù)庫(kù)交互的第一步。以下是連接不同數(shù)據(jù)庫(kù)的示例:
# MySQL連接示例
import mysql.connector
mysql_conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
print("MySQL連接成功!")
# PostgreSQL連接示例
import psycopg2
pg_conn = psycopg2.connect(
host='localhost',
database='your_database',
user='your_username',
password='your_password'
)
print("PostgreSQL連接成功!")
# SQLite連接示例
import sqlite3
sqlite_conn = sqlite3.connect('example.db')
print("SQLite連接成功!")1.3 連接參數(shù)配置與最佳實(shí)踐
為了提高連接的安全性和性能,建議使用配置文件管理數(shù)據(jù)庫(kù)連接參數(shù):
import configparser
import mysql.connector
# 讀取配置文件
config = configparser.ConfigParser()
config.read('db_config.ini')
# 獲取數(shù)據(jù)庫(kù)連接參數(shù)
db_params = {
'host': config['mysql']['host'],
'user': config['mysql']['user'],
'password': config['mysql']['password'],
'database': config['mysql']['database']
}
# 建立連接
try:
conn = mysql.connector.connect(**db_params)
if conn.is_connected():
print("數(shù)據(jù)庫(kù)連接成功!")
except Exception as e:
print(f"連接失敗: {e}")二、執(zhí)行SQL語(yǔ)句與CRUD操作
2.1 使用游標(biāo)執(zhí)行查詢
游標(biāo)(Cursor)是與數(shù)據(jù)庫(kù)交互的核心對(duì)象,用于執(zhí)行SQL語(yǔ)句并獲取結(jié)果。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行簡(jiǎn)單查詢
cursor.execute("SELECT * FROM users")
# 獲取所有結(jié)果
results = cursor.fetchall()
# 遍歷結(jié)果
for row in results:
print(f"ID: {row[0]}, Name: {row[1]}, Email: {row[2]}")
# 關(guān)閉游標(biāo)
cursor.close()2.2 參數(shù)化查詢
為防止SQL注入攻擊,應(yīng)始終使用參數(shù)化查詢:
# 參數(shù)化查詢示例
user_id = 5
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
# 插入數(shù)據(jù)時(shí)的參數(shù)化查詢
new_user = ('John Doe', 'john@example.com', 30)
cursor.execute("INSERT INTO users (name, email, age) VALUES (%s, %s, %s)", new_user)
conn.commit()不同數(shù)據(jù)庫(kù)的參數(shù)占位符有所不同:
| 數(shù)據(jù)庫(kù)類型 | 參數(shù)占位符 |
|---|---|
| MySQL | %s |
| PostgreSQL | %s |
| SQLite | ? |
2.3 完整的CRUD操作示例
下面是一個(gè)完整的CRUD(創(chuàng)建、讀取、更新、刪除)操作示例:
import sqlite3
# 創(chuàng)建連接
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# 創(chuàng)建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER
)
''')
# 插入數(shù)據(jù)
def create_user(name, email, age):
try:
cursor.execute(
"INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
(name, email, age)
)
conn.commit()
print("用戶添加成功!")
except sqlite3.IntegrityError:
print("郵箱已存在!")
# 查詢數(shù)據(jù)
def read_users():
cursor.execute("SELECT * FROM users")
return cursor.fetchall()
# 更新數(shù)據(jù)
def update_user(user_id, name=None, email=None, age=None):
updates = []
params = []
if name:
updates.append("name = ?")
params.append(name)
if email:
updates.append("email = ?")
params.append(email)
if age is not None:
updates.append("age = ?")
params.append(age)
params.append(user_id)
cursor.execute(
f"UPDATE users SET {', '.join(updates)} WHERE id = ?",
params
)
conn.commit()
# 刪除數(shù)據(jù)
def delete_user(user_id):
cursor.execute("DELETE FROM users WHERE id = ?", (user_id,))
conn.commit()
# 使用示例
create_user('Alice', 'alice@example.com', 25)
create_user('Bob', 'bob@example.com', 30)
print("所有用戶:")
users = read_users()
for user in users:
print(user)
update_user(1, age=26)
print("更新后的用戶:")
users = read_users()
for user in users:
print(user)
# 關(guān)閉連接
conn.close()三、使用ORM進(jìn)行高級(jí)數(shù)據(jù)庫(kù)操作
3.1 ORM簡(jiǎn)介與優(yōu)勢(shì)
ORM(Object-Relational Mapping,對(duì)象關(guān)系映射)允許使用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù),無(wú)需編寫(xiě)原生SQL語(yǔ)句。主要優(yōu)勢(shì)包括:
- ??提高開(kāi)發(fā)效率??:減少SQL編寫(xiě)工作量
- ??增強(qiáng)代碼可維護(hù)性??:使用Python類代替SQL語(yǔ)句
- ??提高安全性??:自動(dòng)處理SQL注入防護(hù)
- ??數(shù)據(jù)庫(kù)無(wú)關(guān)性??:輕松切換數(shù)據(jù)庫(kù)后端
3.2 SQLAlchemy基礎(chǔ)
SQLAlchemy是Python中最流行的ORM框架之一,功能強(qiáng)大且靈活。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 定義基類
Base = declarative_base()
# 定義模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(100), unique=True)
age = Column(Integer)
# 創(chuàng)建引擎和會(huì)話
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()
# 創(chuàng)建表
Base.metadata.create_all(engine)
# 插入數(shù)據(jù)
new_user = User(name='Charlie', email='charlie@example.com', age=35)
session.add(new_user)
session.commit()
# 查詢數(shù)據(jù)
users = session.query(User).filter(User.age > 25).all()
for user in users:
print(f"{user.name}: {user.email}")
# 更新數(shù)據(jù)
user = session.query(User).filter_by(name='Charlie').first()
if user:
user.age = 36
session.commit()
# 刪除數(shù)據(jù)
user = session.query(User).filter_by(name='Charlie').first()
if user:
session.delete(user)
session.commit()
# 關(guān)閉會(huì)話
session.close()3.3 高級(jí)查詢技巧
SQLAlchemy提供了豐富的查詢接口,支持復(fù)雜的查詢操作:
from sqlalchemy import or_, and_
# 復(fù)雜查詢示例
users = session.query(User).filter(
or_(
User.age < 25,
User.age > 35
),
User.email.like('%@example.com')
).order_by(User.name.desc()).limit(10).all()
# 聚合查詢
from sqlalchemy import func
age_stats = session.query(
func.count(User.id),
func.avg(User.age),
func.min(User.age),
func.max(User.age)
).first()
# 連接查詢
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
street = Column(String(100))
city = Column(String(50))
user = relationship("User", back_populates="addresses")
User.addresses = relationship("Address", order_by=Address.id, back_populates="user")
# 執(zhí)行連接查詢
users_with_addresses = session.query(User).join(Address).filter(Address.city == 'New York').all()3.4 Django ORM簡(jiǎn)介
對(duì)于Django項(xiàng)目,可以使用其內(nèi)置的ORM系統(tǒng):
# Django模型定義
from django.db import models
class User(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField(unique=True)
age = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
# 使用Django ORM進(jìn)行查詢
from myapp.models import User
# 創(chuàng)建用戶
User.objects.create(name='Alice', email='alice@example.com', age=25)
# 查詢用戶
users = User.objects.filter(age__gt=20).order_by('-created_at')
# 更新用戶
User.objects.filter(email='alice@example.com').update(age=26)
# 刪除用戶
User.objects.filter(email='alice@example.com').delete()四、事務(wù)處理與連接池管理
4.1 事務(wù)管理
事務(wù)是數(shù)據(jù)庫(kù)操作中的重要概念,確保一系列操作要么全部成功,要么全部失敗。
import mysql.connector
from mysql.connector import Error
try:
conn = mysql.connector.connect(
host='localhost',
database='your_database',
user='your_username',
password='your_password'
)
# 開(kāi)啟事務(wù)
conn.start_transaction()
cursor = conn.cursor()
# 執(zhí)行多個(gè)操作
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
# 提交事務(wù)
conn.commit()
print("事務(wù)執(zhí)行成功!")
except Error as e:
# 回滾事務(wù)
conn.rollback()
print(f"事務(wù)執(zhí)行失敗: {e}")
finally:
if conn.is_connected():
cursor.close()
conn.close()4.2 使用連接池
對(duì)于高并發(fā)應(yīng)用,使用連接池可以顯著提高性能:
from mysql.connector import pooling
import threading
# 創(chuàng)建連接池
dbconfig = {
"host": "localhost",
"user": "your_username",
"password": "your_password",
"database": "your_database"
}
connection_pool = pooling.MySQLConnectionPool(
pool_name="my_pool",
pool_size=5,
pool_reset_session=True,
**dbconfig
)
def query_with_pool(user_id):
try:
# 從連接池獲取連接
conn = connection_pool.get_connection()
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
result = cursor.fetchone()
print(f"用戶查詢結(jié)果: {result}")
# 將連接返回給連接池
cursor.close()
conn.close()
except Error as e:
print(f"查詢失敗: {e}")
# 多線程使用連接池示例
threads = []
for i in range(10):
thread = threading.Thread(target=query_with_pool, args=(i % 5 + 1,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()4.3 上下文管理器與連接管理
使用上下文管理器可以更安全地管理數(shù)據(jù)庫(kù)連接:
from contextlib import contextmanager
@contextmanager
def get_db_connection():
conn = None
try:
conn = connection_pool.get_connection()
yield conn
except Error as e:
print(f"數(shù)據(jù)庫(kù)錯(cuò)誤: {e}")
if conn:
conn.rollback()
raise
finally:
if conn:
conn.close()
@contextmanager
def get_db_cursor():
with get_db_connection() as conn:
cursor = conn.cursor()
try:
yield cursor
conn.commit()
except:
conn.rollback()
raise
finally:
cursor.close()
# 使用上下文管理器
with get_db_cursor() as cursor:
cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)",
("John", "john@example.com"))
print("數(shù)據(jù)插入成功!")五、性能優(yōu)化與最佳實(shí)踐
5.1 查詢優(yōu)化技巧
優(yōu)化數(shù)據(jù)庫(kù)查詢可以顯著提高應(yīng)用程序性能:
- ??使用索引??:為經(jīng)常查詢的列創(chuàng)建索引
- ??限制返回?cái)?shù)據(jù)??:只獲取需要的列和行
- ??使用連接代替子查詢??:連接通常比子查詢更高效
- ??批量操作??:批量插入和更新數(shù)據(jù)
# 批量插入示例
def bulk_insert_users(users_data):
try:
cursor = conn.cursor()
# 批量插入
cursor.executemany(
"INSERT INTO users (name, email, age) VALUES (%s, %s, %s)",
users_data
)
conn.commit()
print(f"成功插入 {len(users_data)} 條記錄")
except Error as e:
conn.rollback()
print(f"批量插入失敗: {e}")
# 使用示例
users_data = [
('User1', 'user1@example.com', 25),
('User2', 'user2@example.com', 30),
('User3', 'user3@example.com', 35)
]
bulk_insert_users(users_data)5.2 連接管理最佳實(shí)踐
正確的連接管理對(duì)應(yīng)用性能至關(guān)重要:
# 數(shù)據(jù)庫(kù)工具類示例
class DatabaseManager:
def __init__(self, **config):
self.config = config
self.connection_pool = None
def create_pool(self, pool_size=5):
try:
self.connection_pool = pooling.MySQLConnectionPool(
pool_name="app_pool",
pool_size=pool_size,
**self.config
)
print("連接池創(chuàng)建成功!")
except Error as e:
print(f"連接池創(chuàng)建失敗: {e}")
raise
@contextmanager
def get_connection(self):
if not self.connection_pool:
self.create_pool()
conn = None
try:
conn = self.connection_pool.get_connection()
yield conn
finally:
if conn:
conn.close()
@contextmanager
def get_cursor(self, dictionary=False):
with self.get_connection() as conn:
cursor = conn.cursor(dictionary=dictionary)
try:
yield cursor
conn.commit()
except:
conn.rollback()
raise
finally:
cursor.close()
def execute_query(self, query, params=None):
with self.get_cursor() as cursor:
cursor.execute(query, params or ())
return cursor.fetchall()
def execute_command(self, query, params=None):
with self.get_cursor() as cursor:
cursor.execute(query, params or ())
return cursor.rowcount
# 使用示例
db_config = {
"host": "localhost",
"user": "your_username",
"password": "your_password",
"database": "your_database"
}
db_manager = DatabaseManager(**db_config)
# 執(zhí)行查詢
users = db_manager.execute_query("SELECT * FROM users WHERE age > %s", (25,))
for user in users:
print(user)
# 執(zhí)行命令
row_count = db_manager.execute_command(
"UPDATE users SET age = %s WHERE id = %s",
(26, 1)
)
print(f"更新了 {row_count} 行數(shù)據(jù)")5.3 監(jiān)控與診斷
監(jiān)控?cái)?shù)據(jù)庫(kù)性能是優(yōu)化的重要部分:
import time
from functools import wraps
def query_logger(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"查詢執(zhí)行時(shí)間: {end_time - start_time:.4f}秒")
return result
return wrapper
# 使用裝飾器記錄查詢時(shí)間
class MonitoredDatabaseManager(DatabaseManager):
@query_logger
def execute_query(self, query, params=None):
return super().execute_query(query, params)
@query_logger
def execute_command(self, query, params=None):
return super().execute_command(query, params)
# 使用監(jiān)控版數(shù)據(jù)庫(kù)管理器
monitored_db = MonitoredDatabaseManager(**db_config)
users = monitored_db.execute_query("SELECT * FROM users WHERE age > %s", (25,))總結(jié)
Python與關(guān)系型數(shù)據(jù)庫(kù)的交互是現(xiàn)代應(yīng)用開(kāi)發(fā)的核心技能。本文全面介紹了從基礎(chǔ)連接到高級(jí)ORM使用的各種技術(shù),涵蓋了MySQL、PostgreSQL和SQLite等主流關(guān)系型數(shù)據(jù)庫(kù)。
關(guān)鍵要點(diǎn)回顧
- ??數(shù)據(jù)庫(kù)連接是基礎(chǔ)??:正確管理數(shù)據(jù)庫(kù)連接和連接池對(duì)應(yīng)用性能至關(guān)重要
- ??安全第一??:始終使用參數(shù)化查詢防止SQL注入攻擊
- ??ORM提高效率??:使用SQLAlchemy等ORM工具可以顯著提高開(kāi)發(fā)效率和代碼質(zhì)量
- ??事務(wù)保證一致性??:合理使用事務(wù)確保數(shù)據(jù)一致性
- ??性能優(yōu)化無(wú)止境??:通過(guò)索引、查詢優(yōu)化和連接管理持續(xù)提升應(yīng)用性能
實(shí)踐建議
- 對(duì)于??簡(jiǎn)單項(xiàng)目??或??性能敏感型應(yīng)用??,可以考慮使用原生數(shù)據(jù)庫(kù)驅(qū)動(dòng)
- 對(duì)于??復(fù)雜業(yè)務(wù)邏輯??和??大型項(xiàng)目??,推薦使用ORM工具提高開(kāi)發(fā)效率
- 始終在生產(chǎn)環(huán)境中使用??連接池??和??適當(dāng)?shù)某瑫r(shí)設(shè)置??
- 定期??監(jiān)控和優(yōu)化??數(shù)據(jù)庫(kù)查詢性能
進(jìn)一步學(xué)習(xí)
要深入了解Python與數(shù)據(jù)庫(kù)交互的高級(jí)主題,可以探索以下方向:
- ??異步數(shù)據(jù)庫(kù)訪問(wèn)??:使用aiomysql、asyncpg等庫(kù)進(jìn)行異步數(shù)據(jù)庫(kù)操作
- ??數(shù)據(jù)庫(kù)遷移工具??:學(xué)習(xí)Alembic等數(shù)據(jù)庫(kù)遷移工具的使用
- ??高級(jí)ORM特性??:深入研究SQLAlchemy的高級(jí)特性和優(yōu)化技巧
- ??分布式數(shù)據(jù)庫(kù)??:了解如何與分布式數(shù)據(jù)庫(kù)系統(tǒng)交互
- ??數(shù)據(jù)緩存策略??:學(xué)習(xí)如何合理使用緩存減少數(shù)據(jù)庫(kù)壓力
通過(guò)掌握這些技能,您將能夠構(gòu)建高效、可靠的數(shù)據(jù)驅(qū)動(dòng)應(yīng)用,滿足現(xiàn)代軟件開(kāi)發(fā)的需求。
到此這篇關(guān)于從基礎(chǔ)到高級(jí)詳解Python與關(guān)系型數(shù)據(jù)庫(kù)交互的完全指南的文章就介紹到這了,更多相關(guān)Python與數(shù)據(jù)庫(kù)交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Python進(jìn)行數(shù)據(jù)庫(kù)交互的實(shí)踐指南(從SQL查詢到ORM操作)
- Python?SQLAlchemy與數(shù)據(jù)庫(kù)交互操作完整指南
- Python與數(shù)據(jù)庫(kù)交互:入門(mén)指南
- Python與數(shù)據(jù)庫(kù)的交互問(wèn)題小結(jié)
- python與mysql數(shù)據(jù)庫(kù)交互的實(shí)現(xiàn)
- Python3開(kāi)發(fā)實(shí)例之非關(guān)系型圖數(shù)據(jù)庫(kù)Neo4j安裝方法及Python3連接操作Neo4j方法實(shí)例
相關(guān)文章
Python驗(yàn)證碼截取識(shí)別代碼實(shí)例
這篇文章主要介紹了Python驗(yàn)證碼截取識(shí)別代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
python實(shí)現(xiàn)字符串中字符分類及個(gè)數(shù)統(tǒng)計(jì)
這篇文章主要介紹了python實(shí)現(xiàn)字符串中字符分類及個(gè)數(shù)統(tǒng)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
以視頻爬取實(shí)例講解Python爬蟲(chóng)神器Beautiful Soup用法
這篇文章主要以視頻爬取實(shí)例來(lái)講解Python爬蟲(chóng)神器Beautiful Soup的用法,Beautiful Soup是一個(gè)為Python獲取數(shù)據(jù)而設(shè)計(jì)的包,簡(jiǎn)潔而強(qiáng)大,需要的朋友可以參考下2016-01-01
python3.7中安裝paddleocr及paddlepaddle包的多種方法
這篇文章主要介紹了python3.7中安裝paddleocr及paddlepaddle包,本文通過(guò)多種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Python?Excel數(shù)據(jù)處理之xlrd/xlwt/xlutils模塊詳解
在復(fù)雜的Excel業(yè)務(wù)數(shù)據(jù)處理中,三兄弟扮演的角色缺一不可。如何能夠使用xlrd/xlwt/xlutils三個(gè)模塊來(lái)實(shí)現(xiàn)數(shù)據(jù)處理就是今天的內(nèi)容,希望對(duì)大家有所幫助2023-03-03
Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)
本文分享的是Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù),我們?cè)赑ython中使用lambda表達(dá)式來(lái)使用匿名函數(shù),回調(diào)函數(shù)即callback,先寫(xiě)一個(gè)函數(shù),讓預(yù)先寫(xiě)好的系統(tǒng)來(lái)調(diào)用,一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù),滿足其一則為高階函數(shù)2021-12-12
用scikit-learn和pandas學(xué)習(xí)線性回歸的方法
這篇文章主要介紹了用scikit-learn和pandas學(xué)習(xí)線性回歸的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

