欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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