`

python入门笔记(三)

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

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics