Questions tagged «python-3.x»

23
编写科学代码时干净编程
我不是真的写大型项目。我不是在维护庞大的数据库,也不是在处理数百万行代码。 我的代码主要是“脚本”类型的东西-测试数学功能或模拟某些东西的东西-“科学编程”。到目前为止,我从事的最长程序是几百行代码,而我从事的大多数程序都在150左右。 我的代码也很烂。前几天,当我试图找到我之前写的一个文件时,我意识到了这一点,但是我可能改写了,并且我没有使用版本控制,这可能使大量的您对我的愚蠢感到痛苦。 我的代码风格令人费解,并填充了过时的注释,这些注释指出了执行某项操作的替代方法或复制了几行代码。尽管变量名总是以非常好的描述性开始,但是当我按照某人想要测试的新内容进行添加或更改时,代码却被覆盖在顶部并被覆盖,因为我觉得这件事应该立即进行测试。有一个框架,我开始使用糟糕的变量名,并且文件进入了pot。 在我现在正在从事的项目中,我正处在所有这些阶段都重新吸引我的阶段。但是问题是(除了使用版本控制,以及为每个新迭代创建一个新文件并将其全部记录在某个地方的文本文件中,这可能会极大地改善这种情况)我真的不知道如何进行改进我实际的编码风格。 编写较小的代码是否需要单元测试?OOP怎么样?相对于处理较大的项目,什么样的方法适合在进行“科学编程”时快速编写优质,清晰的代码? 我之所以问这些问题,是因为编程本身通常并不复杂。它更多地是关于我正在通过编程测试或研究的数学或科学。例如,当两个变量和一个函数可能需要处理时,是否需要一个类?(考虑到一般情况下,程序的速度也应优先考虑更快的情况-当您运行25,000,000+个仿真时间步长时,您一定会希望它是这样。) 也许范围太广了,如果是的话,我对此表示歉意,但是从编程书籍的角度来看,它们似乎经常在大型项目中得到解决。我的代码不需要 OOP,而且已经很短了,所以它不像“哦,但是如果这样做的话,文件将减少一千行!” 我想知道如何在这些较小,更快的项目上“重新开始”并进行干净的编程。 我很乐意提供更多具体细节,但是我认为建议越笼统,就越有用。我正在用Python 3编程。 有人建议重复。让我明确地说,我并不是在谈论完全忽略标准编程标准。显然,存在这些标准是有原因的。但是,另一方面,如果可以完成一些标准的工作,写出说OOP的代码真的有意义吗?程序? 有例外。此外,除了简单的标准外,可能还有科学编程的标准。我也在问那些。这与编写科学代码时是否应忽略常规编码标准无关,而与编写干净的科学代码有关! 更新资料 只是以为我会添加“不超过一个星期以后”的更新。您的所有建议都非常有帮助。我现在使用版本控制-git,其中git kraken用于图形界面。它非常易于使用,并且彻底清理了我的文件-不再需要保留旧文件,也不再需要旧版本的代码“以防万一”。 我还安装了pylint并在所有代码上运行了它。最初,一个文件的分数为负。我什至不知道那怎么可能。我的主文件开始于〜1.83 / 10,现在为〜9.1 / 10。现在,所有代码都非常符合标准。我还用自己的眼睛跑过去,更新了已经消失的变量名,嗯,很糟糕,正在寻找要重构的部分。 特别是,我在这个网站上最近问了一个有关重构我的主要功能的问题,它现在更加整洁和短了很多:它不再是一个冗长,肿的if / else填充功能,现在不到一半的大小,更容易弄清楚发生了什么。 我的下一步是实施各种“单元测试”。我的意思是一个可以在主文件上运行的文件,该文件使用assert语句和try / excepts来查看其中的所有功能,这可能不是最好的方法,并且会导致重复的代码很多,但我会继续阅读并尝试找出如何做得更好。 我还对我已经编写的文档进行了重大更新,并向github存储库添加了补充文件,例如excel电子表格,文档和相关论文。现在看起来有点像一个真正的编程项目。 所以...我想这就是要说的:谢谢。

7
使用Python文件作为配置文件有多么糟糕的主意?
我一直使用JSON文件配置应用程序。我从编写大量Java时就开始使用它们,现在我主要从事服务器端和数据科学Python开发,并且不确定JSON是否是正确的选择。 我已经看到Celery使用实际的Python文件进行配置。最初我对此持怀疑态度。但是,使用简单的Python数据结构进行配置的想法开始对我产生影响。一些优点: 数据结构将与我通常在其中进行编码的结构相同。因此,我无需改变心态。 我的IDE(PyCharm)了解配置和代码之间的联系。Ctrl+ B使您可以轻松地在配置和代码之间跳转。 我不需要使用IMO不必要的严格JSON。我在看你双引号,没有结尾的逗号,也没有评论。 我可以在正在使用的应用程序中编写测试配置,然后轻松将它们移植到配置文件,而无需进行任何转换和JSON解析。 如果确实需要,可以在配置文件中执行非常简单的脚本。(尽管这应该非常非常有限。) 所以,我的问题是:如果我换了脚,我该如何射击自己的脚? 没有技能的最终用户将不会使用配置文件。对配置文件的任何更改当前都提交给Git,并作为连续部署的一部分部署到我们的服务器中。除非有紧急情况或正在开发中,否则无需进行手动配置更改。 (我考虑过YAML,但有关它的一些问题令我感到不适。因此,目前它不在美国的餐桌上。)


3
为什么Python没有列表的“扁平化”功能?
Erlang和Ruby都具有用于平坦化数组的功能。似乎是一种添加到语言的简单实用的工具。一个可以做到这一点: >>> mess = [[1, [2]], 3, [[[4, 5]], 6]] >>> mess.flatten() [1, 2, 3, 4, 5, 6] 甚至: >>> import itertools >>> mess = [[1, [2]], 3, [[[4, 5]], 6]] >>> list(itertools.flatten(mess)) [1, 2, 3, 4, 5, 6] 取而代之的是,在Python中,必须经历编写从头开始使数组变平的函数的麻烦。对我来说这似乎很愚蠢,将数组展平是一件很平常的事情。这就像必须编写一个自定义函数来连接两个数组。 我已经无能为力地搜索了Google,所以我在这里问。为什么有一个特定的原因,为什么像Python 3这样的成熟语言(附带十万种不同的电池)无法提供简化数组的简单方法?是否曾经讨论过并拒绝包含这种功能的想法?

5
Python mixins是反模式吗?
我完全意识到,pylint其他静态分析工具并非一无所知,有时必须不听从他们的建议。(这适用于各种类型的消息,而不仅仅是conventions。) 如果我有像 class related_methods(): def a_method(self): self.stack.function(self.my_var) class more_methods(): def b_method(self): self.otherfunc() class implement_methods(related_methods, more_methods): def __init__(self): self.stack = some() self.my_var = other() def otherfunc(self): self.a_method() 显然,这是人为的。如果您愿意,这是一个更好的示例。 我相信使用“ mixins”来称呼这种风格。 像其他工具,pylint利率这个代码的-21.67 / 10,主要是因为它认为more_methods并related_methods没有self或属性otherfunc,stack,annd my_var因为没有运行的代码,它显然不能看到related_methods和more_methods在混合中implement_methods。 编译器和静态分析工具不能总是解决Halting问题,但是我认为这确实是一种情况,其中查看继承者的内容implement_methods将证明这是完全有效的,并且这很容易做到。 为什么静态分析工具会拒绝这种有效的(我认为)OOP模式? 要么: 他们甚至不尝试检查继承或 不鼓励在惯用且易读的Python中使用mixins #1显然是不正确,因为如果我问pylint告诉我的一类矿井的继承unittest.TestCase使用 self.assertEqual,(仅定义的东西unittest.TestCase),它并没有抱怨。 mixins是unpythonic还是不鼓励使用?

1
python 3新功能解决了哪些问题?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 Python 3的新功能说: 我们主要是修复众所周知的烦恼和疣,并清除大量旧屑 它提到了什么不同(修复),但没有提到为什么(问题)。我还没有发现问题所在。修复程序解决了哪些问题?

2
如何命名在Python中返回值的函数?
我对在Python中为函数选择名称感到困惑。有时,Python内置函数势在必行,例如:printfunction和string method find。有时它们不是这样的:例如,len它的名称不是必须的calculate_len,而type不是find_type。 我可以理解,它print返回了一个我们不使用的值(即None),并且执行了某项操作(即,它在屏幕上显示了一个字符串),因此其名称势在必行。 但是len返回一个我们使用并执行某项操作的值(即,计算序列或映射中有多少个项。),其名称不是必须的。另一方面,find字符串方法(as len)返回一个我们使用并执行某操作的值,并且它的名称是必要的。 问这个问题的原因是,我将使用Caesar密码对字符串进行加密和解密的脚本进行了审查。审稿人说: 只是一种直觉:函数可以完成任务。因此,一个函数的好名字是势在必行的:我会用rotate_letter代替rotated_letter。 rotated_letter返回表示由数字旋转的字母的单字母字符串。我不知道有什么更好的,我用rotated_letter它返回一个值,就像random模块中的randint function,不是。generate_randint 因此,在这种情况下,我应该如何命名一个返回要使用的值的函数?我应该将名称设为命令性还是仅是名词。在其他情况下,显而易见的是如何执行此操作,例如布尔函数,例如is_even和is_palindrome我们将其设为是/否问题,以及仅执行并返回未使用的值(即None)的函数,例如printand list方法。sort。

3
为什么没有像现代Javascript实现那样对Python进行优化?
V8(Chrome),SpiderMonkey(Firefox)和Chakra(IE / Edge)等现代Javascript实现都具有JIT编译功能,并且还有许多其他优化措施可以提高性能。 Python为什么没有这些? 我一直在研究PyPy和IronPython,它们都声称可以提高速度。PyPy我不明白用Python(一种解释性语言)编​​写的Python实现会比C语言中的参考实现更快。IronPython,同样的想法,但我看不到.NET Framework如何提高速度。
11 python-3.x  jit 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.