(二)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强类型的一个标志?