Python中字符串轉(zhuǎn)換為數(shù)字類型的注意事項(xiàng)及示例代碼
在Python編程中,字符串與數(shù)字類型的相互轉(zhuǎn)換是日常開(kāi)發(fā)中最基礎(chǔ)的操作之一。無(wú)論是處理用戶輸入、解析API響應(yīng),還是分析CSV文件,我們經(jīng)常需要將文本形式的數(shù)字(如"123")轉(zhuǎn)換為真正的數(shù)值類型(如int或float)。然而,看似簡(jiǎn)單的操作背后隱藏著無(wú)數(shù)陷阱和邊界情況。一個(gè)未經(jīng)驗(yàn)證的字符串轉(zhuǎn)換可能導(dǎo)致程序崩潰、數(shù)據(jù)錯(cuò)誤,甚至安全漏洞。本文將深入探討Python中字符串轉(zhuǎn)數(shù)字的注意事項(xiàng),通過(guò)真實(shí)代碼示例、實(shí)用技巧和關(guān)鍵警告,幫助你避開(kāi)這些"坑"。無(wú)論你是Python新手還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,這些內(nèi)容都將提升你的代碼健壯性。
為什么字符串轉(zhuǎn)換如此重要?
想象一下:你正在開(kāi)發(fā)一個(gè)電商網(wǎng)站,用戶輸入價(jià)格"1,299.99"。如果直接調(diào)用float(),程序會(huì)立即拋出異常,因?yàn)槎禾?hào)不被識(shí)別為數(shù)字分隔符。又或者,你從傳感器讀取溫度值"30.5°C",若不處理單位符號(hào),轉(zhuǎn)換將失敗。這些場(chǎng)景每天都在發(fā)生。根據(jù)Stack Overflow開(kāi)發(fā)者調(diào)查,數(shù)據(jù)類型轉(zhuǎn)換錯(cuò)誤是Python項(xiàng)目中最常見(jiàn)的運(yùn)行時(shí)錯(cuò)誤之一。字符串轉(zhuǎn)數(shù)字的可靠性直接影響程序的穩(wěn)定性,尤其在數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用中。因此,掌握其注意事項(xiàng)不是可選項(xiàng),而是必備技能。
基礎(chǔ)轉(zhuǎn)換方法:看似簡(jiǎn)單,實(shí)則暗藏玄機(jī)
Python提供了幾種內(nèi)置函數(shù)進(jìn)行字符串到數(shù)字的轉(zhuǎn)換。讓我們從最基礎(chǔ)的開(kāi)始,但請(qǐng)記?。?strong>簡(jiǎn)單不等于安全。
int():整數(shù)轉(zhuǎn)換的核心
int()函數(shù)將字符串轉(zhuǎn)換為整數(shù)?;A(chǔ)用法如下:
num_str = "42" num_int = int(num_str) print(num_int) # 輸出: 42 print(type(num_int)) # 輸出: <class 'int'>
這看起來(lái)無(wú)懈可擊,但問(wèn)題往往出現(xiàn)在非理想數(shù)據(jù)上。例如:
# 嘗試轉(zhuǎn)換浮點(diǎn)數(shù)字符串
try:
int("3.14")
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 錯(cuò)誤: invalid literal for int() with base 10: '3.14'"
關(guān)鍵注意點(diǎn):int()無(wú)法直接處理包含小數(shù)點(diǎn)的字符串。它期望一個(gè)純整數(shù)表示。如果需要從浮點(diǎn)字符串提取整數(shù)部分,必須先轉(zhuǎn)換為float再取整:
float_val = float("3.14") # 先轉(zhuǎn)為浮點(diǎn)
int_val = int(float_val) # 再轉(zhuǎn)為整數(shù) → 3
float():浮點(diǎn)數(shù)的雙刃劍
float()能處理更廣泛的格式,包括小數(shù)和科學(xué)計(jì)數(shù)法:
print(float("3.14")) # 3.14
print(float("2.5e3")) # 2500.0 (科學(xué)計(jì)數(shù)法)
print(float("-0.001")) # -0.001
但它同樣脆弱。試試這些:
# 包含非數(shù)字字符
try:
float("100美元")
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 錯(cuò)誤: could not convert string to float: '100美元'"
# 空字符串
try:
float("")
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 錯(cuò)誤: could not convert string to float: ''
提示:float()能識(shí)別"inf"(無(wú)窮大)和"nan"(非數(shù)字),但需注意大小寫(xiě)敏感:
print(float("inf")) # inf
print(float("NaN")) # nan (注意:'N'必須大寫(xiě))
進(jìn)制轉(zhuǎn)換:int()的隱藏能力
int()支持不同進(jìn)制的轉(zhuǎn)換,通過(guò)第二個(gè)參數(shù)指定基數(shù):
print(int("1010", 2)) # 二進(jìn)制 → 10
print(int("12", 8)) # 八進(jìn)制 → 10
print(int("A", 16)) # 十六進(jìn)制 → 10
但這里有個(gè)陷阱:如果字符串包含非法字符(如二進(jìn)制中的"2"),會(huì)拋出異常:
try:
int("2", 2) # 二進(jìn)制中不允許'2'
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 錯(cuò)誤: invalid literal for int() with base 2: '2'"
更隱蔽的問(wèn)題是默認(rèn)進(jìn)制。當(dāng)未指定基數(shù)時(shí),int()會(huì)嘗試智能判斷:
print(int("0xA", 0)) # 基數(shù)0表示自動(dòng)推斷 → 10 (十六進(jìn)制)
print(int("0o12", 0)) # 八進(jìn)制 → 10
print(int("0b1010", 0)) # 二進(jìn)制 → 10
警告:如果輸入來(lái)自不可信源(如用戶輸入),自動(dòng)推斷可能導(dǎo)致意外結(jié)果。例如"08"在八進(jìn)制中是非法的(八進(jìn)制無(wú)8),但作為十進(jìn)制是合法的。強(qiáng)烈建議顯式指定基數(shù)以避免混淆。
常見(jiàn)陷阱與錯(cuò)誤場(chǎng)景:90%的開(kāi)發(fā)者踩過(guò)的坑
非數(shù)字字符:隱形的炸彈
最常見(jiàn)錯(cuò)誤是字符串包含非數(shù)字字符。考慮這個(gè)場(chǎng)景:
# 從網(wǎng)頁(yè)抓取的價(jià)格:"$1,299.99"
price_str = "$1,299.99"
try:
float(price_str)
except ValueError as e:
print(f"轉(zhuǎn)換失敗: {e}")
輸出:
轉(zhuǎn)換失敗: could not convert string to float: '$1,299.99'
為什么發(fā)生?float()和int()只接受ASCII數(shù)字、小數(shù)點(diǎn)、正負(fù)號(hào)和指數(shù)符號(hào)(如e)。任何額外字符(逗號(hào)、貨幣符號(hào)、空格等)都會(huì)導(dǎo)致失敗。
解決方案:預(yù)處理字符串。使用str.strip()移除空格,str.replace()清理符號(hào):
cleaned = price_str.replace("$", "").replace(",", "")
print(float(cleaned)) # 1299.99
但注意:過(guò)度清理可能改變?cè)?/strong>。例如"1-2"清理后變成"12",但原意可能是范圍。始終根據(jù)上下文清理!
空字符串與空白字符:無(wú)聲的殺手
空字符串或純空白字符串是轉(zhuǎn)換的隱形殺手:
print(len(int(""))) # ValueError: invalid literal for int() with base 10: ''
print(len(float(" "))) # ValueError: could not convert string to float: ' '
這些錯(cuò)誤在用戶未輸入任何內(nèi)容時(shí)極易發(fā)生。更隱蔽的是不可見(jiàn)字符,如零寬空格(U+200B):
invisible_str = "123\u200b" # 末尾有零寬空格
try:
int(invisible_str)
except ValueError:
print("零寬空格導(dǎo)致轉(zhuǎn)換失敗!")
最佳實(shí)踐:始終用str.strip()移除前后空白,并檢查長(zhǎng)度:
def safe_int(s):
s_clean = s.strip()
if not s_clean:
return None # 或拋出自定義異常
try:
return int(s_clean)
except ValueError:
return None
print(safe_int(" 123 ")) # 123
print(safe_int(" ")) # None
print(safe_int("\u200b123")) # 123 (strip()移除了零寬空格)
浮點(diǎn)精度陷阱:0.1 + 0.2 ≠ 0.3?!
浮點(diǎn)數(shù)轉(zhuǎn)換涉及IEEE 754標(biāo)準(zhǔn),導(dǎo)致精度問(wèn)題:
a = float("0.1")
b = float("0.2")
print(a + b == 0.3) # False!
print(a + b) # 0.30000000000000004
這并非Python特有,而是所有使用二進(jìn)制浮點(diǎn)的編程語(yǔ)言共性。當(dāng)你需要精確十進(jìn)制計(jì)算(如金融應(yīng)用),永遠(yuǎn)不要用float。
解決方案:使用decimal模塊:
from decimal import Decimal
a = Decimal("0.1")
b = Decimal("0.2")
print(a + b == Decimal("0.3")) # True
print(a + b) # 0.3
Decimal從字符串精確初始化,避免二進(jìn)制表示誤差。
區(qū)域設(shè)置與國(guó)際化:全球化的挑戰(zhàn)
不同地區(qū)使用不同數(shù)字格式:
- 美式:
"1,000.50" - 歐式:
"1.000,50"
直接轉(zhuǎn)換歐式格式會(huì)失敗:
try:
float("1.000,50") # 歐式格式(逗號(hào)為小數(shù)點(diǎn))
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 錯(cuò)誤: could not convert string to float: '1.000,50'"
解決方案:使用locale模塊處理區(qū)域設(shè)置:
import locale
# 設(shè)置為德語(yǔ)區(qū)域(使用逗號(hào)為小數(shù)點(diǎn))
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') # 可能需要系統(tǒng)支持
try:
num = locale.atof("1.000,50")
print(num) # 1000.5
except locale.Error:
print("區(qū)域設(shè)置不可用,請(qǐng)安裝對(duì)應(yīng)locale")
警告:locale依賴系統(tǒng)配置,可能不可移植。更可靠的方法是手動(dòng)替換分隔符:
def parse_european_float(s):
s = s.replace(".", "").replace(",", ".")
return float(s)
print(parse_european_float("1.000,50")) # 1000.5
但需注意:某些格式(如印度式"1,00,000.50")需更復(fù)雜的邏輯。對(duì)于嚴(yán)肅應(yīng)用,考慮使用python-babel庫(kù)處理國(guó)際化。
溢出與大數(shù):當(dāng)數(shù)字超出范圍
雖然Python的int支持任意精度,但float有上限:
# float的最大值
print(float("1e308")) # 1e+308
print(float("1e309")) # inf (溢出為無(wú)窮大)
# int無(wú)上限,但轉(zhuǎn)換極大字符串可能耗盡內(nèi)存
huge_str = "9" * 1000000 # 一百萬(wàn)個(gè)9
try:
int(huge_str) # 可能導(dǎo)致MemoryError
except MemoryError:
print("內(nèi)存不足!")
最佳實(shí)踐:對(duì)極大數(shù),使用decimal或?qū)iT(mén)的大數(shù)庫(kù)(如gmpy2)。對(duì)浮點(diǎn)溢出,檢查結(jié)果是否為inf或nan:
def safe_float(s):
try:
val = float(s)
if val == float('inf') or val != val: # 檢查inf和nan
return None
return val
except ValueError:
return None
錯(cuò)誤處理:讓程序優(yōu)雅失敗而非崩潰
硬編碼轉(zhuǎn)換而不處理異常是災(zāi)難之源。讓我們建立健壯的轉(zhuǎn)換流程。
為什么必須用try-except?
直接轉(zhuǎn)換如int(user_input)在無(wú)效輸入時(shí)會(huì)拋出ValueError,導(dǎo)致程序終止。在Web應(yīng)用中,這可能暴露服務(wù)器細(xì)節(jié)給攻擊者。永遠(yuǎn)不要假設(shè)輸入是合法的。
錯(cuò)誤處理流程圖:決策樹(shù)
下面的mermaid圖表展示了安全轉(zhuǎn)換的決策邏輯。它幫你系統(tǒng)化處理各種情況:

這個(gè)流程圖強(qiáng)調(diào):
- 先檢查空值
- 轉(zhuǎn)換失敗時(shí)嘗試清理
- 最終提供安全回退
實(shí)戰(zhàn):構(gòu)建安全轉(zhuǎn)換函數(shù)
基于流程圖,實(shí)現(xiàn)可重用的轉(zhuǎn)換工具:
def safe_to_int(s, default=None, strip=True, clean_commas=False):
"""
安全地將字符串轉(zhuǎn)換為整數(shù)
:param s: 輸入字符串
:param default: 轉(zhuǎn)換失敗時(shí)的默認(rèn)值
:param strip: 是否移除前后空白
:param clean_commas: 是否移除逗號(hào)(用于千位分隔符)
:return: 整數(shù)或默認(rèn)值
"""
if strip:
s = s.strip()
if not s:
return default
# 清理逗號(hào)(如"1,000" → "1000")
if clean_commas:
s = s.replace(",", "")
try:
return int(s)
except ValueError:
# 嘗試處理帶小數(shù)點(diǎn)的字符串(如"42.0")
try:
return int(float(s))
except (ValueError, TypeError):
return default
# 測(cè)試案例
print(safe_to_int(" 1,234 ", clean_commas=True)) # 1234
print(safe_to_int("42.0", clean_commas=True)) # 42
print(safe_to_int("error", default=0)) # 0
類似地,為浮點(diǎn)數(shù)構(gòu)建safe_to_float,但需額外處理精度問(wèn)題。
自定義異常:提供有意義的錯(cuò)誤信息
不要只捕獲Exception,應(yīng)具體化異常類型并記錄上下文:
class StringConversionError(ValueError):
def __init__(self, original_string, message):
super().__init__(f"轉(zhuǎn)換失敗: '{original_string}' → {message}")
self.original_string = original_string
def strict_int(s):
try:
return int(s)
except ValueError as e:
raise StringConversionError(s, str(e)) from None
try:
strict_int("100元")
except StringConversionError as e:
print(f"嚴(yán)重錯(cuò)誤: {e}") # 嚴(yán)重錯(cuò)誤: 轉(zhuǎn)換失敗: '100元' → invalid literal for int() with base 10: '100元'
自定義異常使調(diào)試更高效,尤其在大型系統(tǒng)中。
高級(jí)技巧:超越基礎(chǔ)轉(zhuǎn)換的智慧
ast.literal_eval():比eval()安全的替代品
需要?jiǎng)討B(tài)執(zhí)行字符串?eval()能轉(zhuǎn)換數(shù)字字符串,但極其危險(xiǎn):
# ?? 絕對(duì)不要這樣做!
user_input = "__import__('os').system('rm -rf /')"
eval(user_input) # 可能刪除整個(gè)系統(tǒng)!
eval()執(zhí)行任意代碼,是嚴(yán)重安全漏洞。替代方案是ast.literal_eval(),它只評(píng)估"安全"的Python字面量:
import ast
print(ast.literal_eval("3.14")) # 3.14 (float)
print(ast.literal_eval("[1, 2, 3]")) # [1, 2, 3] (list)
print(ast.literal_eval("{'a': 1}")) # {'a': 1} (dict)
# 但數(shù)字字符串仍需額外處理
try:
ast.literal_eval("100美元")
except ValueError as e:
print(f"錯(cuò)誤: {e}") # 錯(cuò)誤: malformed node or string: <ast.Name object at ...>
限制:它不支持科學(xué)計(jì)數(shù)法(如"1e3")或進(jìn)制前綴(如"0x10")。僅當(dāng)輸入是可信的Python字面量時(shí)使用。
正則表達(dá)式預(yù)驗(yàn)證:提前攔截非法輸入
在轉(zhuǎn)換前,用正則表達(dá)式驗(yàn)證字符串格式:
import re
def is_valid_float(s):
# 匹配可選符號(hào)、數(shù)字、小數(shù)點(diǎn)、指數(shù)部分
pattern = r'^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$'
return bool(re.match(pattern, s.strip()))
print(is_valid_float(" -123.45e-6 ")) # True
print(is_valid_float("1,000")) # False
print(is_valid_float("NaN")) # False (需額外處理)
# 使用示例
s = " 3.14 "
if is_valid_float(s):
num = float(s)
else:
num = 0.0 # 安全默認(rèn)值
優(yōu)點(diǎn):避免不必要的異常拋出,提升性能。
缺點(diǎn):正則可能復(fù)雜,且無(wú)法覆蓋所有邊界情況(如"inf")。
處理科學(xué)計(jì)數(shù)法與特殊值
float()支持科學(xué)計(jì)數(shù)法,但需注意大小寫(xiě):
print(float("1.23E4")) # 12300.0
print(float("1.23e4")) # 12300.0
特殊值如"inf"和"nan"需謹(jǐn)慎:
print(float("inf")) # inf
print(float("-inf")) # -inf
print(float("nan")) # nan
# 檢查nan:不能用==比較
x = float("nan")
print(x == float("nan")) # False!
print(math.isnan(x)) # True (需import math)
最佳實(shí)踐:轉(zhuǎn)換后檢查特殊值:
def safe_float_with_checks(s):
try:
val = float(s)
if math.isinf(val) or math.isnan(val):
return None
return val
except ValueError:
return None
自定義解析器:應(yīng)對(duì)復(fù)雜格式
對(duì)于高度結(jié)構(gòu)化的輸入(如日志文件中的"Temp: 25.5°C"),編寫(xiě)專用解析器:
def parse_temperature(s):
# 提取數(shù)字部分(允許負(fù)號(hào)和小數(shù)點(diǎn))
match = re.search(r'[-+]?\d*\.\d+|\d+', s)
if match:
return float(match.group())
return None
print(parse_temperature("當(dāng)前溫度: -5.2°C")) # -5.2
print(parse_temperature("無(wú)效輸入")) # None
這種方法比通用轉(zhuǎn)換更可靠,因?yàn)槟阒罃?shù)據(jù)的具體結(jié)構(gòu)。
最佳實(shí)踐總結(jié):編寫(xiě)健壯轉(zhuǎn)換代碼的7條軍規(guī)
永遠(yuǎn)預(yù)處理字符串:用strip()移除空白,根據(jù)需求清理符號(hào)(但避免過(guò)度清理)。
cleaned = user_input.strip().replace("$", "").replace(",", "")
顯式指定進(jìn)制:避免int(s, 0)的自動(dòng)推斷,除非你完全控制輸入源。
int("10", 16) # 明確十六進(jìn)制
優(yōu)先使用try-except:不要依賴if檢查,因?yàn)檗D(zhuǎn)換邏輯可能復(fù)雜。
try:
num = int(s)
except ValueError:
num = DEFAULT
浮點(diǎn)數(shù)慎用==:比較時(shí)使用容差值。
if abs(a - b) < 1e-9: # 容差比較
print("相等")
金融計(jì)算用Decimal:永遠(yuǎn)不要用float處理金錢(qián)。
from decimal import Decimal
total = Decimal("0.1") + Decimal("0.2") # 精確為0.3
驗(yàn)證輸入來(lái)源:對(duì)用戶輸入、API響應(yīng)等不可信源,進(jìn)行嚴(yán)格格式驗(yàn)證。
if not re.fullmatch(r'-?\d+', s):
raise ValueError("非整數(shù)字符串")
提供有意義的錯(cuò)誤反饋:記錄原始字符串和上下文,加速調(diào)試。
logger.error(f"轉(zhuǎn)換失敗: '{raw_input}' 在行 {line_num}")
安全警告:eval()的致命誘惑
許多教程建議用eval()轉(zhuǎn)換字符串,因?yàn)樗?quot;萬(wàn)能":
# ?? 危險(xiǎn)示例!
s = input("輸入數(shù)字: ")
num = eval(s) # 如果輸入"__import__('os').system('rm -rf /')", 你的系統(tǒng)完蛋了
eval()執(zhí)行字符串作為Python代碼,等同于給攻擊者打開(kāi)系統(tǒng)大門(mén)。即使你認(rèn)為輸入"安全",也可能被精心構(gòu)造的輸入繞過(guò)。OWASP安全指南明確警告此類風(fēng)險(xiǎn)。永遠(yuǎn)不要在生產(chǎn)代碼中使用eval()處理外部輸入。用ast.literal_eval()或自定義解析器替代。
性能考量:轉(zhuǎn)換操作的成本
在循環(huán)中頻繁轉(zhuǎn)換可能成為瓶頸。測(cè)試不同方法:
import timeit
# 方法1: 直接轉(zhuǎn)換
def direct():
return int("12345")
# 方法2: 帶try-except
def safe():
try:
return int("12345")
except ValueError:
return 0
# 方法3: 正則預(yù)驗(yàn)證
def regex():
if re.match(r'^-?\d+$', "12345"):
return int("12345")
return 0
print(timeit.timeit(direct, number=1000000)) # ~0.1秒
print(timeit.timeit(safe, number=1000000)) # ~0.15秒 (異常成本高)
print(timeit.timeit(regex, number=1000000)) # ~0.3秒 (正則較慢)
結(jié)論:
- 在已知合法輸入時(shí),直接轉(zhuǎn)換最快。
- 在可能失敗的場(chǎng)景,
try-except比預(yù)驗(yàn)證更高效(異常僅在失敗時(shí)觸發(fā))。 - 避免在熱點(diǎn)代碼中做復(fù)雜清理。預(yù)處理一次后緩存結(jié)果。
案例研究:真實(shí)世界的轉(zhuǎn)換災(zāi)難
案例1:NASA火星氣候軌道器失敗
1999年,NASA損失1.25億美元的火星氣候軌道器,原因是一個(gè)模塊輸出英制單位(磅力秒),而另一模塊誤以為是公制單位(牛頓秒)。雖然非Python問(wèn)題,但本質(zhì)是數(shù)據(jù)類型轉(zhuǎn)換錯(cuò)誤:字符串"10.5"被當(dāng)作不同單位解析。在代碼中,類似問(wèn)題表現(xiàn)為:
# 錯(cuò)誤:未指定單位 altitude_ft = float(sensor_data) # 但傳感器輸出的是米?
教訓(xùn):始終記錄單位,轉(zhuǎn)換時(shí)顯式處理。
案例2:電商價(jià)格錯(cuò)誤
某電商平臺(tái)將用戶輸入"1.000"(意為1000美元)誤轉(zhuǎn)為1.0(因系統(tǒng)用逗號(hào)為小數(shù)點(diǎn))。結(jié)果商品以1美元售出。問(wèn)題代碼:
price = float(user_input) # "1.000" → 1.0 (而非1000.0)
修復(fù):
# 根據(jù)用戶區(qū)域設(shè)置解析
if user_locale == "de_DE":
price = float(user_input.replace(".", "").replace(",", "."))
else:
price = float(user_input.replace(",", ""))
這些案例證明:字符串轉(zhuǎn)數(shù)字的疏忽可能導(dǎo)致金錢(qián)損失、聲譽(yù)損害甚至安全事故。嚴(yán)謹(jǐn)處理至關(guān)重要。
未來(lái)展望:Python 3.12+的新特性
Python持續(xù)改進(jìn)類型轉(zhuǎn)換體驗(yàn)。在3.12+中:
int和float構(gòu)造函數(shù)對(duì)空白字符更嚴(yán)格(PEP 680)。math模塊新增isclose()用于安全浮點(diǎn)比較:
import math print(math.isclose(0.1 + 0.2, 0.3)) # True
- 類型提示支持更精確的轉(zhuǎn)換協(xié)議(如
SupportsInt)。
關(guān)注Python官方發(fā)布說(shuō)明獲取更新。
結(jié)論:成為轉(zhuǎn)換大師的最后一步
字符串轉(zhuǎn)數(shù)字是Python的基石操作,但絕非微不足道。本文覆蓋了從基礎(chǔ)語(yǔ)法到高級(jí)陷阱的完整圖景:
- 基礎(chǔ)方法(
int(),float())的局限性 - 常見(jiàn)錯(cuò)誤(非數(shù)字字符、空字符串、精度問(wèn)題)
- 安全轉(zhuǎn)換的實(shí)戰(zhàn)技巧(預(yù)處理、錯(cuò)誤處理、正則驗(yàn)證)
- 致命陷阱(
eval()風(fēng)險(xiǎn)、國(guó)際化挑戰(zhàn)) - 性能與最佳實(shí)踐
記?。?strong>可靠的轉(zhuǎn)換始于對(duì)輸入的敬畏。永遠(yuǎn)假設(shè)輸入是惡意的或錯(cuò)誤的,并設(shè)計(jì)防御性代碼。通過(guò)try-except、預(yù)處理和適當(dāng)?shù)念愋瓦x擇(int vs float vs Decimal),你能構(gòu)建出堅(jiān)如磐石的應(yīng)用。
最后,分享一個(gè)終極技巧:在關(guān)鍵系統(tǒng)中,添加轉(zhuǎn)換日志。當(dāng)錯(cuò)誤發(fā)生時(shí),你會(huì)感謝過(guò)去的自己:
def logged_int(s, logger=None):
try:
return int(s)
except ValueError as e:
if logger:
logger.warning(f"INT轉(zhuǎn)換失敗: '{s}' → {str(e)}")
return None
現(xiàn)在,你已掌握字符串轉(zhuǎn)數(shù)字的全部注意事項(xiàng)。去編寫(xiě)更安全、更健壯的Python代碼吧!每一次謹(jǐn)慎的轉(zhuǎn)換,都是對(duì)程序穩(wěn)定性的投資。開(kāi)始實(shí)踐,讓錯(cuò)誤無(wú)處藏身!
以上就是Python中字符串轉(zhuǎn)換為數(shù)字類型的注意事項(xiàng)及示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python字符串轉(zhuǎn)換為數(shù)字類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python自動(dòng)修改電腦靜態(tài)IP地址的實(shí)現(xiàn)示例
通過(guò)Python自動(dòng)修改電腦的靜態(tài)IP地址可以極大地提高我們的工作效率,減少手動(dòng)修改IP地址帶來(lái)的錯(cuò)誤,本文就來(lái)介紹一下Python自動(dòng)修改電腦靜態(tài)IP地址的實(shí)現(xiàn)示例,感興趣的可以了解一下2023-11-11
python實(shí)現(xiàn)獲取所有可用攝像頭(id+名稱)可用于opencv
本文介紹了PyCameraListProject,這是一個(gè)用于解決OpenCV庫(kù)中VideoCapture調(diào)用攝像頭時(shí)無(wú)法直接通過(guò)名稱選擇攝像頭問(wèn)題的庫(kù),它支持Python?3.6至3.10的64位Windows版本,并提供測(cè)試代碼2026-01-01
使用python PIL庫(kù)批量對(duì)圖片添加水印的過(guò)程詳解
平常我們想給某些圖片添加文字水印,方法有很多,也有很多的工具可以方便的進(jìn)行,今天主要是對(duì)PIL庫(kù)的應(yīng)用,結(jié)合Python語(yǔ)言批量對(duì)圖片添加水印,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下2023-11-11
python調(diào)用百度地圖WEB服務(wù)API獲取地點(diǎn)對(duì)應(yīng)坐標(biāo)值
這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度地圖WEB服務(wù)API獲取地點(diǎn)對(duì)應(yīng)坐標(biāo)值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
python實(shí)現(xiàn)圖片二值化及灰度處理方式
今天小編就為大家分享一篇python實(shí)現(xiàn)圖片二值化及灰度處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python3 自動(dòng)打印出最新版本執(zhí)行的mysql2redis實(shí)例
這篇文章主要介紹了python3 自動(dòng)打印出最新版本執(zhí)行的mysql2redis實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python 編碼規(guī)范(Google Python Style Guide)
本項(xiàng)目并非 Google 官方項(xiàng)目, 而是由國(guó)內(nèi)程序員憑熱情創(chuàng)建和維護(hù),對(duì)于想學(xué)習(xí)python的朋友可以參考一下2018-05-05

