python入门笔记(三)
程序员文章站
2022-06-17 11:33:10
...
#抽象 #判断函数是否可调用 callable(x) #python2 hasattr(func.__call__) #python3 #文档字符串 def square(x): '这是......' return x*x print square.__doc__ help(square) n=['a','b','c'] def change(n): n[0]='v' print n #['v','b','c'] #列表会被改变,此类情况需要在函数内创建新的变量并赋值 #将值放在列表中,可被改变 def inc(x):x[0]=x[0]+1 a=[10] inc(a) print a #11 #以上为未知参数,以下为关键字参数 def hello(greeting='a',name='b'): #可以提供默认值 print '%s,%s!'%(greeting,name) hello(greeting='hello',name='world') #这样就不影响传参顺序了 #位置参数和关键字参数可以混用 def hello(name,greeting='Hello',punctuatuin='!'): #需要将位置参数放前边 print '%s,%s%s'%(greeting,name,punctuatuin) #收集参数 def print_params(title,*params): #*的意思是收集其他位置参数,只能收集位置参数 print title print params #元组 def print_params(**params): #**只收集关键字参数 print params #字典 #星号只在定义不定数目的参数或分割字典或序列时才有用 #变量 #变量存储在不可见字典中,vars()函数可以返回这个字典 x=1 scope=vars() scope['x'] #1 scope['x']+=1 x #2 #此类不可见字典叫做命名空间或作用域 globals() #返回全局变量的字典 locals() #获取局部变量的字典 #函数内声明全局变量 x=10 def change_global(): global x x+=x change_global() x #11 #python函数可以嵌套 def foo(): def bar(): print 'Hello' bar() #map map(str,range(10)) #将序列中的值全部传给函数,等价于[str[i] for i in range(10)] #filter def func(x): return x.isalnum() seq=["foo","x41","?!","***"] filter(func,seq) #可以基于一个返回值为Boolean的函数过滤 ['foo','x41'] #等价于 [x for x in seq if x.isalnum()] #等价于 filter(lambda x:x.isalnum(),seq) #lambda表达式 #reduce:处理序列中前两个值,其结果与第三个值再进行处理,依次,直到整个序列处理完 numbers=[1,2,3,4,5,6,7,8,9] reduce(lambda x,y:x+y,numbers) #返回序列中所有值的和 45 #等价于 sum(numbers) #求和函数 apply(func[,args[,kwqrgs]]) #调用函数,可提供参数 #更加抽象 #创建类 __metaclass__=type #确定使用新式类,3.0以后不存在旧式类 class persion: def setName(self,name): #self用于访问本身,必须作为第一个参数 self.name=name def getName(self): return self.name def greet(self): print "Hello,World!I`m %s."%self.name #私有变量或方法 #在构造类时,变量或方法的名字前加上双下划线,即可成为私有方法或变量,实际上名字加上双下划线后,名字会被转换成(_类名__名字)的形式,通过此名字可以访问 #python没有真正的私有化支持 class a: def __aa(): print "a" def b(self): self.__a() a.__aa() #报错 a._a__aa #依然可以访问,不建议这么做 #带有单下划线的名字,不会被import *引入 #继承,a继承b class a(b): def init(): pass #调查继承 issubclass(a,b) #检查a是否b的子类 a.__bases__ #检查a的父类 o.__class__ #检查对象是哪个类的实例 isinstance(o,a) #查看一个对象是否一个类的实例 types(s) #查看对象是哪个类的实例,限新式类 #多重继承 class c(a,b): #注意顺序,前边类中的方法会覆盖后边的,例如:若a中有k(),b中有k(),则c中的k()为a中的k() pass random.choice(seq) #从非空序列随机选择元素 hasattr(object,name) getattr(object,name[,default]) setattr(object,name,value) #异常 #自定义异常 class someException(Exception):pass raise Exception try: ... except someException: if ...: ... else: raise except (otherException,bException,cException): ... except (dException,eException),e: #python 3.0为except (dException,eException) as e print e except: print 'some wrong!' else: print 'well' finally: print 'finally' #引入自己的模块 import sys sys.path.append('c:/python') import hello #在模块中定义测试代码 #hello.py def hello(): ... def test(): ... if __name__=='___main__': #当作为模块时,__name__为hello test() """ 引入自己的模块方法 1、将模块文件放在python库目录,推荐C:\\python\\lib\\site-package(pprint.pprint(sys.path)) 2、告诉编译器去哪里找,bashshell如下: 环境变量:.bashrc中加入 export PYTHONPATH=$PYTHONPATH:~python """ #包(__init__.py文件用于定义包) #ds/__init__.py PI=3.14 #将模块文件放入ds目录即可 import ds print ds.PI #引入 import drawing #仅可以使用__init__.py中的内容,不可以使用模块 import drawing.colors #可以通过全名drawing.colors使用模块 from drawing import shapes #可以通过短名shapes使用模块 """ 探究模块(以copy为例) 1、>>>>import copy >>>>[n for n in dir(copy) if not n.startswith('_')] #说明copy模块一共有这些变量 2、>>>>copy.__all__ ["a","b","c","d"] #说明copy模块定义的公有接口是这些 #from copy import * 只能导入copy.__all__中的变量 #若要使用其他变量,需要显性实现。如导入copy模块m后,使用m.a(),或者from m import a #__all__指定需要的变量、函数、类,如果不设置__all__,import * 会把所有变量导入进去 3、>>>>help(copy.copy) #若有__doc__变量 >>>>print copy.copy.doc 4、http://python.org/doc 5、源码(文件位置) >>>>print copy.__file__ """ #模块 #sys