对 C # 程序员编写 Python 的建议

过去几年我主要从事 C # 开发,但最近开始做一些 Python (不是 Iron Python)的工作。但是我不确定我是否已经在脑海中跳跃到 Python... ... 我有点觉得我正在尝试像在 C # 中那样做事情。

对于如何充分利用 Python 有什么建议吗?

或者什么小窍门,需要学习的东西,需要注意的东西?

12317 次浏览

如果你是一个通过小步骤学习一门新语言的人,那么我建议你使用 铁蟒。否则就使用常规的 CPython,不要再做任何 C # 编码,直到你感觉你已经掌握了 Python。

我建议您找一个好的编辑器,这样您就不会被空格所困扰。为了简单起见,我只使用 ActivePython 的包 林克,它包含一个编辑器和所有的 win32api 库。如果您一直使用 C # ,那么进入它们是非常有趣的。Python 中的 win32api 可以更简单一些。你不需要做整个 DDLImport 的事情。下载 ActivePython (CPython 附带的) ,打开它,并开始在控制台输入一些内容。在使用 C # 之后,您将相当容易地掌握它。要了解更多有趣的 Python 花边新闻,请尝试 ActiveState 代码,它有各种各样的菜谱,可以让您非常简单地看到可以用 Python 做的不同事情。

如果你不是编程新手,我推荐马克 · 皮尔格林的书 “深入蟒蛇”。它解释 Python 的方式使人们更容易理解如何将 Python 技术和习惯用法应用于构建实际应用程序。

从阅读 巨蟒之禅开始

您可以在上面的链接中阅读它,或者在 Python 提示符下键入 import this。 =)

利用 C # 没有提供的 Python 特性

比如鸭子类型、元类、列表内涵等等。 *

编写简单的程序来测试这些特性,你很快就会习惯(如果不是上瘾的话)。

看看 Python 标准库

这样你就不用重新发明轮子了。不要试图读完整本书,即使是快速浏览一下作战指挥中心也可以为你节省很多时间。


* 我知道 C # 已经有了一些这样的特性,但是从我看到的来看,它们要么是非常新的,要么是 C # 开发人员不常用的。如果我说错了,请纠正我。

如果您还没有听说过它,那么对于任何学习 Python 的人来说,深入巨蟒都是一个很好的起点。它还有一堆 提示与技巧

  • 避免使用类。使用字典、集合、列表和元组。
  • 二进制和二进制是禁止的。
  • 除非真的需要,否则不要使用异常处理程序——让它以某种方式崩溃。
  • Pylint 可以成为更多 Python 式编码风格的朋友。
  • 当你准备好了-检查列表理解,生成器和 lambda 函数。

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

首先,检查 Tgray 的Lundström’s建议。

那么,有些事情你可能想知道:

  • Python 是动态类型化的,所以与 C # 不同,您不会 检查类型,但行为。你可能想谷歌关于鸭 打字。它意味着你不必处理拳击和 拆箱

  • Python 是完全面向对象的,但语法不是 你可以编写 Python 而不需要使用 “类”这个词

  • Python 提供的 GUI 库无法与之相比 检查 派克特、 GTK 或 WxPython

  • Python 有很多你可能不熟悉的概念: 列表理解,生成器(“屈服”在 C # 中确实存在, 但是用得不多)、装饰器、元类等等 您可以在 Python 中编程而不需要它们 只是智能工具,不是强制性的

  • 和 C # 一样,Python 标准库非常庞大 当你遇到任何问题的时候看看它。它是最 很可能已经有人解决了

  • Python 使用 LATE 绑定和变量标签 对于一个开始担心语言的人来说太早了 但是记住,总有一天你会遇到一个 行为的变量 SEEMS 不合逻辑,你会 必须检查一下。目前:

只要记住永远不要做以下事情:

def myfunc(my_list=[]) :
# bla

相反:

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

你会没事的,这是有原因的,但是 这不是重点: -)

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

  • Python 没有提供复杂的 IDE (您得到的是 闲着: ——)。 如果您是一个 VisualStudio 成瘾者,请选中 格莱德 虽然没有 Visual Studio 高级,但仍然是一个很好的 RAD

  • 如果你想用 Python 开发一些 web 应用程序, 记住 Python 不是.NET。你必须添加一个 web 我喜欢 姜戈

  • Python 并不需要一个巨大的 IDE 来处理, 记事本 + + 闲着凯特Gedit..。 轻量级编辑器确实足够了

  • Python 使用空格和换行符强制缩进, 你不能改变。你应该避免使用标签 而是缩进并选择空格 空手镯{}是关键字“ pass”。

  • Python 不强制私有变量 在开头使用“ _ _”(两个下划线)的 private 变量 变量名,但是在一些复杂的 Python 通常认为程序员是成年人 他们知道自己在做什么,并且与人交流

  • Python 使用迭代。很多。很多很多。因此 Itertools 模块是您最好的朋友

  • Python 没有内置的委托 不是你想的那样对于事件驱动程式设计来说 GUI lib (或者自己编写模式代码,不是这样的 困难)

  • Python 有一个解释器: 你几乎可以测试任何东西, 它应该总是运行在你的文本旁边 Python 基本解释器不多,试试 IPython 为了一些好吃的东西

  • Python 是自动记录的: 在您自己的代码中使用 docstring 并在 python 解释器

  • 中查询其他使用“ help ()”的用户

模组基础:

  • 操纵系统特性
  • OS: 设置凭据,操作文件路径,重命名,递归文件遍历等
  • 批处理文件(如递归删除)
  • Re: regexp
  • Urllib 和 urllib2: HTTP 脚本,如下载、 post/get 请求等。
  • Datetime: 操作日期、时间和持续时间
  • 线索: 你猜对了
  • 压缩
  • Pickle: 序列化
  • XML: 使用 SAX 或 DOM 解析/编写 XML

这里有几百个模块,好好享受吧。

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

循环:

Python 程序员大量使用相当于 foreach C # 的代码 循环,并喜欢它超过任何其他:

基本迭代:

for item in collection:
print str(item)

“集合”可以是一个字符串,一个列表,一个元组... 任何 Iterable: 定义. next ()方法的任何对象 例如: 一个典型的 Python 习语 阅读档案:

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

For 循环的快捷方式称为“列表内涵”。 这是在一行中创建一个新的迭代器的方法:

创建带有列表内涵的过滤列表:

my_list = [item for item in collection if condition]

创建一个带有列表内涵的新列表:

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

创建一个带有列表内涵的新发电机:

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

与上面相同,但是这些值将动态生成 在第一次迭代然后丢失。关于它的更多信息 给你

普通的循环

如果要表示通常的 for 循环,可以使用 函数。 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

打开行李

交换变量:

a, b = b, a

多次约会:

以上只是我们所谓的“拆包”(在这里)的结果 一个简单的解释方法就是 可以将任何序列的每个值直接赋给一个相等的 在一行中为一个变量编号:

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

这有很多含义 多维数组,你通常会得到每个子序列 然后一个接一个地使用它,例如:

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

但是通过解压缩,您可以直接将值赋给 变量:

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

这就是为什么如果你想在迭代的时候得到一个索引, Python 编码器使用以下习惯用法(枚举()是一个 标准功能) :

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

还有更多的东西。你可以把一本字典打开作为 命名变量,并用 *编写函数原型, **接受任意数量的参数 足以使这个职位变得更长: ——)。

字符串格式:

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 # 中那样检查,但是有“ Python” 方法(更短、更清晰: ——) :

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])

输出: “ GOOD TO SOME CODE”

请求原谅比请求许可更容易

Python 程序员通常不会检查某些东西是否可行。他们有点像 Chuck Norris。他们会这么做。那就抓住例外。通常,您不会检查文件是否存在,而是尝试打开它,如果失败则回滚:

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

当然查克 · 诺里斯从来不用除非他从来没有失败过。

Else 条款

“ Else”在 Python 中有很多用途 在“如果”之后加上“ else”,但也要加上“竹篮打水一场空”和“ 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#

如果你好奇,这里有一些高级的快速和 肮脏(但不错)的 巨蟒片段

然后你可以从中受益:

IPython shell: 在 shell 中自动完成。它进行批处理操作,添加大量特性,日志记录等等。玩贝壳-永远!

Easy _ install/Pip: 安装第三方 Python 应用程序的简单方法。

我也很像你,大部分工作仍然使用 C # ,但是在其他项目中使用 Python 的情况越来越多。

@ e-satis 可能对 Python 了如指掌,他的建议都是一流的。在我看来,对我影响最大的是以下几点:

恢复功能。不一定是意大利面条式的代码,但是学习并不是所有东西都必须存在于对象中,也不应该存在于对象中。

翻译。就像是直接窗口,只不过好了10 ^ 10。因为 Python 是如何工作的,所以在运行之前,你不需要所有的包袱和 C # 让你放进去的东西; 你只需要插入几行代码就可以看到它们是如何工作的。

我通常有一个 IDLE 实例,当我在编辑文件的时候,我只是丢一些代码片段来解决语言中各种各样的比特是如何工作的... ... 例如,忙于解决如何在一个列表上进行映射调用,但是我并没有100% 地使用 lambda... ... 在 IDLE 中插入几行代码,看看它是如何工作的,它是做什么的。

最后,喜欢进入冗长的 Python,我不是指冗长的冗长的意思,但 e-sats 指出,使用动词,如“ in”,“ is”,“ for”等。

如果您在 C # 中做了大量的反射工作,那么当您看到同样的东西在 Python 中是多么简单时,您会感到哭泣。

祝你好运。