面向设计师的Python基础教程 — 第一课 为什么学编程&为什么学Python

一、关于本系列教程

Rhino5时代McNeel推出了Rhino.Python,McNeel不仅老老实实的将原RhinoScript语法全部移植了过去,而且Rhino.Python本身就基于IronPython平台,大有推新除陈之势。IronPython是为了实现在微软.net平台使用Python语言而开发的一个平台,我们知道传统的RhinoSDK工具RhinoCommon便是基于.net平台,因此Rhino.Python不仅能进行类似Rhinoscript的外层建模工具的参数化编程,而且能使用Rhino底层的开发库进行Rhino插件一类的程序开发。因此作为准备以Rhino为主要参数化应用平台的同学们,在掌握Grasshopper之外还想掌握一门代码式编程语言的话,Rhino.Python无疑是你最好的选择。

clip_image002clip_image004

目前Rhino.Python网络上已经有一些教程,例如原厂出的《RhnioPython101》 ,shaper3d的jorin同学的“跟我读 【RhinoPython 101】系列视频教程”等。但我觉得已有的教程并没有从涉及语言本身的基础性知识开始,一开始就在Rhino平台上进行形态建模的编程,例如《RhnioPython101》只是对《Rhinoscript101》的简单改写。这或许无助与你遇到其他一些算法问题需要解决时的思维问题。

clip_image006

学习编程一定不要眼光只放在一个语言平台上,尤其是学习你第一门计算机语言时,你更需要学习的是算法思维/计算机科学家的思维,这样你学习这门知识才是对你一生有帮助的,保不住明天更为强大一款针对建筑师的参数化平台产生。

因此我的这系列教程打算分成这几个部分,第一部分不会接触Rhino.Python,直接从原生的Pyhton平台和一个优秀IDE(编程平台,具有高亮语法、错误识别、debug等功能)JetBrains PyCharm开始,第二部分开始介绍Rhino.Python的对应形态生成(点线面、线面编辑、移动变幻等操作),第三部分分参数化设计类型来介绍Rhino.Python辅助我们参数化设计的方法,或许会有与其他平台如Grasshopper交互的部分。

clip_image008

本系列教程针对所有0基础和初学者的同学,当然你有一定的Rhino脚本编写基础也不妨看看,或许对你有帮助。

二、为什么要学习编程

对于那些还没有接触过代码编程或正在彷徨要不要学习一门编程语言的建筑学子来说,你需要解决的第一个问题便是“我为什么要学习一门编程语言?”

或许有相当部分同学会觉得,代码编程是那些为了进Google、苹果或腾讯的计算机专业学生才选择学习的技能。的确如果仅出于工作上的考虑,我们这个时代的建筑学子大可不必在匆忙的学习中抽出时间来学习编程,学好CAD、SU、Rhino二维和三维绘图,苦修设计能力,熟练规范对于以后从事的工作来说足矣,Autodesk、Mcneel公司的程序员会逐渐为我们添加这个行业需要的软件功能,何苦再去费时费力学习之前从未接触过的代码编程呢。

首先我们来看看这样一些事实,在我们的生活中,从我们乘坐的电梯楼层跳转,到公交车上的刷卡消费,再到手机里的精美Apps,无不依赖与程序算法控制,计算机科技带来的生活体验已经深入到我们身边的绝大部分事物。的确正如爱因斯坦所言,科技正在使人变傻,你是想做一个无脑消费技术的“傻子”,还是想窥探这些事物背后的奥秘呢?

clip_image010

建筑和人类生活如此的紧密相关,以至于任何试验性改革都不可能首先在建筑身上发生,因此建筑学是一个技术和艺术都双层滞后的学科。我们来看看其他学科的人都在干什么,学机械的在开发机器人、无人驾驶汽车相关算法,学物理的在计算机中用程序模拟现实世界、学化学的用算法进行分子模拟,还在就Fortran 还是C语言在分子化学编程中好喋喋不休的打口水仗、学艺术的开始用Processing做视觉特效,用html和css美化我们的互联网、学管理学法学的学子都会用到数据库知识建立各种数据统计模型进行研究、就连我们的邻居土木工程学子都能够熟练掌握Matlab语言进行新型结构设计,难道你还要守着老旧的建筑设计方法不变么?

数字技术经历了引领工业制造领域的全方位变革之后,现在正在建筑领域大放异彩,目前你们都已经知道数字技术已经而且必然将是建筑学未来发展的一个主潮流。

建筑学子拥有编程技能对于你个人而言至少有以下好处:

能够快速掌握任何一款新的软件

有一种说法,任何一款计算机软件都是一门高级计算机编程语言,它们都是程序员通过各种高级编程语言开发而成,程序原理和算法逻辑深深根植于其中。除了能快速学习基本功能,我们所用到的各种二维三维图形软件都提供了用户扩展的编程图形工具,如Rhino上的Grasshopper,Autocad上从以前的lisp语言到现在最新的.net编程扩展平台,有了编程能力,这些用于特殊设计的需求的扩展功能的学习也能很快入手。

保持竞争力

无论你是打算在设计院做设计工作,还是打算在学院做科研工作,编程能力都将在你以后的工作中让你保持对他人的竞争力。暂且不谈建筑学未来的创造性工作在哪里,但目前建筑形态要求越来越复杂几何外观,建筑设计考虑越来越多的量化条件,建筑理论逐渐被数字渗透,建筑物理越来越依赖于模拟先于实测。完成这些工作最有效的方法就是将你的思维转化成代码然后交给计算机来完成,而目前仅有少数人能够把清晰的思考变成可执行的算法代码。

提高效率

会Grasshopper的同学知道,GH编程很多时候并不一定需要用来进行复杂曲面的建模,简单形态需要重复建模或者按某种规律建模的时候GH往往可以派上大用场节省时间。在我们二维三维建模,或一些日常科研数据的处理中,有大量的重复性工作,编程能力可以极大的帮助我们在处理这类问题中提高效率,节省时间。

计算思维

我一直认为,计算机是人类有史以来最伟大的发明,目前每个行业的问题解决、方案设计、行为研究多少都必须依赖于计算机。可以说,对于现今的计算机普及程度,一个人可以主修计算机科学而从事任何行业。大概有不少同学在设计院中已经感受到了那些计算机牛逼的同事所具有的一系列创造性的工作方式带来的压力。在下一个时代,计算思维必然普及到每一个学科的基础课堂中,这是不可避免的趋势。

而对于我们而言,从现在开始就学习一门计算机语言是赶上这个时代未来发展的必要条件,然而不同于我们之前的学科,学习编程所面对的不是自然物理世界,而是一套从数学(计算、几何)和逻辑学的基础上建立起来的人工系统。利用这套人工系统将现实问题抽象成基本数学符号、逻辑语言的能力便是计算思维。记住它是人的思维方式,而不是计算机的思维方式,而它是由近代的计算机科学家、逻辑学家和数学家设计,有一套明了的规则和哲学思维在其中,因此纵然某些同学的抽象能力很好,但掌握这套规则也是利用计算思维的必然途径,而对于我们中国学子而言,绝大部分计算机语言都是以英语语言为基础,无疑给我们的学习又带来很多难度。

三、为什么选择Python

目前这个世界上光活跃的语言大概都不少于100种,为什么我要建议选择Python。

先说说Python的故事,在最新一期的权威计算机语言排名TIOBE排行榜上,Python排名第八,在这个排行榜前十位上,Python也是最年轻的一位。对于一些觉得Python应用面太少的同学这个顾虑可以打消了,目前各种层面的应用上,都可见Python 的身影,文艺青年喜欢上的豆瓣、宅男下片儿的uTorrent、玩家玩的Torchlight,还有逆天的Google Apps Engine等都是基于Python开发。Python的创始人为吉多·范罗苏姆(Guido van Rossum),Python的图标便是两只环绕的小蟒蛇,得名于作者当时最喜欢的巨蟒马戏团(Monty Python)。目前Python是由一个开源社区维护,吉多·范罗苏姆仍然是领导人。

clip_image012

Python的设计哲学是“优雅”、“明确”、“简单”。用Python写出来的程序要比其他语言简洁很多,这是为世界所有程序员所公认的,而且Python年轻,它具备了传统语言的强大性和通用性,可以运用于在各个平台,兼具当代语言面向对象的全部特性,而又能够进行适合于初学者的结构化编程方式。当然这些特性并非Python特有,下面我们来看看为何我特别推荐建筑学子学习入门语言采用Python。

我读小学时候学校便开设了计算机课程,大概是为了应付当时全国上下素质教育的广大呼声。但配套的老师却对此也是几乎一窍不通,学校便买来课本放在课桌上学生自己学习,很幸运学校买的是一本计算机语言教材。我在那儿接触了我的第一门语言是LOGO语言,这是一门专门针对幼儿开发语言程序,有一只可爱的小海龟,具有较好的二维绘图能力。再往后我自学了B系语言,Q-Basci、GV-Basic和C系语言C 、JAVA,在大学本科时候为了保持自己在编程上不丢才接触了Python,现在也没有放弃其他语言,我现在常常工作的Anylogic平台便需要用JAVA进行代码编程。当时也比较了一下Ruby,不过因为后者是小日本开发的,所以就没有深入下去。

当然我会的语言不多,技术也不高,一个正常的编程高手通常都会掌握半打的计算机语言。但在接触的一系列语言来说,我最喜欢的就是Python,而且觉得Python应该是我们建筑专业学子入门掌握的最佳语言,有如下理由:

绝佳的应用平台

前面已经讲到过,Python是McNeel选定的Rhinoscript的代替者,已经完全整合到了Rhino参数化设计平台中,即有丰富的建模库,又可通过IronPython的.net编程属性直接利用RhinoSDK的全部工具,这里面就包含了强大的RhinoCommon库,同时还与Grasshopper完全整合,可以用到GrasshopperSDK中的全部库,也就是说Grasshopper中的每一个运算器都可以用Python实现。它是我们在Rhino平台上进行参数化设计的绝佳辅助工具。

除此之外,MAYA、3DMAX 、Houdini、Blender等许多主流的三维建模软件、Catia、Arcgis、Revit、FreeCAD等常用的设计辅助和BIM软件都支持Python脚本扩展。

整合其他语言的能力

可能会有一些更主流的语言,如C、VB在辅助设计类软件中用得更加广泛,但Python十分优秀的一个地方是Python社区开发了大量的第三方语言接口模块,能够直接使用其他语言的库,例如IronPython可以使用Python使用微软.net库,Boost.Python可以让Python调用C++编写的代码。Google许多项目在开发的时候会使用C++、JAVA等来完成完成一些对程序效率要求较高的片段,然后使用Python将其整合起来。

Python本身的完美设计帮助你理解编程的本质

Python的设计让程序代码明确、简介,没有过多花哨的特点。什么“指针”、“泛型”、“堆栈”,虽然它具备这些特性,但你在学习Python时完全可以避开这些复杂的概念,而你在学习JAVA等语言的时候,一开始上来许多复杂的概念就直接把你的头搞大。Python具有完美的图灵完整结构和清晰的语言结构,你只需掌握很少的规则便可学会Python 的运用,而这些规则就是计算机程序语言的本质部分。Python的代码可读性也非常好,很少会让你在阅读时产生歧义。

其他不那么技术的理由

很多前面已经介绍了,掌握在高级语言中算非常容易的、完全免费、程序规模不大时运行较快、较为强大的社区支持、丰富的各种库、最后YouTube、Google、Yahoo!、NASA都在内部大量地使用Python,所以也不要怕它会过时。

当然,Python也有一些不足:1 没有商业性的大公司在主导维护,Python缺乏一些预包装的解决方案,例如VB有微软在维护,各种现成的库数不尽数,JAVA有SUN在维护,Objective-C有苹果在维护,不会代码的人,直接像拼积木一样就可以进行IOS苹果设备的应用开发,而Python的这些在某些问题上会使得解决方案成本过高,但对于我们建筑学子来说,这一点完全不成问题,因为我们不会去开发一个网站,即时通讯系统,游戏等,我们需要的,就是用它来辅助设计;2 Python没有许多花哨的方法,例如不支持函数重载,导则有些时候的运行效率不高,与C++等相比可能会较慢,不过根据二八定律,大部分程序对速度要求不高,如果非要追求程序速度,可以使用C++改写部分核心程序,利用JIT技术(前面提到的整合其他语言)整合;3 GUI库的缺乏,现在的程序越来越追求美观,但Python比较缺乏GUI库,也就是程序界面部分相关的库,但对于我们建筑学子来说,这也不是问题,因为我们很少会进行程序开发,顶多也就是开发一个插件,而且无需太注重程序界面,设计出来的建筑好看才是第一。

四、对于初学者的建议

有些个人建议对坛子里的初学者说,当然这些建议也会贯穿到我的后续教程当中

1 不要试图一星期学会编程,编程的学习应该是一个长期的过程,我们要认识到对这一工具的掌握将使我们受益终身,而一知半解也是非常危险的,所以我在这第一课里面完全没有开始关于Python编程的具体部分,而是花了大篇幅让你们认识到这一技能的重要性。学好编程需要对这一技能具有持续性的兴趣,需要经过许多艰苦的练习,而不是一星期就可以完成而且到处炫耀的。我之前在网络上发表Rhino教程时,第一课也这样讲过,而且推荐了一篇文章《用十年时间学习编程》(Peter Norvig ),这里同样推荐各位阅读一下,用任何搜索引擎在网络上可以找到这篇文章。

2 不要采用那些用于什么国家计算机考级而编写的书籍作为你的初学教材,并非这些教材无用,而是这类教材用于应试性的编写方法,充斥了大量的无趣习题和洗脑填鸭式概念灌输方法,大部分情况下这会彻彻底底毁掉你对这门美妙艺术的兴趣。

3 关于英语和数学

两者都没有那么重要,不要被编程语言的这两个特点所难到。首先是英语,像Python等绝大部分语言都是基于英语自然语言的的,但要求并不高,对于程序本身而言你只需要掌握最基本的单词(如If、For、Next、While、include等)就能很好的理解编程本身,唯一的难度在于许多的编程代码中有大量的英语注释,可能是一些复杂的描述。

就数学而言,计算机语言是基于数学发展起来的,当然你数学越好对于学习编程来说会越有优势,但是我们这些建筑学生大概本科一年级学完高数之后就再也没有去钻研过数学的知识,就我的经验而言,只要你会基本的代数运算,几何数学知识是完全能够掌握编程的,当然仅仅会加减乘除也是不够的,至少你要会代数方程、集合映射一类的高中数学知识。而且你在学习编程的过程中,数学能力会不可避免的进步。

4 遇到问题去寻找吧

当你被一个问题困扰得一筹莫展时,去寻找吧,利用各种已有的资源,你遇到过的问题前人也遇到过,不要试图重新制造车轮,特别是在处理实际问题时,采用一套已有的解决方案能够节约你大量的时间,这也是最好的学习知道。特别的Python是自足的,各种问题的解决方案在互联网上都能找到答案或者是方向的。

5 先学好一门语言

先学好Python吧,然后再去接触其他语言,不要今天学Python明天学JAVA,对于初学者的你来说会造成你知识无法掌控的混乱,例如Python用缩进,JAVA用括号,最后你写出来的东西一排是括号一排是缩进。你在学好一门语言之后想在编程上有进步,学习另一门语言是必要的,但此时你可以快速,差不多一个星期内掌握这个语言的特点,在有资料可查询的情况下应用于实际或科研项目上。

五、相关资源

当然我会持续更新教程,个人时间有限,不可能一天更新一篇,但对于有些同学来说不免慢了点,Python有大量的学习资源,而且很多优秀资源都是免费的,你不需要从书店购买。我暂不推荐各位直接用《RhnioPython101》入手,先学习Python的基本知识,再学习Rhnio平台上的Python三维图形编程。推荐的一些资源如下:

• 官方Python文档,这是查阅基本库和函数用法的最好工具,http://docs.python.org/3/

• 《Python核心编程》(美)丘恩(Chun,W.J.)著,可下到中文版电子书。

• 《Think Python》,免费电子书。http://www.greenteapress.com/thinkpython/thinkpython.html。

• 《How to Think Like a Computer Scientist-Learning with Python》,电子书,网上可找到。

• 《笨方法学Python》,免费在线教程,http://learnpythonthehardway.org/,也可在网上找到中文版电子书。

• 《Thinking_In_Python》著名的程序语言教材作家Bruce.Eckel著,网上也可找到电子版。

• http://diveintopython.org/,在线教程。

• http://python.cn/,中文Python社区,有不是最新版的官方文档中文翻译。

然后你可以学习Rhino.Python,目前它的学习资源不多:

• 《RhnioPython101》

• McNeel官方社区http://python.rhino3d.com/

• Grasshopper的Python运算器页面http://www.food4rhino.com/project/ghpython

• 搜集了一系列教程的页面http://www.plethora-project.com/education/2011/09/12/rhino-python-tutorials/

• 一个简单的Python入门教程http://code.algorithmicdesign.net/Introduction-To-Python

• http://code.algorithmicdesign.net/有许多算法建模的源程序

以上内容和建议仅供参考,再重申一下本系列课程针对入门者和初学者,至少在前期会是,由于针对的是建筑学子,基本上不会涉及GUI、网络编程、数据库技术和其他第三方Python库,若你想学习这类知识请寻找其他教程,本教程也会循序渐进,到后期可能会有一些复杂的问题,本人水平也有限,有高手发现有不对的地方还请指出,本教程将在NCF连载,对于版权有两点说明:1在本教程没有连载完成之前请勿转载到任何其他论坛或个人博客,请尊重知识成果;2 片段式(不超过一次教程的三分之一)的转载和免费教学使用允许,但必须符合非商业、署名、不可修改这三个条件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注