Python IndexError索引超出范圍異常的原因及解決方法
引言
在Python編程的世界中,IndexError是一個非常常見且容易遇到的異常類型。它通常發(fā)生在我們試圖訪問序列(如列表、元組、字符串等)中不存在的位置時。理解這個異常的本質(zhì)和處理方法,對于每一位Python開發(fā)者來說都是至關(guān)重要的。
什么是IndexError?
IndexError是Python內(nèi)置的一個異常類,繼承自LookupError,而LookupError又繼承自Exception。當(dāng)我們在嘗試通過索引訪問序列中的元素時,如果提供的索引超出了該序列的有效范圍,Python就會拋出IndexError異常。
讓我們先來看一個簡單的例子:
# 創(chuàng)建一個包含5個元素的列表
my_list = [10, 20, 30, 40, 50]
# 正常訪問
print(my_list[0]) # 輸出: 10
print(my_list[4]) # 輸出: 50
# 嘗試訪問超出范圍的索引
try:
print(my_list[5]) # 這會引發(fā)IndexError
except IndexError as e:
print(f"發(fā)生IndexError: {e}")
在這個例子中,列表my_list有5個元素,有效索引范圍是從0到4。當(dāng)我們嘗試訪問索引5時,就觸發(fā)了IndexError異常。
常見的IndexError場景
列表索引越界
這是最常見的情況之一。當(dāng)我們對列表進(jìn)行操作時,很容易因?yàn)橛?jì)算錯誤或者邊界條件判斷不當(dāng)而導(dǎo)致索引越界。
# 示例1:基本的列表索引越界
numbers = [1, 2, 3, 4, 5]
print(f"列表長度: {len(numbers)}")
# 正確的訪問方式
for i in range(len(numbers)):
print(f"numbers[{i}] = {numbers[i]}")
# 錯誤的訪問方式 - 會導(dǎo)致IndexError
try:
print(numbers[10])
except IndexError as e:
print(f"? Index Error: {e}")
# 更危險(xiǎn)的例子 - 在循環(huán)中使用錯誤的索引
try:
for i in range(len(numbers) + 2): # 多循環(huán)2次
print(f"嘗試訪問 numbers[{i}]: {numbers[i]}")
except IndexError as e:
print(f"? 循環(huán)中發(fā)生IndexError: {e}")
字符串索引越界
字符串本質(zhì)上也是一種序列,在對其進(jìn)行索引操作時同樣可能遇到IndexError。
# 字符串索引越界示例
text = "Hello World"
print(f"字符串長度: {len(text)}")
# 正常訪問
print(f"第一個字符: {text[0]}") # H
print(f"最后一個字符: {text[-1]}") # d
# 異常訪問
try:
print(text[20])
except IndexError as e:
print(f"? 字符串索引越界: {e}")
# 負(fù)索引越界
try:
print(text[-20])
except IndexError as e:
print(f"? 負(fù)索引越界: {e}")
元組索引越界
元組與列表類似,也是有序的不可變序列,同樣存在索引越界的問題。
# 元組索引越界示例
coordinates = (10, 20, 30)
print(f"元組長度: {len(coordinates)}")
# 正常訪問
print(f"第一個坐標(biāo): {coordinates[0]}")
# 異常訪問
try:
print(coordinates[5])
except IndexError as e:
print(f"? 元組索引越界: {e}")
多維列表(嵌套列表)索引越界
在處理多維數(shù)據(jù)結(jié)構(gòu)時,索引越界問題變得更加復(fù)雜,需要特別小心。
# 多維列表索引越界示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print("矩陣內(nèi)容:")
for row in matrix:
print(row)
# 正常訪問
print(f"matrix[0][0] = {matrix[0][0]}")
print(f"matrix[2][2] = {matrix[2][2]}")
# 第一層索引越界
try:
print(matrix[5][0])
except IndexError as e:
print(f"? 第一層索引越界: {e}")
# 第二層索引越界
try:
print(matrix[0][10])
except IndexError as e:
print(f"? 第二層索引越界: {e}")
# 兩個維度都越界
try:
print(matrix[10][10])
except IndexError as e:
print(f"? 雙重索引越界: {e}")
IndexError產(chǎn)生的根本原因
為了更好地理解和預(yù)防IndexError,我們需要深入了解其產(chǎn)生的根本原因。
索引從0開始計(jì)數(shù)
Python中所有序列的索引都是從0開始的,這是很多初學(xué)者容易犯錯的地方。
# 索引從0開始的重要性
fruits = ["蘋果", "香蕉", "橙子", "葡萄"]
print(f"列表長度: {len(fruits)}")
print(f"有效索引范圍: 0 到 {len(fruits)-1}")
# 正確的方式
for i in range(len(fruits)):
print(f"索引 {i}: {fruits[i]}")
# 常見錯誤 - 認(rèn)為索引從1開始
print("\n? 常見錯誤示例:")
try:
for i in range(1, len(fruits)+1):
print(f"錯誤的索引 {i}: {fruits[i]}")
except IndexError as e:
print(f"發(fā)生IndexError: {e}")
負(fù)索引的理解
Python支持負(fù)索引,-1表示最后一個元素,-2表示倒數(shù)第二個元素,以此類推。但負(fù)索引也有其限制。
# 負(fù)索引示例
data = [10, 20, 30, 40, 50]
print(f"列表: {data}")
print(f"長度: {len(data)}")
# 正索引訪問
print("正索引訪問:")
for i in range(len(data)):
print(f"data[{i}] = {data[i]}")
# 負(fù)索引訪問
print("\n負(fù)索引訪問:")
for i in range(-1, -len(data)-1, -1):
print(f"data[{i}] = {data[i]}")
# 負(fù)索引越界
try:
print(data[-10])
except IndexError as e:
print(f"? 負(fù)索引越界: {e}")
動態(tài)數(shù)據(jù)結(jié)構(gòu)的變化
在程序執(zhí)行過程中,數(shù)據(jù)結(jié)構(gòu)可能會發(fā)生變化,這可能導(dǎo)致之前計(jì)算好的索引變得無效。
# 動態(tài)變化導(dǎo)致的索引問題
items = [1, 2, 3, 4, 5]
print(f"初始列表: {items}")
# 存儲一個索引值
stored_index = len(items) - 1
print(f"存儲的索引: {stored_index}")
# 修改列表 - 刪除元素
items.pop()
print(f"刪除元素后: {items}")
# 使用之前存儲的索引可能出錯
try:
print(f"嘗試訪問 items[{stored_index}]: {items[stored_index]}")
except IndexError as e:
print(f"? Index Error: {e}")
print("索引已失效!")
預(yù)防IndexError的最佳實(shí)踐
預(yù)防勝于治療,在編寫代碼時采取一些預(yù)防措施可以有效避免IndexError的發(fā)生。
邊界檢查
在訪問序列元素之前,先檢查索引是否在有效范圍內(nèi)。
def safe_access(sequence, index):
"""安全訪問序列元素"""
if 0 <= index < len(sequence):
return sequence[index]
else:
return None
# 測試安全訪問函數(shù)
test_list = [10, 20, 30, 40, 50]
print(f"列表: {test_list}")
# 安全訪問各種索引
indices_to_test = [0, 2, 4, 5, -1, -6, 10]
for idx in indices_to_test:
result = safe_access(test_list, idx)
if result is not None:
print(f"? 索引 {idx}: {result}")
else:
print(f"? 索引 {idx}: 超出范圍")
使用enumerate()函數(shù)
在遍歷序列時,使用enumerate()函數(shù)可以獲得元素及其索引,避免手動計(jì)算索引。
# 使用enumerate避免索引錯誤
colors = ["紅色", "綠色", "藍(lán)色", "黃色", "紫色"]
print("使用傳統(tǒng)for循環(huán):")
for i in range(len(colors)):
print(f"{i}: {colors[i]}")
print("\n使用enumerate:")
for index, color in enumerate(colors):
print(f"{index}: {color}")
# enumerate還支持指定起始索引
print("\n指定起始索引為1:")
for index, color in enumerate(colors, 1):
print(f"{index}: {color}")
利用切片操作的安全性
Python的切片操作具有很好的容錯性,不會因?yàn)樗饕浇缍鴴伋霎惓!?/p>
# 切片操作的安全性
data = [1, 2, 3, 4, 5]
print(f"原始數(shù)據(jù): {data}")
# 普通索引訪問可能會出錯
try:
print(data[10])
except IndexError as e:
print(f"? 直接索引訪問失敗: {e}")
# 切片訪問更加安全
print(f"安全的切片訪問 data[10:]: {data[10:]}")
print(f"安全的切片訪問 data[:10]: {data[:10]}")
# 實(shí)際應(yīng)用示例
def get_first_n_elements(lst, n):
"""獲取列表的前n個元素,即使n大于列表長度也不會出錯"""
return lst[:n]
test_data = [1, 2, 3]
print(f"測試數(shù)據(jù): {test_data}")
print(f"獲取前5個元素: {get_first_n_elements(test_data, 5)}")
使用try-except處理異常
雖然預(yù)防是最好的策略,但在某些情況下,使用異常處理機(jī)制也是必要的。
# 異常處理示例
def access_element_safely(sequence, index):
"""安全訪問元素并返回結(jié)果"""
try:
return sequence[index]
except IndexError:
return f"索引 {index} 超出范圍 [0, {len(sequence)-1}]"
# 測試異常處理
sample_list = ['a', 'b', 'c', 'd']
test_indices = [0, 2, 4, -1, -5]
for idx in test_indices:
result = access_element_safely(sample_list, idx)
print(f"訪問索引 {idx}: {result}")
處理IndexError的高級技巧
除了基本的預(yù)防和處理方法,還有一些更高級的技巧可以幫助我們更好地應(yīng)對IndexError。
自定義安全訪問類
我們可以創(chuàng)建一個包裝類來提供更安全的序列訪問接口。
class SafeList:
"""提供安全訪問功能的列表包裝類"""
def __init__(self, data=None):
self.data = data or []
def __getitem__(self, index):
"""重寫索引訪問操作"""
try:
return self.data[index]
except IndexError:
return None
def __setitem__(self, index, value):
"""重寫索引賦值操作"""
# 擴(kuò)展列表以適應(yīng)新的索引
if index >= len(self.data):
self.data.extend([None] * (index - len(self.data) + 1))
self.data[index] = value
def __len__(self):
return len(self.data)
def __str__(self):
return str(self.data)
def safe_get(self, index, default=None):
"""安全獲取元素,支持默認(rèn)值"""
try:
return self.data[index]
except IndexError:
return default
# 使用SafeList
safe_list = SafeList([1, 2, 3, 4, 5])
print(f"安全列表: {safe_list}")
# 安全訪問
print(f"索引 2: {safe_list[2]}")
print(f"索引 10: {safe_list[10]}") # 不會拋出異常
# 使用默認(rèn)值
print(f"索引 10 的默認(rèn)值: {safe_list.safe_get(10, '未找到')}")
# 安全賦值
safe_list[10] = "新值"
print(f"擴(kuò)展后的列表: {safe_list}")
使用裝飾器進(jìn)行自動邊界檢查
我們可以創(chuàng)建裝飾器來自動為函數(shù)添加邊界檢查功能。
from functools import wraps
def bounds_check(func):
"""邊界檢查裝飾器"""
@wraps(func)
def wrapper(sequence, index, *args, **kwargs):
if not (0 <= index < len(sequence)):
raise IndexError(f"索引 {index} 超出范圍 [0, {len(sequence)-1}]")
return func(sequence, index, *args, **kwargs)
return wrapper
@bounds_check
def get_element(sequence, index):
"""獲取序列元素"""
return sequence[index]
@bounds_check
def set_element(sequence, index, value):
"""設(shè)置序列元素"""
sequence[index] = value
# 測試裝飾器
test_data = [10, 20, 30]
print(f"測試數(shù)據(jù): {test_data}")
# 正常訪問
print(f"get_element(test_data, 1): {get_element(test_data, 1)}")
# 異常訪問
try:
get_element(test_data, 5)
except IndexError as e:
print(f"? {e}")
使用itertools.islice進(jìn)行安全切片
對于大型序列或迭代器,使用itertools.islice可以提供更好的性能和安全性。
import itertools
# 使用islice進(jìn)行安全切片
def safe_slice(iterable, start, stop=None, step=1):
"""安全切片函數(shù)"""
try:
if stop is None:
return list(itertools.islice(iterable, start, start+1))
else:
return list(itertools.islice(iterable, start, stop, step))
except Exception as e:
print(f"切片操作出錯: {e}")
return []
# 測試安全切片
large_range = range(100)
print(f"大范圍的前10個元素: {safe_slice(large_range, 0, 10)}")
print(f"超出范圍的切片: {safe_slice(large_range, 95, 110)}")
實(shí)際應(yīng)用場景分析
讓我們通過一些實(shí)際的應(yīng)用場景來深入理解IndexError的處理方法。
數(shù)據(jù)處理中的索引問題
在數(shù)據(jù)處理過程中,經(jīng)常需要訪問特定位置的數(shù)據(jù),這時IndexError的處理尤為重要。
def process_csv_row(row_data, column_names):
"""處理CSV行數(shù)據(jù)"""
result = {}
for i, column_name in enumerate(column_names):
try:
result[column_name] = row_data[i]
except IndexError:
result[column_name] = None # 或者使用默認(rèn)值
return result
# 模擬CSV數(shù)據(jù)處理
csv_headers = ["姓名", "年齡", "城市", "職業(yè)", "薪資"]
csv_rows = [
["張三", "25", "北京"],
["李四", "30", "上海", "工程師"],
["王五", "28", "廣州", "設(shè)計(jì)師", "15000"]
]
print("CSV數(shù)據(jù)處理結(jié)果:")
for row in csv_rows:
processed = process_csv_row(row, csv_headers)
print(processed)
配置文件解析中的索引處理
在解析配置文件時,經(jīng)常會遇到不完整的數(shù)據(jù)行,需要妥善處理IndexError。
def parse_config_line(line, expected_parts=3):
"""解析配置文件行"""
parts = line.strip().split('=')
config_item = {
'key': None,
'value': None,
'comment': None
}
try:
config_item['key'] = parts[0].strip()
config_item['value'] = parts[1].strip()
if len(parts) > 2:
config_item['comment'] = parts[2].strip()
except IndexError:
pass # 忽略不完整的配置項(xiàng)
return config_item
# 測試配置文件解析
config_lines = [
"database.host=localhost",
"database.port=5432=# 數(shù)據(jù)庫端口",
"database.user=admin=# 用戶名",
"invalid_line", # 不完整的行
"another.invalid=format=with=extra=equals"
]
print("配置文件解析結(jié)果:")
for line in config_lines:
parsed = parse_config_line(line)
print(f"'{line}' -> {parsed}")
網(wǎng)絡(luò)數(shù)據(jù)解析中的邊界處理
在網(wǎng)絡(luò)編程中,接收的數(shù)據(jù)可能存在格式問題,需要謹(jǐn)慎處理索引訪問。
def parse_http_header(header_line):
"""解析HTTP頭部行"""
if ':' not in header_line:
return None
parts = header_line.split(':', 1) # 只分割一次
if len(parts) != 2:
return None
return {
'name': parts[0].strip(),
'value': parts[1].strip()
}
def parse_http_request(request_data):
"""解析HTTP請求"""
lines = request_data.strip().split('\n')
if not lines:
return None
# 解析請求行
request_line = lines[0].split()
if len(request_line) < 3:
return None
result = {
'method': request_line[0],
'path': request_line[1],
'version': request_line[2],
'headers': {},
'body': ''
}
# 解析頭部
header_start = 1
for i in range(header_start, len(lines)):
if lines[i].strip() == '':
# 空行分隔頭部和主體
result['body'] = '\n'.join(lines[i+1:])
break
header = parse_http_header(lines[i])
if header:
result['headers'][header['name']] = header['value']
return result
# 測試HTTP請求解析
http_request = """GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
{"page": 1, "limit": 10}"""
parsed_request = parse_http_request(http_request)
if parsed_request:
print("解析的HTTP請求:")
print(f"方法: {parsed_request['method']}")
print(f"路徑: {parsed_request['path']}")
print(f"版本: {parsed_request['version']}")
print("頭部:")
for name, value in parsed_request['headers'].items():
print(f" {name}: {value}")
print(f"主體: {parsed_request['body']}")
性能考慮和優(yōu)化
在處理大量數(shù)據(jù)時,頻繁的索引檢查可能會影響性能。我們需要在安全性和性能之間找到平衡。
import time
import random
def benchmark_index_access():
"""比較不同的索引訪問方法的性能"""
# 創(chuàng)建測試數(shù)據(jù)
test_data = list(range(100000))
indices = [random.randint(0, len(test_data)-1) for _ in range(10000)]
# 方法1: 直接訪問(假設(shè)索引總是有效的)
def direct_access():
results = []
for idx in indices:
results.append(test_data[idx])
return results
# 方法2: 預(yù)先檢查邊界
def check_bounds_first():
results = []
for idx in indices:
if 0 <= idx < len(test_data):
results.append(test_data[idx])
return results
# 方法3: 使用異常處理
def use_exception_handling():
results = []
for idx in indices:
try:
results.append(test_data[idx])
except IndexError:
pass
return results
# 性能測試
methods = [
("直接訪問", direct_access),
("預(yù)先檢查邊界", check_bounds_first),
("異常處理", use_exception_handling)
]
print("性能基準(zhǔn)測試結(jié)果:")
for name, method in methods:
start_time = time.time()
result = method()
end_time = time.time()
print(f"{name}: {end_time - start_time:.4f} 秒, 結(jié)果數(shù)量: {len(result)}")
# 運(yùn)行性能測試
benchmark_index_access()
調(diào)試和日志記錄
良好的調(diào)試和日志記錄習(xí)慣可以幫助我們更快地發(fā)現(xiàn)和解決IndexError問題。
import logging
# 配置日志
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def debug_safe_access(sequence, index, context=""):
"""帶調(diào)試信息的安全訪問函數(shù)"""
logger.debug(f"嘗試訪問序列 (長度: {len(sequence)}) 中的索引 {index} {context}")
if not isinstance(sequence, (list, tuple, str)):
logger.warning(f"傳入的不是序列類型: {type(sequence)}")
return None
if not isinstance(index, int):
logger.warning(f"索引不是整數(shù)類型: {type(index)}")
return None
if len(sequence) == 0:
logger.warning("嘗試訪問空序列")
return None
if index < 0:
effective_index = len(sequence) + index
logger.debug(f"負(fù)索引 {index} 對應(yīng)正索引 {effective_index}")
if 0 <= index < len(sequence):
result = sequence[index]
logger.debug(f"成功訪問索引 {index}, 值: {result}")
return result
else:
valid_range = f"[0, {len(sequence)-1}]" if len(sequence) > 0 else "[]"
error_msg = f"索引 {index} 超出有效范圍 {valid_range}"
logger.error(error_msg)
return None
# 測試調(diào)試功能
test_sequence = [10, 20, 30, 40, 50]
logger.info("開始調(diào)試測試")
# 正常訪問
debug_safe_access(test_sequence, 2, "正常情況")
# 越界訪問
debug_safe_access(test_sequence, 10, "越界情況")
# 負(fù)索引訪問
debug_safe_access(test_sequence, -1, "負(fù)索引情況")
# 錯誤類型訪問
debug_safe_access(test_sequence, "invalid", "錯誤類型")
debug_safe_access([], 0, "空序列")
最佳實(shí)踐總結(jié)
通過前面的討論,我們可以總結(jié)出處理IndexError的最佳實(shí)踐:
渲染錯誤: Mermaid 渲染失敗: Parse error on line 8: ...] B --> B2[使用len()函數(shù)] C --> ----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'
核心原則
- 預(yù)防為主: 在訪問序列元素前,始終檢查索引的有效性
- 使用內(nèi)置安全特性: 充分利用Python提供的安全訪問方法
- 優(yōu)雅降級: 當(dāng)索引無效時,提供合理的默認(rèn)行為而不是讓程序崩潰
- 詳細(xì)日志: 記錄足夠的調(diào)試信息以便快速定位問題
推薦的代碼模式
# 模式1: 簡單的邊界檢查
def safe_get_item(sequence, index, default=None):
"""安全獲取序列元素"""
return sequence[index] if 0 <= index < len(sequence) else default
# 模式2: 使用切片的安全訪問
def safe_get_items(sequence, start, end=None):
"""安全獲取多個元素"""
return sequence[start:end] # 切片天然安全
# 模式3: 帶異常處理的訪問
def robust_get_item(sequence, index):
"""健壯的元素獲取"""
try:
return sequence[index]
except IndexError:
logger.warning(f"索引 {index} 超出范圍")
return None
except TypeError as e:
logger.error(f"類型錯誤: {e}")
return None
# 模式4: 面向?qū)ο蟮陌踩L問
class SafeSequence:
def __init__(self, data):
self._data = list(data) if data else []
def get(self, index, default=None):
"""安全獲取元素"""
try:
return self._data[index]
except IndexError:
return default
def set(self, index, value):
"""安全設(shè)置元素"""
if index >= len(self._data):
self._data.extend([None] * (index - len(self._data) + 1))
self._data[index] = value
結(jié)語
IndexError雖然是Python中最常見的異常之一,但通過正確的預(yù)防措施和處理方法,我們可以有效地避免它對程序穩(wěn)定性的影響。關(guān)鍵在于:
- 理解索引的工作原理 - 知道索引從0開始,以及負(fù)索引的含義
- 養(yǎng)成良好的編程習(xí)慣 - 在訪問序列元素前進(jìn)行邊界檢查
- 使用Python的安全特性 - 利用切片、enumerate等內(nèi)置安全方法
- 建立完善的異常處理機(jī)制 - 為不可避免的異常情況準(zhǔn)備應(yīng)對方案
記住,優(yōu)秀的程序員不是從不犯錯的人,而是能夠預(yù)見問題并妥善處理它們的人。掌握IndexError的處理技巧,將讓你的Python代碼更加健壯和可靠。
在日常開發(fā)中,建議將這些最佳實(shí)踐融入到你的編碼習(xí)慣中,通過不斷的練習(xí)和應(yīng)用,你將能夠更加自信地處理各種索引相關(guān)的挑戰(zhàn)。
以上就是Python IndexError索引超出范圍異常的原因及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Python IndexError索引超出范圍異常的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解windows python3.7安裝numpy問題的解決方法
這篇文章主要介紹了windows python3.7安裝numpy問題的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
python 專題九 Mysql數(shù)據(jù)庫編程基礎(chǔ)知識
在Python網(wǎng)絡(luò)爬蟲中,通常是通過TXT純文本方式存儲,其實(shí)也是可以存儲在數(shù)據(jù)庫中的;同時在WAMP(Windows、Apache、MySQL、PHP或Python)開發(fā)網(wǎng)站中,也可以通過Python構(gòu)建網(wǎng)頁的,所以這篇文章主要講述Python調(diào)用MySQL數(shù)據(jù)庫相關(guān)編程知識2017-03-03
深入理解Python虛擬機(jī)中魔術(shù)方法的使用
這篇文章主要給大家介紹在?cpython?當(dāng)中一些比較花里胡哨的魔術(shù)方法,以幫助我們自己實(shí)現(xiàn)比較花哨的功能,當(dāng)然這其中也包含一些也非常實(shí)用的魔術(shù)方法,需要的可以參考下2023-05-05
PyInstaller將Python項(xiàng)目打包為exe的踩坑記錄
在python開發(fā)中,將一個能順暢運(yùn)行的項(xiàng)目打包成獨(dú)立的可執(zhí)行文件是交付給用戶的關(guān)鍵一步,PyInstaller 無疑是這個領(lǐng)域的王者,下面小編就來和大家詳細(xì)介紹一下吧2025-08-08
python實(shí)現(xiàn)獲取所有可用攝像頭(id+名稱)可用于opencv
本文介紹了PyCameraListProject,這是一個用于解決OpenCV庫中VideoCapture調(diào)用攝像頭時無法直接通過名稱選擇攝像頭問題的庫,它支持Python?3.6至3.10的64位Windows版本,并提供測試代碼2026-01-01
python中的十大%占位符對應(yīng)的格式化的使用方法
本文主要介紹了python中的十大%占位符對應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問題, 文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-01-01

