從 C# 到 Python:6 天極速入門(第二天)

作為一名資深 C# 開發者,我們在第一天已經掌握了 Python 的基礎語法框架。今天我們將深入 Python 的特色語法與高級特性,通過實際項目開發場景的代碼對比,理解這些特性在真實業務中的應用價值。

一、簡潔語法糖:項目開發中的實戰應用

1. 列表推導式(替代 C# 的 LINQ)

在實際項目中,列表推導式常用于數據轉換和過濾,比如處理用戶輸入、日志分析等場景。

場景 1:批量處理日期格式

// C#處理日期列表(例如從數據庫查詢的時間戳轉換)
var timestamps = new List<long> { 1620000000, 1620086400, 1620172800 };
var dates = timestamps.Select(ts => new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(ts).ToString("yyyy-MM-dd")
).ToList();
# Python處理日期列表
import datetime
timestamps = [1620000000, 1620086400, 1620172800]
dates = [datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d") for ts in timestamps
]
print(dates)  # ['2021-05-03', '2021-05-04', '2021-05-05']

場景 2:數據清洗中的類型轉換

// C#處理用戶輸入的字符串數字列表
var input = new List<string> { "123", "45.6", "789", "abc" };
var numbers = input.Where(s => double.TryParse(s, out _)).Select(double.Parse).ToList();

# Python處理用戶輸入的字符串數字列表
input = ["123", "45.6", "789", "abc"]
numbers = [float(s) for s in input if s.replace(".", "", 1).isdigit()]
print(numbers)  # [123.0, 45.6, 789.0]

2. 字典推導式(項目實戰場景)

在配置處理、數據映射等場景中,字典推導式比 C# 的ToDictionary更靈活。

場景 1:配置項轉換

// C#處理配置字典(將字符串值轉換為對應類型)
var configStr = new Dictionary<string, string> {{"timeout", "300"},{"max_connections", "50"},{"enable_log", "true"}
};
var config = configStr.ToDictionary(k => k.Key,v => new { IntValue = int.TryParse(v.Value, out int i) ? i : 0,BoolValue = bool.TryParse(v.Value, out bool b) ? b : false}
);

# Python處理配置字典
config_str = {"timeout": "300","max_connections": "50","enable_log": "true"
}
config = {key: {"int_value": int(value) if value.isdigit() else 0,"bool_value": value.lower() == "true"} for key, value in config_str.items()
}
print(config["enable_log"]["bool_value"])  # True

場景 2:API 響應數據處理

// C#處理API返回的用戶列表
var apiUsers = new List<Dictionary<string, object>> {new() {{"id", 1}, {"name", "Alice"}, {"age", "25"}},new() {{"id", 2}, {"name", "Bob"}, {"age", "30"}}
};
var userMap = apiUsers.ToDictionary(u => (int)u["id"],u => new { Name = (string)u["name"], Age = int.Parse((string)u["age"]) }
);

# Python處理API返回的用戶列表
api_users = [{"id": 1, "name": "Alice", "age": "25"},{"id": 2, "name": "Bob", "age": "30"}
]
user_map = {user["id"]: {"name": user["name"],"age": int(user["age"])} for user in api_users
}
print(user_map[1]["age"])  # 25

3. 解包操作(項目中的實用技巧)

在函數參數傳遞、數據拆分等場景中,解包操作比 C# 的元組訪問更高效。

場景 1:函數多返回值處理

// C#處理函數返回的多值
(int total, int success, int failed) CalculateStats(List<int> results) {return (results.Count, results.Count(r => r == 0), results.Count(r => r < 0));
}var stats = CalculateStats(new List<int> {0, 0, -1, 0, -2});
int total = stats.total;
int success = stats.success;
int failed = stats.failed;
# Python處理函數返回的多值
def calculate_stats(results):total = len(results)success = sum(1 for r in results if r == 0)failed = sum(1 for r in results if r < 0)return total, success, failed# 直接解包賦值
total, success, failed = calculate_stats([0, 0, -1, 0, -2])
print(f"成功率: {success/total:.2f}")  # 成功率: 0.60

場景 2:批量數據拆分

// C#拆分數據列表
var data = new List<string> { "header", "row1", "row2", "row3", "footer" };
string header = data[0];
var body = data.GetRange(1, data.Count - 2);
string footer = data[data.Count - 1];

# Python拆分數據列表
data = ["header", "row1", "row2", "row3", "footer"]
header, *body, footer = data
print(header)  # header
print(body)    # ['row1', 'row2', 'row3']
print(footer)  # footer

二、函數式編程(項目實戰案例)

1. 高階函數(map/filter/reduce)

在數據清洗、批量處理等場景中,這些函數比 C# 的 LINQ 更簡潔。

場景 1:日志數據處理

// C#處理日志列表(提取錯誤日志并格式化)
var logs = new List<string> {"2023-10-01 10:00: INFO: System started","2023-10-01 10:05: ERROR: Connection failed","2023-10-01 10:10: ERROR: Timeout occurred"
};
var errors = logs.Where(l => l.Contains("ERROR")).Select(l => new {Time = DateTime.Parse(l.Split(": ")[0]),Message = string.Join(": ", l.Split(": ").Skip(2))}).ToList();

# Python處理日志列表
logs = ["2023-10-01 10:00: INFO: System started","2023-10-01 10:05: ERROR: Connection failed","2023-10-01 10:10: ERROR: Timeout occurred"
]# 過濾錯誤日志
errors = list(filter(lambda l: "ERROR" in l, logs))# 格式化錯誤信息
formatted_errors = list(map(lambda l: {"time": l.split(": ")[0],"message": ": ".join(l.split(": ")[2:])}, errors
))
print(formatted_errors[0]["message"])  # Connection failed

場景 2:數據聚合計算

// C#計算訂單總額
var orders = new List<decimal> { 99.9m, 159.9m, 299.9m };
decimal total = orders.Aggregate(0m, (sum, item) => sum + item * 1.1m);  // 加10%稅費
# Python計算訂單總額
from functools import reduce
orders = [99.9, 159.9, 299.9]
total = reduce(lambda sum, item: sum + item * 1.1,  # 加10%稅費orders, 0  # 初始值
)
print(f"總價: {total:.2f}")  # 總價: 593.67

2. 匿名函數(lambda)實戰

在事件處理、臨時計算等場景中,Python 的 lambda 比 C# 的匿名函數更輕量。

場景:動態排序

// C#動態排序(按不同字段排序)
var products = new List<Product> {new() { Id = 1, Name = "Laptop", Price = 5999, Stock = 10 },new() { Id = 2, Name = "Mouse", Price = 99, Stock = 100 }
};
Func<Product, object> sortBy = p => p.Price;  // 可動態切換排序字段
var sorted = products.OrderBy(sortBy).ToList();
# Python動態排序
products = [{"id": 1, "name": "Laptop", "price": 5999, "stock": 10},{"id": 2, "name": "Mouse", "price": 99, "stock": 100}
]# 按價格排序(lambda作為排序鍵)
sorted_by_price = sorted(products, key=lambda x: x["price"])
# 按庫存排序
sorted_by_stock = sorted(products, key=lambda x: x["stock"], reverse=True)
print(sorted_by_price[0]["name"])  # Mouse

三、模塊與包管理(項目實戰)

1. 模塊導入(實際項目組織)

大型項目中,Python 的模塊導入比 C# 的using更靈活。

場景:工具類導入對比

// C#導入工具類(需引用對應的命名空間)
using MyProject.Utils;
using MyProject.Utils.Validation;  // 多級命名空間// 使用工具類
var email = "test@example.com";
bool isValid = EmailValidator.Validate(email);
var hash = CryptoUtils.Md5Hash("password");
# Python導入工具模塊
import myproject.utils as utils
from myproject.utils.validation import email_validator
from myproject.utils.crypto import md5_hash as crypto_md5  # 別名導入# 使用工具函數
email = "test@example.com"
is_valid = email_validator.validate(email)
hash = crypto_md5("password")

2. 包管理實戰(依賴管理)

在團隊協作和部署中,虛擬環境比 C# 的項目依賴更隔離。

場景:項目依賴管理

# C#項目依賴(.csproj)
<Project Sdk="Microsoft.NET.Sdk"><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="13.0.1" /><PackageReference Include="RestSharp" Version="108.0.3" /></ItemGroup>
</Project>

# Python項目依賴(requirements.txt)
requests==2.31.0
pandas==2.0.3
python-dotenv==1.0.0# 導出當前環境依賴
pip freeze > requirements.txt# 部署時安裝依賴
pip install -r requirements.txt

虛擬環境實戰(多項目隔離)

# C#多版本依賴處理(需手動管理項目文件)
dotnet new console -o ProjectA
cd ProjectA
dotnet add package Newtonsoft.Json --version 12.0.3# 另一個項目使用不同版本
dotnet new console -o ProjectB
cd ProjectB
dotnet add package Newtonsoft.Json --version 13.0.1
# Python多版本依賴處理(自動隔離)
# 項目A使用舊版本
python -m venv projectA_env
source projectA_env/bin/activate  # Linux
projectA_env\Scripts\activate  # Windows
pip install requests==2.25.1# 項目B使用新版本
deactivate
python -m venv projectB_env
source projectB_env/bin/activate
pip install requests==2.31.0

四、字符串與日期處理專項對比(項目核心場景)

這里通過一段 C# 代碼和一段 Python 代碼,展示兩種語言在字符串處理和日期時間處理上的綜合應用,涵蓋字符串格式化、正則提取、日期轉換及日期運算等常見操作。

// C#字符串與日期處理綜合示例
using System;
using System.Text.RegularExpressions;class Program
{static void Main(){// 字符串處理string name = "Alice";int age = 30;string userInfo = $"User {name} is {age} years old"; // 字符串格式化string text = "a,b;c,d";string replacedText = text.Replace(",", "|").Replace(";", "|"); // 多字符替換string log = "Error [2023-10-01] Code: 500";Match match = Regex.Match(log, @"Code: (\d+)");string errorCode = match.Groups[1].Value; // 正則提取// 日期處理DateTime now = DateTime.Now;string isoNow = now.ToString("o"); // 獲取當前時間并轉為ISO格式DateTime specificDate = DateTime.ParseExact("2023-10-01", "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); // 字符串轉日期DateTime tomorrow = now.AddDays(1); // 日期加減Console.WriteLine(userInfo);Console.WriteLine(replacedText);Console.WriteLine(errorCode);Console.WriteLine(isoNow);Console.WriteLine(specificDate.ToString("yyyy-MM-dd"));Console.WriteLine(tomorrow.ToString("yyyy-MM-dd"));}
}

?

# Python字符串與日期處理綜合示例
import re
from datetime import datetime, timedelta# 字符串處理
name = "Alice"
age = 30
user_info = f"User {name} is {age} years old"  # 字符串格式化text = "a,b;c,d"
replaced_text = text.replace(",", "|").replace(";", "|")  # 多字符替換log = "Error [2023-10-01] Code: 500"
match = re.search(r"Code: (\d+)", log)
error_code = match.group(1)  # 正則提取# 日期處理
now = datetime.now()
iso_now = now.isoformat()  # 獲取當前時間并轉為ISO格式specific_date = datetime.strptime("2023-10-01", "%Y-%m-%d")  # 字符串轉日期tomorrow = now + timedelta(days=1)  # 日期加減print(user_info)
print(replaced_text)
print(error_code)
print(iso_now)
print(specific_date.strftime("%Y-%m-%d"))
print(tomorrow.strftime("%Y-%m-%d"))

今日總結

通過實際項目場景的對比,我們可以發現:

1、在數據處理場景中,Python 的推導式比 LINQ 更簡潔,一行代碼可完成 C# 多行代碼的功能

2、解包操作在函數參數傳遞、數據拆分時比 C# 的元組訪問更直觀

3、函數式編程在日志處理、數據聚合等場景中代碼更緊湊

4、模塊管理與虛擬環境比 C# 的項目依賴管理更輕量,適合快速迭代

下一天我們將學習 Python 的面向對象編程,對比 C# 的類、繼承、接口等核心概念,重點分析在 Web 開發、數據處理等場景中的應用差異。建議今天的代碼都實際運行一遍,特別是字符串和日期處理的示例,這些都是項目開發的基礎技能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89452.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyBatis 動態 SQL:讓 SQL 語句隨條件靈活變化

目錄 1. 動態SQL 1.1. if 1.1.1. 持久層接口添加方法 1.1.2. 映射文件添加標簽 1.1.3. 編寫測試方法 1.2. where 1.3. set 1.4. choose、when、otherwise 1.5. foreach 1.5.1. 遍歷數組 1.5.2. 遍歷Collection 1.5.3. 遍歷Map 2. 總結 前言 本文來講解MyBatis的動…

AI 驅動的儀表板:從愿景到 Kibana

作者&#xff1a;來自 Elastic Jeffrey Rengifo 及 Toms Mura 使用 LLM 處理圖像并將其轉換為 Kibana 儀表板。 想獲得 Elastic 認證&#xff1f;了解下一次 Elasticsearch Engineer 培訓的舉辦時間&#xff01; Elasticsearch 擁有眾多新功能&#xff0c;幫助你為你的使用場景…

AI產品經理面試寶典第17天:AI時代敏捷開發與MVP構建面試題與答法

機器學習MVP構建問題怎么答? 面試官:請舉例說明如何將業務問題轉化為機器學習可解的問題? 你的回答:以電商供應商評價為例,傳統方法用人工設定的低維度指標評分,而機器學習能利用大數據構建高維模型。比如通過供應商歷史交易數據、物流時效、售后投訴率等數百個特征,訓…

HBase2.5.4單機模式與偽分布式的安裝與配置(Ubuntu系統)

HBase的安裝也分為三種&#xff0c;單機模式、偽分布式模式、完全分布式模式&#xff1b;我們先來安裝單機版。 一、環境準備 1. 系統要求 Ubuntu 20.04/22.04 LTS Java 8&#xff08;必須&#xff0c;HBase不兼容更高版本&#xff09; Hadoop&#xff08;單機模式不需要&a…

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 +/- 10VDC 060-6881-02

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 /- 10VDC 060-6881-02

騰訊位置商業授權鴻蒙地圖SDK工程配置

工程配置 安裝 DevEco Studio 開發環境 手機HarmonyOS系統&#xff1a;OpenHarmony-5.0.0.71及以上DevEco Studio版本&#xff1a;DevEco Studio NEXT Release(Build Version: 5.0.3.900)及以上 獲取key與生成秘鑰 獲取key 登錄騰訊位置服務控制臺&#xff0c;未注冊過賬號可…

RocketMQ源碼級實現原理-Commitlog刷盤機制

刷盤機制 同步刷盤 代碼實現 寫入線程 寫入線程可能同時有多個&#xff0c;但是刷盤線程至始至終就是一個單線程 刷盤線程&#xff0c;始終是操作雙緩沖區域&#xff0c;一個用來刷盤&#xff0c;另一個用來接收多個寫入線程同時寫入刷盤請求 刷盤線程 通過這種方式&#xff0…

Java與Vue技術搭建的SRM招標采購管理系統,提供源碼,涵蓋招標、投標、評標全流程,助力企業高效規范采購管理

前言&#xff1a;在當今競爭激烈的商業環境中&#xff0c;高效、透明、規范的招標采購流程對于企業的成本控制、供應鏈穩定以及整體運營效率至關重要。SRM招標采購管理系統應運而生&#xff0c;它借助先進的信息技術&#xff0c;整合了招標采購的各個環節&#xff0c;實現了采購…

Kotlin集合分組

集合的分組&#xff08;Grouping&#xff09; 在之前的學習中&#xff0c;我們已經學會了如何對集合進行過濾、排序或執行聚合操作。 在本節中&#xff0c;我們將學習如何對集合元素進行分組&#xff0c;以便以最適合我們任務的方式呈現信息。分組&#xff08;Grouping&#xf…

阿里云ssh證書過期,如果更換并上傳到服務器

登錄阿里云平臺&#xff0c;在控制臺中找到“數字證書管理服務”進入頻道后&#xff0c;選擇“SSL證書管理”點擊“創建證書”&#xff0c;創建成功后&#xff0c;進入證書詳情頁選擇“下載”板塊&#xff0c;根據自身服務器類型&#xff0c;下載相應的證書即可服務器更新證書登…

【軟件系統架構】系列七:系統性能——計算機性能深入解析

目錄 一、什么是計算機性能&#xff1f; 二、計算機性能核心指標 1. CPU性能指標 2. 內存性能指標 3. 存儲子系統性能 4. 網絡性能指標 5. 系統資源使用與并發能力 三、性能瓶頸分析方法 四、計算機性能評測與對比 常見性能測試指標與工具&#xff1a; 五、計算機性…

基于現代R語言【Tidyverse、Tidymodel】的機器學習方法

機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”&#xff0c;是發現新規律&#xff0c;總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多&#xff0c;編程相當復雜&#xff0c;一直是阻礙機器學習大范圍應用的主要困難之一&#xff0c;由此誕生了Python…

Python暑期學習筆記5

時間&#xff1a;2025.7.18學習內容&#xff1a;【語法基礎】while循環與循環嵌套一、循環語句循環流程圖二、while循環基本格式&#xff1a;while條件&#xff1a;循環體&#xff08;條件滿足時段做的事情&#xff09;改變變量死循環while True:循環體&#xff08;要循環做的事…

world models and Human–Object Interaction (HOI)

Author: Chatgpt Here are several key research papers that explore the intersection of world models and Human–Object Interaction (HOI)—especially ones that build structured, object-centric representations from videos or use world-model-based learning to p…

無人值守共享自習室物聯系統安全防線:從設備到數據的全面防護策略!

在“全民學習”浪潮的推動下&#xff0c;無人值守共享自習室憑借24小時開放、靈活預約和沉浸式體驗&#xff0c;已成為城市學習空間的新形態。而當人力值守被物聯網設備替代后&#xff0c;安全風險卻從物理世界延伸到了數字世界。一套完整的自習室物聯網系統包含門禁、傳感器、…

【27】MFC入門到精通——MFC 修改用戶界面登錄IP IP Address Control

界面搭建 將【IP Address Control】控件&#xff0c;【Edit Control】控件和兩個【button】控件分別拖入主界面 將ID分別修改為&#xff1a;IDC_IP_ADDRESS IDC_IPADDRESS_EDIT IDC_GET_BUTTON IDC_CLEAN_BUTTON添加變量 為【IP Address Control】控件添加變量【m_IPaddress】&…

MacOS安裝linux虛擬機

在學習docker時用的云環境本身就是一個容器&#xff0c;啟動docker總是各種問題&#xff0c;所以直接在本機上裝一個虛擬機。 當前系統環境&#xff1a; 安裝虛擬機軟件 安裝UTM 下載官網&#xff1a;https://mac.getutm.app/ uname -m查看一下指令架構&#xff0c;下載…

TimSort:論Java Arrays.sort的穩定性

TimSort 是一種混合的、穩定的排序算法&#xff0c;結合了歸并排序&#xff08;Merge Sort&#xff09;和二分插入排序&#xff08;Binary Insertion Sort&#xff09;的優點&#xff0c;尤其適用于部分有序的數據。在 Java 中&#xff0c;Arrays.sort() 對對象數組排序時內部使…

企業數據生命周期安全架構設計

數據是企業的生命線&#xff0c;而安全則是這條生命線的保護神。今天我們就來聊聊如何為企業數據的一生一世構建一套堅不可摧的安全防護體系。 &#x1f4da; 文章目錄 為什么需要數據生命周期安全架構數據生命周期全景圖安全架構設計的核心原則各階段安全防護策略整體安全架構…

【Java】字符串常量池

文章目錄一.字符串常量池(StringTable)1.1 定義1.2 演示示例1.3 intern方法一.字符串常量池(StringTable) 1.1 定義 字符串常量詞本質是一個固定大小的HashTable。當用一個字符串構造String對象時&#xff0c;首先會去StringTable中查看是否存在在字符串&#xff0c;如果存在…