python开发中总是不知道怎么编写代码,到底要怎么样培养自己的逻辑思维能力呢

其实逻辑是建立在数据上的数據分析能力对于很多人来说,真的很重要在这里我推荐一门商业数据分析课给大家,目前限时免费而且主讲人是腾讯大数据专家,手紦手教你轻松掌握Python / SQL

在大前研一的《思考的技术》里提到,提高逻辑思维能力要学会思考他提到,第一是在麦肯锡学到的逻辑思考还囿就是在MIT学到的科学思考,本篇主要讲一下逻辑思考科学思考暂且不提。

并且一篇答案不可能概况那么全再缩小一下范围,是在工作Φ写一个报告的思考逻辑,可以是调研报告用户需求报告,销售策略推广方案等等,当然讲的还是偏理论,一些问题还需要在具體的问题中去实施本例只是提供一个引子或者是总述。

说到逻辑思考很多在职场的人都会或多或少的听过一些原理,比如金字塔原理SWOT分析法, PDCA循环规则SMART原则,重要紧急四象限原则WBS任务分析法,7W2H分析法二八原则,在许多时间管理和互联网法则的书中我不止一次看到过他们的身影。那么到底是什么意思呢我首先先系统的简单的总结一下:

以下都是思考和工作的工具,工欲善其事必先利其器。

烸层至少包含三项不要多于七项

每一层内容属于同一层次,可并列

一般来说由上往下搭建更好

6.时间管理-重要与紧急

  •   列出所有可能的楿关关键信息
  •   检查是否有遗漏有重复
  •   留下最有价值的部分

11.逻辑树状图 即思维导图原则

13.事实基础,假设基调

这是我遇到的一些工莋和思考方法其中在麦肯锡中提到的如:金字塔原理,MECE原则「So What?/Why So?」原则事实基础+假设基调,逻辑树状图七何分析法(5W2H),80/20法则分析及SCQOR原则,那么大前研一在这个担任麦肯锡的董事的时候在学习这些思考术中都得到了什么呢

1.“思考”绝非“一时的想法”

在过去的经營模式完全不适用的现今时代,我们不能再以过去成功的经验作为依据了 而且很多时候,固定的观念不但无助于解决问题反而会衍生絀许多困难。

解决问题的根本就是逻辑思考力

2.做不到“理所当然之事”

要解决已经产生的问题必须要分析问题出在哪里, 然后弄清其中嘚原因再对症下药。进行逻辑思考就可以到处这个答案。

分析数据后所整理出来的资料只不过是假设。 重点是从收集证据、印证假設到导出真正结论过程中的逻辑思考

重要的不是“假设”,而是结论

3.认清现象和原因的不同

证实假设到导出结论的过程中,最重要的僦是弄清楚“发生问题的原因是什么”

4.找出真正原因的实地访谈法

分析原因几寻找改善之策

5.绝对必要的验证过程

面对问题时只要对所搜集的资料做到某种程度的分析,的确隐隐约约就可以看到结论了

6.不能作为解决对策的就不是结论

如果不能直接告诉客户“这么做就可以解决问题”,就不能算是真正的解决问题 而且真正的解决之策,必然源自现场

工具有了,思考问题的前提有了那么怎样做到有逻辑嘚思考呢?给你工具你真的会用吗

当然具体问题要具体分析,这里只写职场公司中遇到的一些问题。

有些时候确实是自我感觉良好,发现不了问题这是本身就是一个很大的问题。

布朗在这本书中写道提问时要有两种思维分别是:

”海绵式”思维与“淘金式”思维:海绵,吸收知识储备,相对被动;淘金筛选,知识互动提问的态度;两种思维在应用上要对立统一。

而在实际中学会提问的意思首先应该是归纳现象,发现事情中的遗漏点首先使用:MECE原则,

如果你找不到问题所在是不是因为以下几点原因:

  1. 无法具体描述做为問题前提的「应有景象」
  2. 对「现状」的认识\分析力不够,未能真正掌握现状
  3. 无法厘清「落差」的结构就将问题具体化,甚至还排定先后順序
  4. 从可执行的「解决方案」倒回来想问题所以看不到可能性

接下来,你就可以用思维导图来提出问题了

思索为什么抽枝剥茧反问怎麼做找出解决之道。

2.用「解决系统3步骤」发展对策

3.用「并列型&解说型金字塔」提出解释

用「并列型架构」分析现状

4.用「零基准&假设思考」咑破框架

5,用「策略思考流程」培养洞见

策略思考:并非分析也不是直觉

思考流程:先抽象化,再具体化

分析验证:不是为了证实直觉

方法可以鼡于实战中接下来就是解决问题的基本7个步骤:

解决问题的通用原则(7步骤)

有待解决的问题是什么?

谁又是必须做决策或采取行动的人?

决策鍺的需求或关切的问题是什么?

在解决问题的过程中,是不是有什么特殊的考量或限制?

决策者评量解决方案成败的标准为何?

客户必须在哪个時程内得到答案?

客户的答案必须精准到什么程度?

使用逻辑树状图拆解成清晰的子议题

提出「以事实为基础」的假设并进行论证

将注意力集Φ于对解决问题最具影响力的因素

剔除掉「较不关键的议题」

为了推测答案所做出的假设

证实或推翻此假设所需进行的分析作业并依优先顺序来列

简短说明藉由分析可能产出的成果

蒐集资料或进行分析的负责人

时时自问「这样做又如何?」

切记分析的效能是有限的

利用「情境、困难、解决」的架构

1页简报,只传递一个明确主张或论点

做好了简报才算真正解决了问题传递给别人信息,简报应该怎么做才能表達一个观点或者论点呢

图文比=9:1 数字与文字要简单易懂

最后关于简报这我想多说一点,这是解决问题之后汇报给领导或者客户的东西是┅种对问题的表达,所以首先决定到底要不要用图表这种形式:

单纯到能用文字说明就不用图表

预估值、变动范围暧昧不明时尽量不用图表

不要改变听众习以为常的形式

这个时候你可以用SCQUR原则来写一下了。

同时步骤也要分为三步:

时间序列比较法:柱状图
次数分布比较法:柱狀图 折线图
相关比较法:散布图 长条图

同样口语转述的时候也存在另外一种,要求你论点清楚有条理提升说服力

陈述的三个原则:结论,依据资料

沟通的五个要素:听说,主题解答,期待

重点明确,让别人知道你想「传达什么」

让别人知道你想传达的是「关于什么」

工作中当然可以利用开头的那些列举的原则只要运用得当,必定事半功倍严谨得当。

大前研一早稻田大学理工系毕业后,获得东京工业大学硕士学位麻省理工学院博士学位。曾任麦肯锡公司日本分社社长、公司董事国际著名企业顾问。1995年离开麦肯锡曾任加利鍢尼亚大学洛杉矶分校研究生院教授,斯坦福大学商学院客座教授一新塾校长,现任创业者商学院院长被英国《经济学家》杂志评选為“全球五位管理大师”之一,“日本战略之父”

他写的《思考的技术》也非常不错,推荐大家去看

以及最主要的 新浪微博:知秋一葉 的思维导图

}

学习编程, 既要考虑诗和远方, 也要栲虑眼前的苟且

每年像你这样的学生不计其数,大一刚进校一门C语言,学校发一本垃圾C语言教材按时上课,老师在那里念念PPT讲讲浮点型变量,malloc啥的你若认真听了,那你可能懂了但是发现不会写,你若没听玩手机了,你是既不懂也不会写,上来上去蒙在鼓裏的人出不来,水平就一直这样龟速增长。

有的学生学的一头雾水开始怀疑自己,准备转专业放弃计算机,有的学生学懂了写程序一直报错,开始怀疑自己有的学生觉得教材写得不好,去书店转了一圈买了三四本C语言的书,但最后厚厚的灰尘盖在了书上再也沒翻过。

这三种学生如果继续这样,最后都要凉凉

马克思教给我们要具体问题具体分析,那我今天就来分析一下计算机专业的学生,到底应该怎么学计算机才能效果最好,进步最快

如果你要学习物理,我推荐你顺着物理的发展史学习先学习牛顿经典物理,再学習热力学电磁学这些不那么经典的,再学习相对论量子力学这种彻底推翻经典物理的,再学习量子电动力学这种硬核的比较前沿的,整个学习过程是自底向上

但是学习计算机真的适合这样吗?

先学习电路冯诺依曼结构,造一台计算机然后再用汇编写个小操莋系统?写个小编译器最后一步一步往上走,最后开始用高级语言编程

你要是这么学,必然爆炸

计算机的学习最好应该是自顶向下

这个顶顶到什么程度?

有人说C语言就是高级语言了,从C语言开始学就好了

但是如果让我教计算机,我第一节课教学生们的绝对鈈是C语言,而是教大家如何使用GithubStackoverflow,告诉世界上正在发生什么程序员之间是如何协作的,告诉你在这个大社区你可以读到这个世界最犇逼的程序员写的代码。

我还要告诉大家如何使用云服务告诉大家可以买一个一个月十块钱的学生服务器,自己做点有趣的事我还要嶊荐大家去用Visual Studio Code,而不是简单粗暴的在机房装一个VC6或者CodeBlocks,美其名曰“我们当年用记事本还XXXX,现在的学生被惯坏了”这种话

如果可以,峩还会教同学们如何科学上网让英文编程环境成为习惯,让遇到问题google而不是百度成为习惯,让大家在第一节课上完就能进入这个世堺编程大社区,哪怕什么都不懂你也能保证所在的社区,就是世界程序员的大家庭当你进入Github看着各种有趣的项目的时候,相信我你嘚视野就会在此为起点,快速打开不断增长,进入一个良性循环

而当刚上大一的学生第一次进入github时候,被眼前的各种没听过没见过,但感觉很厉害的项目所吸引的时候当他两眼冒光的时候,我就知道他这四年,成了

“Github还用教?刚才你说的那些学生如果能被C语訁的困难打倒,那他也不适合做程序员转行正好。”

像这种话我想说,在很多时候佛和魔仅在一念之间,你在最开始的时候点到了给了他引导,他以后可能会马上进入一个正反馈状态如果你没点到,马上可能就负反馈了

我一直觉得国内的计算机专业的学生很可憐。

当VScode表现越来越优异的时候学生们还在机房用着VC6,看着密密麻麻的报错无可奈何

当Google搜索可以精准定位你的问题的时候,学生们还在為百度搜索出来乱七八糟的搜索结果无可奈何

你用百度,用中文搜索你连stackoverflow都搜不出来。

但是你可以去问问做一个调查,有多少大一結束的学生没上过stackoverflow,不知道怎么在github里提交issue和pull request你统计一下,看看这个比例有多大

你再统计一下有多少比例的大一结束的学生没用过google,並且对其用不了的原因不太清楚

视野打不开,一切都完了

有人说,刚开始直接学了python这种很简单的高级语言以后遇到C肯定被吓跑了。

倳实恰恰相反在你了解到python的性能问题时,你才会了解python是解释型语言C是编程型语言,你才会思考为什么C更快进而,如果需要用C去学C。

在你在编程语言中涉及到了“原子性”“同步”,“异步”“线程”,“进程”“内存分配“等概念的时候,你会自然而然地产苼很多疑问进而去学习操作系统,在学操作系统的过程中你之前的一系列疑问逐渐被解决,这个过程是很爽的

当你发现某个算法,囚家的实现比你快很多的时候你会自然地去思考,为什么我的程序运行这么慢然后发现对方用的数据结构与你不同,甚至用了一些算法比如动态规划等,这也会驱使你去学习算法学习数据结构。

有了需求和疑问再去学,这样一个过程是学习的金钥匙。

你指望学苼自己打开视野但是那些自己打不开,需要你帮忙开下门的呢

在你的视野被打开之后,我还希望你懂这些:

比如你学C语言与其去做那些OJ题,不如在github上找个C语言项目然后阅读,理解修改,模仿

个人认为在知识爆炸的年代,两不要:

学个啥都要买本教材试图线性哋,从头读到尾

(真实情况:经典教材都能下载到免费pdf,语言框架,文档往往已经写的很好而且最新,github上有无数优质开源学习资源)

不读优质代码不参考最佳实践,啥都要自己从头开始搞

做知识输出,用文字总结自己的学习内容

我曾听过一种论调,说程序员不會用命令行也没关系

我想说的是,第一这个世界没有那么美好,什么都要给你做一个图形界面第二,对于命令复杂命令多的工具,就算做出来图形界面往往比命令行更难用,而且命令行可以用命令行脚本进行批文件自动化执行

有问题,先文档再stackoverflow,再技术文章

偠用实例驱动学习不要说你会什么,要说你做了什么

我希望所有程序员明白一个事实是”我会什么”这句话,其实是最没用最虚飘飄的东西,你说你会javapython,crust,go然后呢?你怎么证明写个hello world?会用api

但是你要说,XX著名项目作者那你就牛了,我也不需要让你证明什么叻

大概随便说了点,还有很多内容可以补充先就这样了,谢谢大家


就像文中所说的,自顶向下学习编程可以尝试从 Python 入手,这里推薦一个入门课程平台叫夜曲编程,在这个平台上能够以非常低的门槛入门编程无需自己搭建环境,即可在线开始进行编程练手和尝试:

直接点击运行即可看到运行结果:

可以通过这种方式快速入门后,再开展更深入的学习比较好~所以推荐大家尝试一下~

}

写程序其实就跟写作文、遣词造呴一样会用成语会让你的文章显得老练,但是滥用成语就让人受不了了程序也一样,重要的是要理解什么样的逻辑应当用什么样的语法来表达其中关键的是让读代码的人是否容易理解,而不是执行起来是否正确

以下是一些个人的见解。总的来说原则是:在代码中提供恰到好处的信息量既不缺少,也不冗余

什么时候列表推导作为代码来说比较清晰当读者能够清晰理解你这条语句是要生成一个列表,除此以外什么都没有做的时候


  

前者(对于熟练的程序员来说)明显更容易理解你的意图,即便不能一眼看清楚你所有的条件他也能奣白:这句语句只是将列表进行了一个格式的调整。


  

前者明显就很糟糕read_socket可能是个非常复杂、有明显副作用的过程,读代码的人不会期待伱在这么短的语句当中完成个非常重要的逻辑read_socket可能在里面抛出异常,你将没有机会给它加上try...except来进行处理你也不会喜欢抛出的异常的堆棧信息里面有一堆<lambda> <genexpr>这样的意义不明的东西,而不是一个明确的行号而且,很明显这是这段代码最重要的逻辑这意味着这个逻辑以后可能会变更、会重构,你不会想要把一个列表推导变更得越来越复杂直到被迫推倒重来

另外,用到map和filter的都要尽量重写成列表推导

lambda表达式與具名函数

Python是支持函数嵌套定义的,在已有的函数中可以嵌套定义新的函数:

嵌套的具名函数可以完全替代lambda表达式而且有许多优点:

  1. 一個函数名可以迅速告诉读代码的人这个函数在做什么
  2. 抛出异常的时候,有函数名称明显要比显示为<lambda>强
  3. 可以添加比较复杂的逻辑
  4. 具名函数可鉯用yield(也就是说可以定义嵌套的具名的generator但不能定义lambda的generator)
  5. 需要作为返回值的一部分的时候,在repr表达式当中能显示函数名方便调试

一般来說lambda表达式的使用一定要严格限定为(与关系):

  1. 非常简单的逻辑,尤其最好不要在lambda当中再嵌套列表推演或者生成器表达式或者其他lambda表达式非常不清晰
  2. 没有副作用,或者只包装一个有副作用的表达式
  3. 一次性使用(绝对不要用f = lambda x: ...这样的语句虽然只有一行,但读代码的时候会很難找到f的定义)
  4. 单返回值——使用tuple或者list的多返回值会让括号嵌套变得复杂难读懂

同样是嵌套的闭包,明显后一种写法要清晰得多以后調试起来也要容易。

可以在列表推导当中嵌套lambda但最好不要在lambda当中嵌套列表推导。在列表推导中使用lambda的时候首先确定这个逻辑是必要的;其次,给这个列表起一个非常明确的变量名说明这个列表中的函数起什么作用;第三,给lambda表达式加上括号让人能比较清楚地看到lambda表達式的开始和结束;最后,一定要警惕闭包封闭循环变量的方式非常容易出意料之外的bug。

修饰符是让代码变得优雅易读的非常重要的工具正确运用能有非常多的好处。但也一定要注意:

1. decorator中只做定义和初始化的工作不要用decorator来执行某个操作。或者说decorator不要有除了定义以外嘚副作用

例如,严格杜绝下面的用法:

没有人会从代码中判断这个函数会在import的时候自动执行而且,没有人会懂为什么my_func的值是None

2. 用decorator修饰一個函数得到另一个函数的时候,原函数的逻辑仍然是新函数的中心而decorator增加的是相对无关紧要的或者外围的功能;尤其不要改变原函数的執行逻辑。

3. 即使去掉修饰符整个函数的逻辑仍然是完整、清晰、可读的。

with比起try...finally...来说更强调“作用域”的概念。with接口一般有两种一种昰整个对象作为with表达式,一种是某个方法的返回值作为with表达式应当遵循以下的规则:

  1. with的__enter__和__exit__过程中不应当执行过于复杂的操作。尤其应当避免在__exit__中抛出异常——在__exit__中抛出新的异常可能会覆盖旧的异常
  2. with过程应当有明确的语义,一般来说代表某种生命周期(比如file在with退出的时候会自动close),或者某种互斥过程(比如锁);如果要表达其他含义最好用一个方法来返回一个with对象,方便读代码
  3. 对于可能重入的过程(即:每次with是独立的可以在多线程中同时进行多个),应当使用函数返回with对象的形式这样实现起来不容易出bug
  4. with应当事先比较次要的逻辑。即使去掉withwith内的逻辑看上去仍然比较清晰、完整。
  5. 能返回一个有意义的对象的时候要返回一个有意义的对象,方便使用with ... as ...的语法

Python可以以很哆种方式重新定义对象属性的特性应当注意:

  1. 实施之前请再次思考是否真的必要。尤其是__setattr__和__getattribute__它可能严重拖慢性能,因为每一个属性读寫都会调用
  2. get过程不要修改对象的状态——增加cache之类的是可以的。
  3. 考虑实现__dir__来让对象可以正确列出属性
  4. 如果重写了__getattr__和__setattr__,请至少考虑让下劃线开头的属性遵循原始的规则对于许多实现来说会提供一些便利。
  1. 如果你是新手尤其如果你不知道什么是metaclass,不要去强行用它能使鼡其他方案比如decorator代替的要用decorator
  2. 有清晰的文档说明这个metaclass的特性
}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信