作为一个写了 15 年 C# 的程序员,我第一次写 Python 的时候,写了一个 Hello World,然后...就运行了。

没有 namespace,没有 class,没有 static void Main(),没有分号,没有大括号。就一行 print("Hello, World!"),然后 python hello.py,完事了。

当时我的内心是崩溃的——这代码...也能跑?我 15 年的仪式感呢?

后来我才明白,Python 的设计哲学是:代码是写给人看的,顺便给机器执行。而 C# 的设计哲学是:代码是写给编译器看的,人看得懂是bonus

今天咱们就来对比两种语言的"第一印象":程序结构。C# 的"仪式感" vs Python 的"随性"。

Hello World 对比

先看看 C# 的传统写法:

using System;

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

再看看 Python:

print("Hello, World!")

没看错,就一行。

C# 9+ 引入了顶级语句,终于学乖了:

Console.WriteLine("Hello, World!");

对比一下:

对比项 C#(传统) C#(顶级语句) Python
代码行数 10+ 1 1
需要命名空间
需要类
需要 Main 方法
需要分号
需要大括号

为什么 Python 不需要这些?

因为 Python 是解释型语言,不需要编译器提前知道所有类型信息。它从第一行开始逐行执行,不需要像 C# 那样先"搭建框架"。

这就像:C# 是先画好建筑图纸再施工,Python 是边设计边施工。

程序入口:谁说了算?

C# 必须有一个明确的入口点——传统方式是 static void Main(string[] args),顶级语句从文件第一行开始执行。

Python 从第一行开始执行,没有"入口点"的概念。不过有个可选的"入口保护":

def main():
    print("Hello, World!")

if __name__ == "__main__":
    main()

if __name__ == "__main__": 的意思是:只有这个文件被直接运行时才执行,被其他文件 import 时不执行。类似于 C# 的 Main 方法,但它是可选的。

为什么需要这个?

想象一下:你写了一个工具函数文件 utils.py,里面有很多函数。当你直接运行 python utils.py 时,你想测试这些函数。但当你 import utils 时,你只想用里面的函数,不想看到测试代码跑出来。

if __name__ == "__main__": 就是干这个的——**区分"被导入"和"被运行"**。

代码块结构:大括号 vs 缩进

C# 用大括号 {} 标记代码块:

if (x > 0)
{
    Console.WriteLine("正数");
}
else
{
    Console.WriteLine("非正数");
}

Python 用缩进(4 个空格)标记代码块:

if x > 0:
    print("正数")
else:
    print("非正数")

关键区别:

特性 C# Python
代码块标记 {} 缩进(4 空格)
缩进 风格建议,不影响编译 语法要求,缩进错了就报错
空格 vs Tab 不敏感 强烈建议用空格

Python 的缩进不是"建议",是"强制"。缩进不对,代码直接报错。这是 Python 最大的"坑"之一,也是它最优雅的地方——强制统一代码风格。

为什么 Guido 要这样设计?

因为 Guido van Rossum(Python 之父)认为:代码的可读性比任何东西都重要。缩进强制让你的代码结构清晰可见,不会出现 C# 那种"花括号地狱":

// 这段代码你看出嵌套了几层了吗?
if (a) { if (b) { if (c) { for (int i=0; i<10; i++) { if (d) { ... } } } } }

Python 这样写,一眼就能看出层级:

if a:
    if b:
        if c:
            for i in range(10):
                if d:
                    ...

注释方式

// C# 单行注释
/* C# 多行注释 */

/// C# XML 文档注释
/// <summary>这是一个方法</summary>
# Python 单行注释
'''
Python 多行注释
(实际上是多行字符串)
'''

# Python 文档字符串
def hello():
    """这是一个函数的文档字符串"""
    print("Hello")

Python 的"多行注释"实际上是多行字符串,但它不会被赋值给任何变量,所以效果和注释一样。文档字符串 """...""" 是 Python 的"官方"文档注释方式。

坑点来了:Python 的 ''' 不是真正的注释,它会被解释器解析。如果你在函数里写:

def foo():
    '''这是一个文档字符串'''
    pass
    '''这不是注释,这是字符串!'''
    print("hello")

第二个 ''' 会被当作一个字符串表达式,虽然不会执行,但会浪费内存。所以多行注释还是用 # 每行写

文件组织

对比项 C# Python
文件扩展名 .cs .py
文件和类的关系 通常一个文件一个类 没有强制关系
命名空间 显式声明 通过目录和 __init__.py 组织
项目文件 .csproj 无(或 pyproject.toml

C# 的一个 .cs 文件通常只放一个类,Python 没这个限制,一个 .py 文件可以放任意多的类和函数。

真实场景:在 Python 项目里,你经常会看到一个 models.py 文件里放了十几个数据模型类,一个 utils.py 里放了二十多个工具函数。这在 C# 里是不可想象的,但在 Python 里很常见。

设计哲学

C# 的哲学是"显式优于隐式"——类型安全、编译检查、代码即文档,适合大型项目和团队协作。

Python 的哲学是"简洁就是美"——"人生苦短,我用 Python",适合快速开发、脚本和原型。

C# 像一个严谨的德国工程师,每一步都有明确的规范; Python 像一个随性的法国艺术家,追求的是表达的自由。

更深层的原因

  • C# 诞生于微软,面向企业级开发,强调可维护性和团队协作

  • Python 诞生于荷兰,最初是 ABC 语言的替代品,强调开发者的幸福感

这就是为什么 C# 有很多"仪式感"(命名空间、接口、泛型),而 Python 追求"一步到位"。

迁移指南:C# 开发者最容易犯的错

  1. 忘记缩进:C# 的 {} 可以随便写,Python 的缩进必须对齐

  2. 忘记冒号if x > 0 后面必须有 :

  3. 混用 Tab 和空格:Python 3 不允许,会报 TabError

  4. 以为 # 是单行注释就随便用# 后面最好加个空格,PEP 8 规范

  5. **以为没有类型就是"不安全"**:Python 有类型注解,只是可选

推荐工具:用 VS Code + Python 插件,它会帮你检查缩进和格式问题。

坑点提醒

缩进地狱——缩进错了直接报错:

if x > 0:
print("正数")  # IndentationError: expected an indented block

忘记冒号——if 后面必须有冒号:

if x > 0
    print("正数")  # SyntaxError: invalid syntax

缩进混用——千万别空格和 Tab 混用:

if x > 0:
    print("空格缩进")
 print("Tab缩进")  # TabError: inconsistent use of tabs and spaces

真实案例:我有个同事,从 C# 转 Python,用 VS Code 写代码。VS Code 默认用 4 个空格,但他习惯用 Tab。结果他的代码在自己机器上能跑,到别人机器上就报错。后来发现是 .editorconfig 没配好。

一句话总结

C# 的仪式感是"先搭框架再填内容",Python 的哲学是"从上往下写就行"。

下一篇咱们来聊聊变量声明这件事——C# 的 int x = 5; 和 Python 的 x = 5,看似简单的差异背后,是两种完全不同的类型系统哲学。


获取更多资源

🎁 配套资源:关注公众号「半亩码田」,回复「资料」获取:

  • C# vs Python 完整对照速查表

  • 全系列思维导图

  • 48章配套练习题 + 答案

  • C# 转 Python 15个血泪教训

📚 文章平台

📦 代码仓库

💬 欢迎点赞、收藏、转发,你的支持是我持续创作的动力!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐