楼主: 时光永痕
336 0

[数据挖掘新闻] 从编写我的第一个 Python 脚本中吸取的教训 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)四级

13%

威望
0
论坛币
26 个
通用积分
49.8622
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
317 小时
注册时间
2020-7-21
最后登录
2024-5-13

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
作为一名独立作者/研究人员,我的“工作描述”中当然没有任何内容说我应该用 Python(或任何其他语言)编写代码。然而很长一段时间以来,我认为用 Python 编写代码会对我有很大帮助。这将意味着更多的读者,从而最终获得更多的收入。有一次,我发布了一份工作职位,寻找将我的 Perl 脚本翻译成 Python 的人。我认为自己做这件事会花费很多时间,而且学习曲线很长。

我错了。我很高兴我加入了 Python 的潮流。这比我想象的要容易得多。当然,我仍然需要学习很多东西。在这里,我讲述我的经历,自己学习 Python,没有参加任何课程,也没有阅读任何有关该主题的书籍。我希望我的实验能帮助人们做他们不愿做的事情,无论是学习一门新语言还是其他任何事情。一些读者提到,我所做的事情激励他们继续推进一些项目,而不是遵循惯性。

注意事项
首先,我不建议您完全自学。您可能会节省一些时间和金钱,但向有信誉的讲师或书籍学习会引导您走上正确的道路。就我而言,我是一个自学者。我过去参加的任何课程都是浪费时间,而且进展太慢。但我是例外而不是规则。当我发布以独特风格编写的 Python 代码时,我要求批评。我收到了很多反馈,我在这里分享。首先,人们说 Python 的设计不是为了反映编码人员的个性,而是应该以“标准方式”编写,以便其他编码人员易于重用。虽然我的代码基于我在网上找到的内容,但当您从头开始时,浏览 Internet 以找到好的代码片段,而不是糟糕的代码片段或过时的做法并不明显。

也就是说,我并没有真正从头开始。我在使用各种语言进行编码方面有着长期的经验,尤其是脚本语言。这绝对有帮助。虽然它也很痛,因为我的一些旧习惯与 Python 的设计方式相冲突。从好的方面来说,我从最新版本的 Python 开始。

它是如何开始的
它开始于大约两周前。我正在研究一种新的模糊回归技术,无需数学,无需模型,但提供预测区间(无需引导或重新采样)。周日凌晨 2 点,我无法入睡,被数学问题困扰。我走到办公桌前,决定尝试安装 Python。18 小时后,我的第一个 Python 脚本正常运行。它处理这种模糊回归方法。您可以在此处找到详细信息,包括源代码。它是用 Perl 编写的早期版本的翻译。

我在带有 Cygwin 环境(Windows 的某种 Unix 环境)的 Windows 机器上工作。在 Cygwin 下安装和运行 Python 很容易,并且与 Perl 非常相似。我很快意识到我会从使用像 Numpy 或 Pandas 这样的库中受益。使用该命令安装 PandasPip install pandas在 Cygwin 上不起作用。我尝试在 Windows 控制台中执行此操作,相当于 Windows 的 Unix shell。它允许您输入命令行语句。有效!

一些惊喜
如果 Python 是您学习的第一门语言,您将不会遇到以下问题。但是,如果您来自 Perl 或其他编程语言,请为一些惊喜做好准备。虽然令人困惑,但它们很容易克服。

首先,当你写一个循环时,没有明确的“结束”,比如说一个For循环。循环的结束由缩进决定。它使代码更短,更易于阅读。但是你需要对缩进非常严格。我自己发现了这个功能。那么使用逗号分隔变量是行不通的。我很难弄清楚为什么,直到我意识到 Python 中有一种叫做“元组”的东西。添加逗号创建和定义一个元组,而不是变量列表。一旦你意识到这一点,这不是问题。此外,没有任何东西可以识别变量。因此,您无法命名变量and,因为and它也代表布尔运算符。在 Perl 中,变量名以$. 但是,我认为这是一个优势:它使代码更紧凑。

也许最令人惊讶的特性是a[2]=3(在 void 数组上)这样的数组赋值不起作用。你必须改写 a.insert(1,2) 。提醒一下,Python 必须在后台进行一些内存分配。有点像 C 中的编码。在 Perl 中这是透明的。我希望解释器会自动识别a[2]=3并将其转换为a.insert(1,2). 我最初没有意识到的是,数组在 Python 中并不真正存在:它们被视为列表。这解释了为什么a[2]=3不起作用。

最后,您不能将所有函数(Perl 中的子例程)放在代码的底部。在您的代码中,必须在第一次调用之前定义一个函数。虽然调试很容易,但你得到的错误信息比我从 Perl 得到的更有帮助。使用类似numpy的库也非常简单和直观。

好惊喜
现在有一些积极的惊喜。我期待 Python 对变量类型非常严格。我以为你必须一直进行类型转换。当然它比 Perl 更严格,但比 C 更严格。总而言之,这不是问题。类型转换使代码更健壮。

变量的范围比我想象的要灵活。您不需要预先声明所有变量,当然也不需要在代码的顶部声明。与全局变量同名的局部变量(在函数内)不会覆盖全局变量。从某种意义上说,如果使用strictandwarning指令,它有点像 Perl,这是一种很好的编程习惯。

我在我的代码中使用了三个“数组”初始化,在三个单独的行上:x=[], y=[], z=[]. 有人告诉我我可以改写x=y=z=[],但它不会产生相同的结果。我仍然必须弄清楚为什么,但这并没有打扰我。最后,我认为我很难编写一个返回多个参数的函数。它实际上在我的第一次尝试中起作用,没有问题。该函数只是返回一个“元组”,虽然当时我不知道有一种叫做元组的东西。

我收到的一些建议
一位读者指出 re.sub(...) 用于处理正则表达式。另一个建议符合 Python PEP8 样式标准。更具体的评论:

在打开文件之前使用该with语句意味着您不需要记住自己关闭文件(如果遇到运行时错误,它将自动关闭)。
您已经覆盖了一个内置的(列表),这可能会令人困惑并且真的不应该这样做。通常,您的代码有点过于冗长。列表推导是在单行上创建 for 循环的非常有用的方法(它们也更快),元组解包避免了不必要的索引。除非您正在编写一个巨大的文件,否则我建议您将计算的输出打包到一个(dicts)列表中,然后使用它在最后创建一个文件,而不是保持文件打开并写入它。
尽量不要在使用变量之前声明它们;强迫用户向上或向下看几行以了解代码块在做什么会降低代码的可解释性。在这些情况下,可能有更好的方法。
您可以替换math.exp并np.exp保存 import Numpy 的版本具有额外的优势,即它也可以与数组一起使用。
嵌套循环在 Python 中没有任何问题,但列表推导通常是一个有用的替代方案——性能通常会提高,但并非总是如此。请参见下面的示例:[sum([x*y for y in range(0,3)]) for x in range(1,5)].
结论
您是否应该聘请没有 Python 经验的程序员来从事 Python 工作?

      相关帖子DA内容精选
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python CDA LEVEL Internet Windows excel函数

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-21 09:07