(一)我(非初学者)学Python的方法
在正文开始之前,我先说说自己学Python的方法。接触了不少语言了,但我写的代码90%都是C,加上一些计算机的基础知识,所以我这个家伙也就勉强算是个非初学者吧。我这里说的,就是针对非初学者学习Python的方法,或者说也可以推广为非初学者学习一门新语言的方法了,嘿嘿,咱写程序的,抽象能力得好是不?闲话不多说。首先,得找一本python入门的经典书,在网上搜搜,我读书,只读经典。我选的是《Beginning Python From Novice to Professional 2nd Edition》。然后,看书,先看前言,要先知道本书的针对人群以及一些版块的功能,还可能有一些学习方法,扩展资料等。一本书的前言很容易被人忽略,但有时候前言中会包括一些很重要的信息,有点像磁盘的分区表,路由器的转发表之类的。
接着,就是阅读正文了(这里感谢一下博客园团队教我的用两个全角空格排版的方法,非常的实用)。入门级的书籍一般都是针对没有基础的初学者设计,既然我们不是初学,有很多理论已经明白,比如变量啊,数据类型什么的,这些东西就没必要细看了。我们所关注的应该是:语法,常用数据结构,还有一些Python语言比较特殊的地方。我的方法就是,直接略过文字,看例子程序,如果能够看懂,就在机器上对例子程序进行变幻,试试结果,没问题就继续看,如果例子程序没看懂或者程序结果和我想的不一样,再停下来看文中的描述。这样通看全书例子我觉得有几个好处:1.不漏掉一些虽然简单但是很重要的语言细节。比如 1,2 是声明一个元组,但print 1,2却会打印出1 2.以前我就吃过这样的亏,花了5分钟看完了shell的语法,然后就去看小的project,结果在很多地方卡住,到处找资料,结果却发现很多问题都是基本的语法问题,在书中的例子中都体现的很清楚。虽然通看全书会多花不少时间,但这绝对是厚积薄发的前提。2.通过大量代码示例感受这种语言的代码风格。3.花费很小的代价了解很多基本函数。这也就省去了一些查函数文档的时间。基于这3个原因,所以我最喜欢那种代码与文字描述并重的书。
看完例子,就可以看project了,实战很重要!很高兴《Beginning Python From Novice to Professional 2nd Edition》这本书中就有很多小的project,所以也就又省下很多时间了。磨刀不误砍柴功,可以开始畅游python了。
(二)Python简介
Python很自由,语法简单,函数库多,我最喜欢Python的就是它的缩进,哈哈,全都要靠缩进来解释。对于我这种只爱读清晰代码的人来说简直太棒了。
先把一些需要注意的基础给列出来:
1.'/'除号与c不同,单个'/'是浮点除,两个除号'//'才是整除,而且整除也适用于浮点数,比如3.5//2.2,结果是1.0。
2.乘方的符号是**,两个乘号,太好玩了。
3.Python直接就支持大整数运算,我还用C写过大整数的运算算法,好长的。
4.输入用input,输出用print ,这两个东西都非常灵活,也很好玩。
5.模块,有点类似于头文件,from math import sqrt,这样就可以直接用sqrt函数了。我记得我一哥们读中学的时候,做解方程的题,一个大题下有10个小题,老师要求每个题都写个"解:原式=",然后,那哥们直接就打个大括号,在括号外面写了个很大的"解:原式="。现在想想,真实有异曲同工之妙啊!这里的math就是那个"解:原式="。
6.string可以用单引号括起来,也可以用双引号,没什么区别。当然不能单引号,双引号混用,会有syntax error,这是我试过的,我记得我学shell时也试过,哈哈,天性啊!前段时间用C写了个简易的shell,我只想到用宏替换来实现单引号和双引号的混用,但这样会有问题,比如python中' "happy every day" yes '就会出现混乱的情况。但我现在还没想到更好的办法。三个引号用于一个string分成多行来写。
(三)常用数据结构----list(列表)
list是一种线性的结构,类似于C中的数组,但方法比数组更多。通过对list的一些方法的调用可以实现栈,队列等常见的线性数据结构,可见list是非常灵活的。以下是我总结的list的基础知识点以及一些值得注意的地方:
1.list可以被修改,包括添加,删除,段添加,段删除等,方法很多,运用很灵活。至于具体的函数到处都可以查到,我就不赘述了。
2.list中的元素,类型可以不一样。比如 list1=['neilhappy',123]。这一点就与c中的数组,c++中的容器有区别了,这两者在声明过后,容器中的数据类型都是相同的。
3.list可以通过下标来访问。比如:list1=['a','b','c'],那么list1[0]='a'。还可以访问一段元素,比如list1[0:2],是一个半开半闭的区间,左闭右开,所以结果是['a','b']。还可以加一个参数表示递增的数目:list1[0:2:2],跟matlab很类似。还有一点令我很惊喜,list还可以用负数下标来访问。list1[-1]代表最后一个元素,即'c'。这下strlen,sizeof等函数都可以略微休息下了。
4.string与list的区别。当然,string可以作为list的元素,更重要的是,string可以直接相连:"neil""happy"。但是list必须要有个+号:['neil']+['happy'],结果是['neil','happy']。这一点需要注意一下。
5.list的乘法。这又是我很喜欢的一个特性。以往声明c的数组时:int a[100]={1,2,3,4,5,5,5,5,5,5},好几个5,数的眼花,这下好了,在python中:a=[1,2,3,4]+[5]*6。哇,世界清静了。
(四)常见数据结构----tuple(元组)
tuple与list非常类似,但tuple就像一个被严重限制的list,不准动(被更改),不准变强大(有很多methods),声明方法是tuple1=(1,2,3)或者tuple1=1,2。访问方法与list类似,不再赘述。
(五)常见数据结构----dictionary(字典)
dictionary,实际上就是一组mapping,一种散列的思想。需要注意的知识点:
1.形式。dict1={'name':'neil'}。这里的'name'就是key,'neil'就是value。dictionary就是一些key-value键值对的集合。
2.浅copy与deepcopy。与c++基本类似,浅copy就相当于copy指针,而deepcopy就是在copy指针的同时还要分配相应的内存空间。
3.访问方法:dict1['name']的结果就是'neil'。注意,在dictionary中没有order的概念,所以就不能像list一样用数字下标去访问,得用key去访问。
(六)三种数据结构的区别与联系
python中的容器可以随意的互相包含,这三种数据结构也是如此。list,dictionary可以进行修改,而tuple,string都不能修改,但dictionary的key又必须是不可修改的,即tuple,string。想像一下如果字典的索引都在随意修改会发生什么?
三种数据结构的声明一定要注意,括号不同,数据结构就不同。list:list1=['neil','happy'],这里是方括号。tuple:tuple1=('neil','happy'),这里是圆括号。dictionary:dict1={'name':'happy'},这里是大括号。这里很容易就写错,有可能会造成比较难找的bug.
(七)常见数据类型----string
我记得Peter Weinberger说过:"所有的C程序都做同一件事,观察一个字符,然后啥也不干"。可见string的重要性。也跟上面一样,直接写出我的总结和需要注意的地方。
1.string的访问方法与list,tuple基本一样,string也和tuple一样,不允许修改,但string的方法比tuple强大的多。函数太多,不一一叙述了。
2.用%来进行string的格式化输出。其实与C也没什么太大的区别。
>>> str1="%s %s every day" >>> name=('neil','happy') >>> print str1 % name neil happy every day
(八)基本语句
没什么其他说的,直接写吧:
1.print 1,2,3。这个很好玩,打印出1 2 3 。注意有空格。
2.print a or b.这个语句就相当于if(a!=0){print a};else{print b};极尽简化,太美妙了。
3.unpack机制:很美妙的机制,在我学C的时候我就想,能否一个函数返回多个值,哈哈,python帮我实现了。
>>> tuple1=(3,2,1) >>> x,y,z=tuple1 >>> x,y,z (3, 2, 1)
4.缩进来断句,我觉得这是python的精华啊。
5.控制语句:if,elif,else,for,while,break,continue,基本与shell类似,只是要多个冒号,少个括号,多了缩进。简单介绍一下就可以了。
if statement1: print something1 elif statement2: print something2 else: print something3
6.x is y.判断x,y是否为同一个对象。举个例子,一目了然。x==y判断x,y是否相等,但相等的两个对象不一定是同一个对象。
>>> x=[1,2,3] >>> y=[1,2,3] >>> x==y True >>> x is y False
7.x in y.判断x是否在y中。很简单,但很实用。
8.循环中的else语句。当我们想判断一个序列中没有一个数时,用循环常常需要添加一个标志变量来做到,比如:
values=[1,2,3,4,5] flag=1 for x in values: if x==6: flag=0 break if flag==1: print "No!"
如果改成这样for中的else:
values=[1,2,3,4,5] flag=1 for x in values: if x==6: flag=0 break else: print "No!"
我感觉很是奇妙。
9.list中用for:
>>> [x*x*x for x in range(1,5)] [1, 8, 27, 64]
(九)学习过程中的一些笔记和注意事项(英文来自《Beginning Python From Novice to Professional 2nd Edition》)
最后是一些我学习中的笔记和注意事项,比较散,但我觉得比较有用。
1.空值有多种表现形式:False,0,None,"",{},[],()。
2.Remember the Python motto of learning: use the source (which basically means read all the code you can get your hands on) .多看源代码。
3.Blocks are indicated through indentation, and only through indentation in python.
4.缩进断句使得代码风格比较固定。
5.Make sure your comments say significant things and don’t simply restate what is already obvious from the code.写注释,绝对不写废话,绝对不简单重复代码所表达的意思。
6.any object can contain other objects
7.If a function call returns a sequence, you can index it directly.
8.要注意list的方法是否修改了list本身,是否具有返回值。这个只有多用才能有较深的印象。
9.python的强类型与java,c等强类型的比较。python,str1=1,还可以str1="aaa"。但是在c中,int a=1.1会直接截断小数部分。
10.
>>> 'ad c d'.translate(table,'c') 'cd d' 注意这里删除'c'是先删除'c',然后再进行替换
11.print u'ærnæringslære' 前面加个u是使用unicode编码
12.在dictionaries 中,in操作符只能用于key而不能用于value.
13.Checking for key membership in a dictionary is much more efficient than checking for membership in a list. The difference is greater the larger the data structures are. 但我不明白这是为什么
14.在python中,交换两个数是如此的简单,x, y = y, x 而三个数的交换本质上还是要用两个数的交换去完成.
15.变量都需要先赋值才能使用。这也是python强类型的一个标志?
(十)小结
以上是小弟我对python的一些基础知识的总结,由于小弟我水平有限,如果有错误,请您指出来,非常感谢。
参考资料:《Beginning Python From Novice to Professional 2nd Edition》