给C#程序员编写Python的建议 - c#

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center获取指导。

7年前关闭。

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

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

还是任何技巧,窍门,需要更多了解的事情,需要注意的事情?

参考方案

首先,检查tgray's和Lundström's建议。

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

Python是动态类型的,因此与C#不同,您不会
检查类型,但行为。您可能想在Google上搜索鸭子
打字。这意味着您不必处理拳击和
拆箱。
Python完全面向对象,但语法不
实施这种范例。您无需使用即可编写Python
“阶级”一词。
Python特色的GUI库无法与
C#。检查PyQt,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上运行。
复杂的IDE不提供Python(您获得IDLE :-))。
如果您是Visual Studio的迷,请选中Glade。这是
虽然不如Visual Studio先进,但它仍然是很好的RAD。
如果您想用Python开发一些Web应用程序,
请记住,Python不是.NET。您必须添加一个网站
框架,如果您想比较。我喜欢Django。
Python不需要庞大的IDE。 SciTE,
Notepad++,IDLE,Kate,gedit ...
轻量级的编辑器确实足够了。
Python使用空格和换行符强制执行缩进,
你不能改变它。您应避免将标签用于
缩进并选择空格。相当于
空手镯{}是关键字“ pass”。
Python不强制使用私有变量。您可以定义一个
私有变量在开始时使用“ __”(两个下划线)
变量名,但是在一些棘手的情况下仍然可以绕过
方法。 Python通常假定程序员是成年人
知道他们在做什么并进行沟通。
Python使用迭代。很多。很多很多。所以
itertools模块是您最好的朋友。
Python没有内置的委托。委托模块是
不是你的想法。对于事件驱动的编程,请使用
GUI lib(或自己编写模式,不是那样的)
难)。
Python有一个解释器:您几乎可以测试任何东西,
生活。它应该始终在文本旁边运行
编辑。 Python基本解释器不多,请尝试IPython
为了美味
Python已自动记录:在您自己的代码中使用文档字符串
并在python解释器中使用“ help()”咨询其他人

模块基础:

sys:操纵系统功能
os:设置凭据,操纵文件路径,重命名,递归文件遍历等
shutil:批处理文件(例如递归删除)
回复:正则表达式
urllib和urllib2:HTTP脚本,例如下载,发布/获取请求等。
datetime:操作日期,时间和持续时间
线程:你猜对了
zlib:压缩
泡菜:序列化
xml:使用SAX或DOM解析/编写XML

有数百个模块。请享用。

在Python中执行操作的一些典型方法:

循环:

Python编码人员大量使用foreach C#的等效语言
循环,并且比其他任何方式都更喜欢:

基本迭代:

for item in collection:
    print str(item)

“集合”可以是字符串,列表,元组...任何
可迭代:定义.next()方法的任何对象。有
Python中有很多可迭代项。例如:典型的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)

与上述相同,但这些值将即时生成
在第一次迭代,然后丢失。关于它的更多信息here。

普通的循环

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

开箱

交换变量:

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编码人员使用以下惯用法(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

不仅如此。您可以将字典解压缩为
命名变量,并使用*编写函数原型,
**接受任意数量的参数。但这不是
足以使这篇文章更长的时间:-)。

字符串格式:

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"}

切片可迭代对象:

您可以使用非常简洁的语法获取iterable的任何部分:

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 !"

当然,查克·诺里斯(Chuck Norris)从不使用例外,因为他从未失败。

else子句

“其他”在Python中有许多用途。你会找到
在“ if”之后的“ 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 snippets。

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…