C#和Python之间的一些核心概念差异是什么?

C#和Python之间的一些核心概念差异是什么?,c#,asp.net,python,django,programming-languages,C#,Asp.net,Python,Django,Programming Languages,我是Python新手,来自C#背景,我正在努力跟上进度。我知道Python是动态类型的,而C是强类型的。->见评论。在尝试学习Python时,我应该注意哪些概念上的障碍?Python中是否存在不存在模拟的概念?面向对象分析有多重要 我相信,对这些问题以及您可能想到的任何其他问题的回答都会加快我对Python的理解,除了Nike的思维(“只管去做”)之外 还有一点背景:我的公司正在从ASP.NETC#Web表单转移到Django。我已经看过了Django教程,它真的很棒。我需要在大约两周的时间内赶

我是Python新手,来自C#背景,我正在努力跟上进度。我知道Python是动态类型的,而C是强类型的。->见评论。在尝试学习Python时,我应该注意哪些概念上的障碍?Python中是否存在不存在模拟的概念?面向对象分析有多重要

我相信,对这些问题以及您可能想到的任何其他问题的回答都会加快我对Python的理解,除了Nike的思维(“只管去做”)之外

还有一点背景:我的公司正在从ASP.NETC#Web表单转移到Django。我已经看过了Django教程,它真的很棒。我需要在大约两周的时间内赶上进度(也许很可笑?哈哈)


感谢大家花时间和精力回答一个非常广泛的问题。

C#和Python之间有很多不同之处;与其沉湎于个体差异,不如只看Python是如何使用指南工作的,例如。请记住,虽然Python允许您很好地执行OOP,但它并不限制您使用OOP。有时候,只有普通函数就足够了(Django视图就是一个很好的例子)

WebForms和Django之间还有许多概念上的差异。Django与HTTP更为契合——在客户端和服务器端发生的事情之间没有混淆。对于典型的WebForms应用程序,客户端事件通常使用回发触发服务器端代码。即使使用ASP.NET Ajax框架,这种环境提供的控制也比您有时需要的少。在Django中,您可以使用客户端库(例如YUI或jQuery)实现同样的效果,并自己进行Ajax调用。尽管这种方法没有ASP.NET方法那么有效,但使用Django和Python时,您应该更高效,使后者成为一种全面的NET方法。ASP.NET的目标是让习惯WinForms和其他桌面开发环境的开发人员更加熟悉这些东西;虽然这是微软采取的一种完全合理的方法(而且不是唯一的方法——例如,Java有JSF),但它与HTTP和REST的协调程度并不相同。举个例子,看看与Django URL相比,ASP.NET URL的约束性(ASP.NET MVC之前)有多强


只有我2美分的价值:-)

概念上的差异很重要,但主要在于它们如何导致不同的态度

其中最重要的是“鸭子打字”。忘记事情的类型吧,你不需要在意。您只需要关心对象具有哪些属性和方法。“如果它看起来像鸭子,走路像鸭子,那它就是鸭子”。通常,这些态度的改变会在一段时间后自然而然地发生

最大的概念障碍似乎是

  • 显著的缩进。但唯一讨厌它的人是那些拥有或被迫与之合作的人,他们改变了他们的编辑器标签扩展,而不是默认的8

  • 没有编译器,因此在编译阶段没有类型测试。许多来自静态类型语言的人认为,编译过程中的类型检查会发现许多bug。根据我的经验,它不是

  • 鸭子打字 我认为从python中设置c#/java的主要原因是通常不需要接口。这是因为python已经成功了


    只要对象有quack方法,就可以使用它调用quacker。Duck类型还使设计模式更易于实现。因为您不需要编写接口并确保对象的类型相同。

    您说过Python是动态类型的,而C#是强类型的,但事实并非如此。强类型与弱类型以及静态类型与动态类型是正交的。强类型意味着str+int不会强制使用其中一个opperand,因此在这方面Python和C#都是强类型的(而PHP或C是弱类型的)。Python是动态类型化的,这意味着名称在编译时没有定义的类型,而在C中是这样的。

    “我知道Python是动态类型的,而C是强类型的。”

    这是非常错误的

  • Python是强类型的。列表、整数或字典始终为给定类型。无法更改对象的类型

  • Python变量不是强类型的。实际上,Python变量只是对象上的标签。不声明变量;因此,Python被描述为“动态的”

  • C#是静态类型的。这些变量向编译器声明为特定类型。代码是基于运行时使用的变量的特定知识生成的

  • Python是“解释的”——事情是在运行时完成的——很少假设。[从技术上讲,Python源代码被编译成字节码,字节码被解释。一些人认为这是一个重要的区别。]

    C#已编译——编译器根据声明的假设生成代码


    学习Python时,我应该注意哪些概念上的障碍?

    没有。如果你坚持Python应该像其他东西一样;或者你坚持认为其他东西更直观,而你用不恰当的概念污染了自己的思维

    任何编程语言都没有障碍。当我们把事情强加在语言上时,我们会带来自己的障碍

    Python中有没有类似的概念?

    由于Python具有面向对象、过程和功能元素,您很难找到Python中缺少的东西

    面向对象分析有多重要?

    OO分析有助于软件开发的所有阶段——即使您没有进行OO实现。这与Pyth无关
    class Duck(object):
        def quack(self):
            print "quack"
        
    class Cat(object):
        """Cat that specializes in hunting ducks"""
        def quack(self):
            print "quack"
        
    duck = Duck()
    cat = Cat()
    
    def quacker(something_that_quacks):
        something_that_quacks.quack()
    
    quacker(cat) #quack
    quacker(duck) #quack