您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > python 速成指南
python速成指南作者:doudehou@gmail.com第一节.过程式pythonpython的一个特点是不通过大括号{}来划定代码块,而是通过缩进。如果和C/C++类比的话,就是在左括号的地方不要换行,然后用一个冒号(:)替代,C/C++大括号内部的东西,缩进一个tab或者几个空格都可以(但需要保持一致),比如:if(x2):print'x2'elif(x2):print'x2'else:print'bingo!'print'x=2'注意两点:一是python语句结尾处没有分号(;)作为结束标记。二是和C/C++不同,没有elseif,而是用elif替代,相当于可以少打几个字符吧。类型系统比如int,string等,type()可以返回数据的类型,如:type(1)type'int'type('123')type'str'python尽管在声明变量的时候不指定类型,但变量其实是有类型的,用c++0x的概念来表达的话,实际上python的变量好像都是auto的,类型自动根据赋值推导出来。所以这样:name='ddh'verb='is'noun='goodman'sentence=name+verb+noun没有问题,但:name='cyberscorpio'age=32sentence=name+age就会引发异常,因为字符串和数字不能直接相加。可以通过int()或者str()强转类型,如上一句改成:sentence=name+str(age)就不会有问题了。容器类型python提供好用的两个容器:list和dict。插句题外话,其实最好用的容器还是PHP提供的关联数组,一个数组就包括了python中list和dict的全部功能,实在是很赞。list类似array的概念,例如:lst=list()lst.append('123')lst.append('456')lst.append(1000)printlstforxinlst:printx,'typeis',type(x)注意list内的数据可以是不同类型的,这一点会很方便。上面的输出是:printlst['123','456',1000]#注意这里是list的字面表示方法,如lst=['123','456',1000],lst自动成为一个listforxinlst:...printx,'typeis',type(x)...123typeistype'str'456typeistype'str'1000typeistype'int'#这个是整型的数据dict类似于std::map的概念,当然,和list类似,dict的key和value不要求是同一种类型。如:dct=dict()dct['name']='cyberscorpio'dct['age']=32dct['sex']='male'printdctforkindct:printk,'is',dct[k]输出为:printdct{'age':32,'name':'cyberscorpio','sex':'male'}#注意这里是dict的字面表示方法,如dct={'age':32,'name':'cyberscorpio','sex':'male'},则dct自动成为一个dictforkindct:...printk,'is',dct[k]...ageis32nameiscyberscorpiosexismale判断一个key是否在dict中:dct={'name':'ddh','age':32,}if'name'indct:print'thedicthasanameandwewilldeleteit...'deldct['name']可以使用del删除这个key。另外ifkeynotindict可以判断这个key是否“不在”dict中。list和dict均为某种对象,它们支持的方法(method)可以通过语言内置的dir()来获取,比如:dir(lst)['__add__','__class__','__contains__','__delattr__','__delitem__','__delslice__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__getslice__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__setslice__','__sizeof__','__str__','__subclasshook__','append','count','extend','index','insert','pop','remove','reverse','sort']比如append(),insert(),sort()什么的,都是list很常用的方法。而:dir(dct)['__class__','__cmp__','__contains__','__delattr__','__delitem__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__init__','__iter__','__le__','__len__','__lt__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__setitem__','__sizeof__','__str__','__subclasshook__','clear','copy','fromkeys','get','has_key','items','iteritems','iterkeys','itervalues','keys','pop','popitem','setdefault','update','values']has_key(),keys(),values()等都是dict常用的方法。用dir('123')则可以看到string支持的所有方法,总之还是比较方便的。循环简单的for循环,如:foxxin容器:对x做操作这是对容器进行枚举的很方便的做法。其他的循环方式还有while,如:while测试:循环体注意在循环中我们仍然有break,continue等跳出或者继续循环的指令,和C/C++是一致的。函数函数定义:def函数名(参数列表):函数内容值得注意的是,函数中变量默认是local的,如果要访问全局变量,那么需要在函数中声明其为global的,如:bar=0deffoo():globalbarbar=bar+1printstr(bar)参数列表这里面颇有玄机,python具备和C++相同的两种参数列表结构,就是(var1,var2)和(var1,var2=defaultvalue)这两种,但除此之外呢,和C/C++的…类似,python还有两种针对不定参数个数的独门武功,举例说明:deffoo(*params):iflen(params)==0:print'noparameter'#如果调用方式为foo()则进入这里elseprintparams#如果调用方式为foo(1,2,3,4),则这里输出为(1,2,3,4),params是一个tupledefbar(**params):iflen(params)==0:print'noparameter'#bar()elseprintparams#bar(name='ddh',age=32),则这里输出为{'name':'ddh','age':32},params是一个dict。对于**这种方式,调用函数的时候,必须指定参数的名称和值,名称不需要带引号,但进入函数以后,自然成为同名的字符串,如上可见。Python所有的变量(不仅仅是传参)都是基于引用的,但是python的对象分为两种,一种叫immutable,还有一种叫mutable,区别在哪里呢?后者具有方法来改变自己,比如list.append()等,而str就是immutable的,也即,所有的str方法都不能改变自己(比如str.replace()是返回一个被替换过的str,原来的str不变)。这样的话,我们这么来看:deffoo(s):s='456'name='123'foo(name)首先,name本身不是对象,它是对一个str且内容为'123'的str对象的引用。其次,在foo函数中,s是对同一个对象的,引用,而不是对name的引用。那么可以断定:1.对s的改变无法影响到name,因为name并未被引用进来。2.s='456'只是把s换成了对另一个内容为'456'的str对象的引用,无法改变之前那个'123'的str对象。3.因为str不提供改变自己的方法,所以,foo函数无法改变name所指向的对象的值。这么来看的话,immutable对象创建出来之后就不能变了,比如:s='123's='456'这里第一句,s指向一个内容为'123'的str对象,第二句,s指向一个内容为'456'的str对象。第一句中的对象,没有被任何人引用了,之后会被“废料收集”程序废掉,但我们不能改变它的内容。另:参见附录一《对python中引用问题的再思考》。除此之外,函数就没什么神奇的地方了,比如可以通过return返回一个值等等,这些都是老僧禅痰了。TRY...EXCEPT对于出现traceback的错误来讲,可以通过try...except来挽救。比如:defsafeint(sval):try:returnint(sval)except:return-1这样,safeint('xxxx')就不会出现traceback了,因为int('xxx')会被except捕获,正常返回-1。第二节.面向对象的python其实前面的str,list还有dict都是某种意义上的类(class),只不过是内置的而已。如前所述,dir()可以列出类和对象的方法(method)。class和self和c++一样,python也用class定义一个类:class类名称:类的文档字串,用来简单说明这个类成员变量def__int__(self,参数):#[可选]类似构造函数,但__init__被(自动)调用时,对象已然被创建出来了函数体def__del__(self):#[可选]类似析构函数体def成员函数(self,参数):函数体习惯上,和c++不同的是,python一般使用self(是一种习惯而非强制,在def的时候可以使用其他的名字比如this)而不是this,但两者功能上类似,值得注意的是,self需要在方法的参数中写定,并且引用成员变量的时候,一定要通过self。比如:classPerson:storeinformationofapersonname=''age=0sex='male'deftextOut(self):#这个self不可少print'nameis:',self.name,'ageis',self.age,'andsexis',self.sex#对成员变量的引用,亦必须通过self@staticmethoddefsayHello():print'hello,world!'p=Person()p.textOut()p.say
本文标题:python 速成指南
链接地址:https://www.777doc.com/doc-4210902 .html