为编写Python的C#程序员提供build议

过去几年我一直在做C#开发,但最近开始做一些Python(而不是Python)。 但我不确定是否已经向Python做了心理跳跃……我觉得我正在尝试像在C#中那样做事情。

任何关于如何充分利用Python的build议?

或者任何提示\技巧,要了解更多的东西,要注意的事情?

首先,检查tgray和Lundström的build议。

然后,你可能想知道的一些事情:

  • Python是dynamictypes的,与C#不同,你不会检查types,而是行为。 你可能想要谷歌关于鸭子打字。 这意味着你不必处理拳击和拆箱。

  • Python是完全面向对象的,但是语法并没有强制执行这个范例。 你可以在不使用“class”这个词的情况下编写Python。

  • Python特有的GUI库无法与C#进行比较。 检查PyQt ,GTK或wxPython库。

  • Python有许多您可能不熟悉的概念:列表parsing,生成器(C#中存在“yield”,但它用得不多),装饰器,元类等等。 你可以用Python进行编程。 他们只是聪明的工具,不是强制性的。

  • 就像在C#中一样,Python标准库是巨大的。 遇到任何问题时请务必仔细阅读。 有人很可能已经解决了这个问题。

  • Python使用LATE绑定和variables标签。 对于一个以语言开始的人来说,为它担心还为时过早,但要记住,有一天你会遇到一个SEEMSvariables不合逻辑的行为,你必须检查它。 暂时:

只记得不要做以下事情:

def myfunc(my_list=[]) : # bla 

代替:

 def myfunc(my_list=()) : my_list = list(my_list) 

你会很好的。 有一个很好的理由,但这不是重点:-)

  • Python是跨平台的,喜欢在Mac上编写,如果你愿意,可以在Linux上运行。

  • Python没有提供一个复杂的IDE(你有IDLE :-))。 如果您是Visual Studio上瘾者,请检查Glade 。 这不像Visual Studio那样先进,但它仍然是一个很好的RAD 。

  • 如果你想在Python中开发一些Web应用程序,请记住Python不是.NET。 如果你想比较,你必须添加一个Web框架。 我喜欢Django 。

  • Python不需要一个巨大的IDE来处理。 SciTE , Notepad ++ , IDLE , Kate , gedit …轻量级编辑器是足够的。

  • Python使用空格和换行符来强制缩进,你不能改变它。 您应该避免使用制表符来缩进,而是select空格。 空手镯{}的等价物是关键字“pass”。

  • Python不强制私有variables。 您可以在variables名称的开头使用“__”(两个下划线)定义一个私有variables,但仍然可以通过一些棘手的方式绕过。 Python通常假设程序员是成年人,他们知道他们在做什么和交stream。

  • Python使用迭代。 很多。 很多很多。 所以itertools模块是你最好的朋友。

  • Python没有内置代理。 代表模块不是你所想的。 对于事件驱动的编程,使用一个GUI库(或自己编码模式,这并不困难)。

  • Python有一个解释器:你可以testing几乎任何东西,生活。 它应该总是在你的文本编辑器旁边运行。 Python基本的解释器不多,尝试IPython的东西好吃。

  • Python是autodocumented:在你自己的代码中使用docstrings,并使用python解释器中的“help()”来咨询其他人

模块基础知识:

  • sys:操纵系统function
  • 操作系统:设置凭证,操作文件path,重命名,recursion的文件散步等
  • shutil:batch file处理(如recursion删除)
  • 重新:正则expression式
  • urllib和urllib2:HTTP的脚本如下载,发布/获取resquests等
  • datetime:操作date,时间和DURATION
  • 线程:你猜的
  • zlib:压缩
  • 泡菜:序列化
  • XML:parsing/用SAX或DOM编写XML

有数百个模块。 请享用。

在Python中做一些典型的方法:

循环:

Python编码器大量使用了相当于C#的foreach循环,并且更喜欢其他的:

基本迭代:

 for item in collection: print str(item) 

“集合”可以是一个string,一个列表,一个元组…任何迭代:定义.next()方法的任何对象。 Python中有很多可迭代的东西。 例如:一个典型的Python成语读取文件:

 for line in open("/path/to/file") : print line 

for循环的快捷方式称为“列表理解”。 这是一种在一行中创build新迭代器的方法:

用列表理解创build一个过滤列表:

 my_list = [item for item in collection if condition] 

用列表理解创build一个新列表:

 my_list = [int(item) * 3 for item in collection] 

用列表理解创build一个新的生成器:

 my_list = (int(item) * 3 for item in collection) 

与上面相同,但是这些值将在第一次迭代中随时生成,然后丢失。 有关它的更多信息。

普通的循环

如果你想expression一个通常的循环,你可以使用xrange()函数。 for (int i = 0; i < 5; i++)变成:

 for i in xrange(0,5) : 

等同做

Python中没有“Do While”。 我从来没有错过,但如果你必须使用这个逻辑,请执行以下操作:

 while True : # Yes, this is an infinite loop. Crazy, hu? # Do your stuff if condition : break 

开箱

交换variables:

 a, b = b, a 

多个分配:

以上只是我们所说的“解包”(这里适用于一个元组)的结果。 一个简单的方法来解释它,你可以将任何序列的每个值直接分配给一个variables,在一行中相同的数字:

 animal1, animal2, animal3, animal4 = ["cow", "dog", "bird", "fish"] 

这有很多的影响。 在multidimensional array上迭代时,通常会逐个获取每个子序列,然后使用它,例如:

 agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")] for person in agenda: print person[0], person[1] 

但是通过解包,您也可以直接将值分配给variables:

 agenda = [("steve", "jobs"), ("linus", "torvald"), ("bill", "gates"),("jon", "skeet")] for name, lastname in agenda: print name, lastname 

这就是为什么如果你想在迭代时得到一个索引,Python编码器使用下面的习惯用法(enumerate()是一个标准函数):

 for index, value in enumerate(sequence) : print index, value 

打开函数调用

这是先进的使用,如果它困扰你,你可以跳过它。

您可以使用符号“*”来解压值,以便在函数调用中直接使用序列。 例如:

 >>> foo(var1, var1, var3) : print var1, var2 print var3 >>> seq = (3.14, 42, "yeah") >>> foo(*seq) 3.14 42 yeah 

还有更多。 您可以将字典解压缩为命名variables,并使用***编写函数原型来接受任意数量的参数。 但它没有足够的使用,使这个post更长时间:-)。

string格式:

 print "This is a %s on %s about %s" % ("post", "stackoverflow", "python") print "This is a %(subject)s on %(place)s about %(about)s" % {"subject" : "post", "place" : "stackoverflow", "about" : "python"} 

切片可迭代:

你可以使用一个非常简洁的语法来获得迭代器的任何部分:

 print "blebla"[2:4] # Print "eb" last = string[:-1] # Getting last element even = (0,1,2,3,4,5,6,7,8,9)[::2] # Getting evens only (third argument is a step) reversed = string[::-1] # Reversing a string 

逻辑检查:

你可以检查你在C#中的做法,但是有“Pythonic”方法(更短,更清晰:-)):

 if 1 in (1, 2, 3, 4) : # Check en element is in a sequence if var : # check is var is true. Var == false if it's False, 0, (), [], {} or None if not var : # Contrary of above if thing is var: # Check if "thing" and "var" label the same content. if thing is None : # We use that one because None means nothing in Python (almost null) 

组合(在一行上打印所有包含大写“o”的单词):

 sentence = "It's a good day to write some code" print " ".join([word.upper() for word in sentence.split() if "o" in word]) 

输出:“好一些代码”

比容许更容易要求宽恕

Python编码器通常不检查是否有可能。 他们有点像查克·诺里斯(Chuck Norris)。 他们这样做。 然后赶上例外。 通常情况下,您不检查文件是否存在,您尝试打开它,如果失败则回滚。

 try : f = open(file) except IOerror : print "no file here !" 

查克·诺里斯当然不会使用“除外”,因为他从不失败。

else子句

“Else”是Python中众多用途的世界。 你会在“if”之后find“else”,但是在“except”和“for”之后。

 for stuff in bunch : # Do things else : # This always happens unless you hit "break" in the loop 

这也适用于“while”循环,即使我们不使用这个循环。

  try : # A crazy stuff except ToCrazyError : # This happens if the crazy stuff raises a ToCrazyError Exception else : # This will happen if there is no error so you can put only one line after the "try" clause finally : # The same as in C# 

如果您好奇,这里有一堆先进的快速和肮脏(但不错)的Python片段 。

  • 不要使用类。 使用字典,集合,列表和元组。
  • 禁止安装者和获得者。
  • 除非你真的需要,否则不要有exception处理程序 – 让它崩溃。
  • Pylint可以成为你的朋友更多的pythonish编码风格。
  • 准备就绪后,请查看列表parsing,生成器和lambda函数。

如果你对编程并不陌生,我会推荐Mark Pilgrim的书“潜入Python” 。 它以易于理解Python技术和习惯用法如何应用于构build实际应用程序的方式解释了Python。

从阅读“Python的禅”开始

你可以在上面的链接中阅读它,或者在Python提示符处inputimport this 。 =)

利用C#不提供的Python特性*

如鸭子打字,元类,列表理解等*

编写简单的程序只是为了testing这些function。 你很快就会习惯(如果没有上瘾的话)。

看看Python标准库

所以你不要重新发明轮子。 不要试图阅读整件事情,即使快速浏览一下TOC也能为你节省很多时间。


*我知道C#已经有了一些这些function,但是从我可以看到它们是非常新的或者C#开发人员不常用的。 如果我错了,请纠正我。

如果你还没有听说过, Dive Into Python是学习Python的人开始学习的好地方。 它也有一些技巧和窍门 。

如果你是一个更好地学习一门新语言的人,那么我会推荐使用IronPython 。 否则,请使用常规的CPython ,除非您感觉掌握了Python,否则不要再进行C#编码。

我会build议找一个好的编辑器,以免被空白咬伤。 为了简单起见,我只是使用ActivePython的包链接 ,其中包括一个编辑器和所有的win32api库。 如果您一直在使用C#,那么他们相当有趣。 Python中的win32api可以更简单一些。 你不需要做整个DDLImport的事情。 下载ActivePython(CPython),打开它,并开始在控制台input一些东西。 使用C#之后,你会相当容易地拿起它。 对于一些更有趣的Python小技巧,可以尝试一下ActiveState代码 ,它有各种各样的配方,可以让你非常简单地看到你可以用Python做的不同的事情。

我也非常喜欢你,大多数工作仍然使用C#,但是越来越多地使用Python来处理其他项目。

@ e-satis可能从内到外都知道Python,所有的build议都是顶尖的。 从我的angular度来看,对我来说最大的不同是:

回到function。 不一定是意大利面代码,但是要知道,并非所有东西都是在一个对象中,也不应该是这样。

翻译。 这就像是除了10 ^ 10以外的即时窗口。 由于Python的工作方式,你不需要所有的行李和垃圾C#让你放入之前,你可以运行的东西; 你可以只用几行就看看事情是如何工作的。

我通常有一个IDLE实例,在那里我只是抛出一些片段,因为我正在研究在编辑我的文件时语言中的各个部分是如何工作的…例如,忙着研究如何进行地图调用一个列表,但我不是100%的lambda我应该使用… …几行删除空闲,看看它是如何工作,它是做什么。

最后,深入研究Python的冗长性,我并不是指冗长冗长的意思,而是像e-satis指出的那样,用“in”,“is”,“for”等动词。

如果你在C#中做了大量的反思工作,当你看到Python中相同的东西是多么的简单的时候,你会觉得哭泣。

祝你好运。

如果你有编程经验,不想花钱,我会推荐如何像Python中的计算机科学家一样思考 。

然后你可以从中受益:

IPython shell:在shell中自动完成。 它执行批处理操作,增加了大量的function,日志logging等。 >>>玩壳 – 总是!

easy_install / pip :安装第三方Python应用程序的好方法。