#抽象
#判断函数是否可调用
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