找回密码
 立即注册
搜索
查看: 6145|回复: 35

[软件] python非科班技能书求推荐,主炼丹

[复制链接]
发表于 2020-9-25 04:16 | 显示全部楼层 |阅读模式
LZ数学统计出身,做各种炼丹也有几年了,也从R慢慢转移到python为了炼丹。。就想求各位大佬推荐一下python基础的书来补补基础?

其实挺难解释的。。。就是python码代码问题不大,stackoverflow ctrl+c总是可以解决的,但总是觉得自己的代码写的很难看,可能毕竟不是科班出身?我也说不上自己是哪里不好?但是觉得看科班出身的代码总觉得写的比我漂亮,所以想求推一下如果我要补一补python,有什么可以的方法\书?

Google的coding style我也看过了,感觉并没有本质性改变。。

举个栗子,做experiment的时候基本都是Jupyter,所以就问题不大,但是开始把experiment转到deployment的时候就会开始蒙逼,代码就变得很丑,写的也很痛苦。。。怎么把一个experiment的代码变成一个production ready的,哪部分放到一个script,哪部分放到一个class,哪些应该拿出来做成单独的parameter file之类的就很蒙逼

还有举个栗子,在development的时候,总会debug每一个小部分,例如preprocessing->missing value,于是我的Jupyter就会很乱,会有一个整个的preprocessing的function,有一个missing value的function,有一个missing value专门用来的debug的cell,有一个preprocessingd debug的cell,而且我都不舍得删因为删了以后还要重新写。。就不知道正确做法是啥。。我应该搞一个unit test?或者这就是单纯的不熟练?

大概就是这种很基础的问题,非科班的就很纠结。。有没有补补这种基础的东西?或者经验帖之类的?关键词应该是啥?

还有就是再举个栗子,最近做并行才意识到GIL,于是就觉得自己对python的基础一无所知,想补一补这种基础,这算啥?Class的话基础的会用,但是subclass之类的就会开始蒙逼了,所以这种基础的东西有没有系统性的参考?本科倒是上过一年的C++,所以应该说还是有点最基本的概念的,但是可能还是太浅了感觉。。

求别推荐官网参考文档。。。。

多谢各位大佬

回复

使用道具 举报

发表于 2020-9-25 07:21 | 显示全部楼层
我们野路子出身就是这样的啦,东西写完能跑基本功能算是在,但是整个代码质量一泡污,习惯就好啦。

  -- 来自 有消息提醒的 Stage1官方 iOS客户端
回复

使用道具 举报

发表于 2020-9-25 07:33 来自手机 | 显示全部楼层
这种事情不是看书能解决的,看看经典的开源项目代码怎么写的。如果你炼cv的丹推荐看maskrcnn-benchmark或者mmdetection,会学到一个良好设计和编码风格的py项目怎么写的
回复

使用道具 举报

     
发表于 2020-9-25 07:54 | 显示全部楼层
software engineering的东西,不是python的问题
回复

使用道具 举报

 楼主| 发表于 2020-9-25 08:49 | 显示全部楼层
Re.Troy 发表于 2020-9-25 07:54
software engineering的东西,不是python的问题

道理是这个道理。。。所以怎么破
回复

使用道具 举报

发表于 2020-9-25 09:08 | 显示全部楼层
只会复制粘贴
回复

使用道具 举报

     
发表于 2020-9-25 09:38 来自手机 | 显示全部楼层
pateryiyi 发表于 2020-9-24 19:49
道理是这个道理。。。所以怎么破

遇到你和你所做的同方向的开源项目(这样你看得懂代码的意思)时,就稍微研究一下它的项目结构啥的
回复

使用道具 举报

     
发表于 2020-9-25 09:41 来自手机 | 显示全部楼层
说得语言设计的时候不会考虑软件工程问题似的。

浮躁解决不了问题,有这个时间发贴,官网上的document,tutorial都开始看了。
回复

使用道具 举报

     
发表于 2020-9-25 09:54 | 显示全部楼层
软件工程?不清楚设计模式?去读俩本讲Design Pattern的书药到病除
回复

使用道具 举报

     
发表于 2020-9-25 10:22 来自手机 | 显示全部楼层
无解的,炼丹的都这样,之前用Java和ai那里对接信息传输真是要了老命了

— from OPPO PAAM00, Android 10 of S1 Next Goose v2.4.2
回复

使用道具 举报

     
发表于 2020-9-25 10:46 | 显示全部楼层
为什么不推荐官方文档,这是一个很好的学习材料

至于工程上的,可以看看设计模式和架构的书
回复

使用道具 举报

头像被屏蔽
发表于 2020-9-25 10:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2020-9-25 11:36 来自手机 | 显示全部楼层
可以找找比较好的组开源出来的项目,看看他们是怎么写的。另外jupyter notebook就是垃圾,补全没有跳转也没有,找代码全靠CtrlF,能把人憋死
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-9-25 12:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2020-9-25 12:35 | 显示全部楼层
看Python自己的源代码是最快的。还可以加入python-dev@python.org,看看大佬的设计思路讲解。https://mail.python.org/mailman3/lists/python-dev.python.org/
回复

使用道具 举报

发表于 2020-9-25 12:45 | 显示全部楼层
只有做大项目做的多,做的久一点,多踩雷可破。
另外炼丹的结构是挺难写好的
回复

使用道具 举报

     
发表于 2020-9-25 13:14 | 显示全部楼层
本帖最后由 BRRM 于 2020-9-25 13:20 编辑

这是工程问题,照着书搬也只会搬出一套很繁琐的东西,得到实践中去学习才行。

首先稍微去尝试一下使用flask、django甚至scrapy之类的框架,看看人家是怎么组织代码的,并且用这些框架搭建一个比较全面的项目。之后可以尝试自己也开发一个简易框架,看看外表上(结构)上能不能做得跟这些成熟项目差不多相似。
非要说看书的话,可以看看操作系统原理?很多程序设计思路和系统底层的设计思路是很相似的,就是怕你看不懂毕竟这东西学了对绝大多数人来说也没有一毛钱用,两天就忘了。而且大多数教材讲得很晦涩。
回复

使用道具 举报

     
发表于 2020-9-25 14:03 | 显示全部楼层
最好的就是看flask源码
回复

使用道具 举报

     
发表于 2020-9-25 14:05 | 显示全部楼层
非科班出身的java开发有啥技能书的?
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-9-25 20:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2020-9-26 03:26 | 显示全部楼层
本帖最后由 蓝泽玲 于 2020-9-26 03:41 编辑

多refactoring
notebook可以载入自定义module的
常用的method不妨写个utils.py塞进去

R写习惯了最容易产生的坏习惯是把一个处理流程的所有步骤都写在一个扁平的method里,甚至会出现nested for。这种写法作为experimental codes完全没有问题,但是作为production的代码可维护性和扩展性就不好。
怎么把method拆分,没有特别要求的话可以无脑用最小化原则,就是流程中每件单独的事情都用一个单独的method。
比如说,不写类似下面的代码
if user.age >0 and user.age <20:
     user.price_account = 0.2
     return price * user.price_account
而是把计算price包装成get_price(account),顺便把teenager做成全体user的class(比如User)的子类,然后把price_account放进类方法里,就不用判断了,可以写成:
return get_price(user.price_account)

理论上的指导思路是“低耦合高内聚”,但是根据我经验实际上领导就是无脑要求一件事一个method。
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-9-26 03:34 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2020-9-26 07:18 | 显示全部楼层
一样统计出身,和楼主有着同样的困惑……
回复

使用道具 举报

     
发表于 2020-9-27 10:12 | 显示全部楼层
奥古斯都 发表于 2020-9-25 12:29
老哥求推工程化相关的,感觉自己写的代码像坨shit,难以维护,最近想买 重构 这本书。 ...

重构这本书不错,虽然是 Java 写的,很多道理是想通的,最主要的是能发现代码里 为什么写的不好。重构这本书基于你已经看过 设计模式 来写的,所以设计模式可以先浏览下

然后就,重构和设计模式都是微观的,宏观的要补的话,就是些架构方面的理论。这方面的东西就比较零散,多用 google 吧。
回复

使用道具 举报

     
发表于 2020-9-27 10:15 来自手机 | 显示全部楼层
官方文档the python language reference请,通俗易懂还没废话
回复

使用道具 举报

     
发表于 2020-9-27 10:51 | 显示全部楼层
我们野路子出来又没学过设计模式是这样的,知道应该高内聚低耦合也不知道怎么实现。不过我自己用一些邪道方法可以强制改正一些因为python太方便导致的问题

我在炼丹之后又摸了摸Haskell的门槛,对什么是函数的side effect有了些了解。在知道了这一点后,就会主动避免在python中写出来看起来是函数实际上是闭包的部分

也是因为好奇,我又去看了看Rust。Rust在声明函数时必须包括函数的所有自变量和因变量的类型,再结合避免写出有side effect函数的意识,这样的函数已经很容易做到高内聚低耦合了

再回到python本身。python有自己的审美,也就是要写出pythonic的代码。最基础的比如不要写出来
for i in range(MAX):
    a[i] = something
这种C语言思路的代码

最后是你炼丹用的库也应该有足够多的源代码来学习。tensorflow 1.14之后我就再没有用过(他们的tutorials也是真的烂),pytorch的所有文档本身都是用源代码中的注释生成的,用编辑器/IDE可以轻松看到他们是怎样定义一个class的
回复

使用道具 举报

头像被屏蔽
     
发表于 2020-9-27 11:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2020-9-27 12:26 | 显示全部楼层
其实如果精力时间兴趣足够,我觉得学一遍UCB的cs61a,一门基于python和sicp的编程入门课,完成projects和labs基本可以打好python和编程底子了。

https://cs61a.org/ 挑个已经结束的学期做就行。这课程全免费,公开,所有作业自带autograder。。。

评分

参与人数 1战斗力 +1 收起 理由
pateryiyi + 1 这个牛逼我来了,我校的python课太水了。。.

查看全部评分

回复

使用道具 举报

     
发表于 2020-9-28 16:11 | 显示全部楼层
结夜野棠. 发表于 2020-9-27 10:12
重构这本书不错,虽然是 Java 写的,很多道理是想通的,最主要的是能发现代码里 为什么写的不好。重构这 ...

《 Clean  Code》这本书怎么样?
回复

使用道具 举报

     
发表于 2020-9-28 16:25 | 显示全部楼层
一个函数做一件事,能共用的代码尽量共用,变量生存期越短越好(当然这个在python上做不到)
一般原则就这3个,但发挥全靠经验和感觉。编程风格靠美化器就行
虽然有《重构》《代码大全》《设计模式》等书籍教怎么做,可感觉还是要靠多写多读练出来的
觉得难可以先画流程图,流程图看着感觉不错了再开始写代码
回复

使用道具 举报

     
发表于 2020-9-28 18:12 | 显示全部楼层
蓝泽玲 发表于 2020-9-28 16:11
《 Clean  Code》这本书怎么样?

这本书也不错,The Pragmatic Programmer 也可以

嘛,不过心态还是要调整下,不可能通过这些书一下让你的代码就简洁好看,先记下这些书里说的是什么,自己写代码的时候遇到,就去翻翻看。或者写了一段时间代码之后再回头看看。第一步是先培养看到一段代码,发现它是好还是坏的直觉
回复

使用道具 举报

     
发表于 2020-9-28 21:13 | 显示全部楼层
找你觉得写的好的代码看,慢慢模仿,需要时间
回复

使用道具 举报

发表于 2020-9-28 23:20 | 显示全部楼层
个人觉得刷算法题有助于提高代码质量
回复

使用道具 举报

 楼主| 发表于 2020-9-29 12:22 | 显示全部楼层
精钢魔像 发表于 2020-9-28 16:25
一个函数做一件事,能共用的代码尽量共用,变量生存期越短越好(当然这个在python上做不到)
一般原则就这3 ...

好了我觉得我没看多久就蒙逼了。。。

说是说一个函数干一件事,一个函数最好只有一个变量,但是炼丹的所有函数都超级复杂?随便一个pd.DataFrame.fillna()就恨不得有一万个input,各种method全都包裹在这个函数里面,随便一个炼丹的tf.keras.layers.LSTM()也是里面一万个input。。。

这是什么个情况?所以说炼丹比较奇怪还是说啥?
回复

使用道具 举报

     
发表于 2020-9-29 12:36 来自手机 | 显示全部楼层
pateryiyi 发表于 2020-9-29 12:22
好了我觉得我没看多久就蒙逼了。。。

说是说一个函数干一件事,一个函数最好只有一个变量,但是炼丹的所 ...

为什么要听一大堆人扯什么设计模式?你这问题根本没到工程化的高度,前面几个人推荐直接看python官方的书就行了,看不起科班是吧?
回复

使用道具 举报

     
发表于 2020-9-29 13:02 | 显示全部楼层
pateryiyi 发表于 2020-9-29 12:22
好了我觉得我没看多久就蒙逼了。。。

说是说一个函数干一件事,一个函数最好只有一个变量,但是炼丹的所 ...

你说的是参数吧,这个没限制,在风格上能接受就行
所谓的一个函数干一件事是:
函数a:排序
函数b:插入
函数c:搜索
这些都是对的。如果你写个函数d,参数传1排序,2插入,3搜索就不对了

评分

参与人数 1战斗力 +1 收起 理由
pateryiyi + 1 好评加鹅

查看全部评分

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-14 22:13 , Processed in 0.146741 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表