从 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;如果存在…