九、python 函数、函数式编程、变量作用域、函数__doc__属性
函数
定义函数:def func(x,y,z=v,*args,**kwargs)
参数
参数没有类型,python不做类型检测
不支持重载,python不会区分参数名字和个数
多个同名函数时,后一个会覆盖前一个函数
位置参数和关键字参数(函数调用时)
--------------------------------------------------------------
def funA(x,y,z):
print x,y,z
#def funA(x,y,z):
# print x,y+1,z
funA(1,100,True) #位置参数
funA(y=True,x=100,z='hello') #关键字参数
------------------------------------------------------------
常用参数:
任意数量的参数: * 和 **
在定义函数时:* 和 **是收集任意个参数
* : 用元组收集任意个不匹配的参数
** : 用字典收集任意个不匹配的参数
def func(*args,**kwargs)
在调用函数时:* 和 ** 是对参数解包
* : 把一个集合打散成多个参数
** :把一个字典打散成多个参数
func(*args,**kwargs)
---------------------------------------------------
def funB(x,y,z,*args): #args可以是随便的名字
print x,y,z
print args
funB(1,2,3,4,5,6,7,8)
def funC(x,y,z,*args,**kwargs): #args可以是随便的名字
print x,y,z
print args
print kwargs
funC(1,2,3,4,5,6,7,8)
funC(1,2,3,4,5,6,7,8,a=9,b='hello',c=True)
def funD(x,y,z):
print x,y,z
x = [1,2,3]
#print funD(x) #参数个数不对
funD(*x) #*在调用函数时是拆分列表来做参数
y = {'x':100,'y':'hello','z':True}
#print funD(y) #y或者是*y都不行
funD(**y)
------------------------------------------------
总结:
定义函数时,参数的样式
定义函数语法 解释
def func(value) 常规参数
def func(name=value) 默认参数
def func(*list) 用元组收集所有位置参数
def func(**dict) 用字典收集所有关键字参数
def func(*args,**kwargs) 分别收集位置参数和关键字参数
调用函数时,参数的样式
调用函数语法 解释
func(value) 按照位置进行匹配
func(name=value) 按照关键字(变量名)匹配
func(*list) 把list打散,作为位置参数传递
func(**dict) 把字典打散,作为关键字参数传递
func(*args,**kwargs) 同上
注意:
参数传递的是"引用"
函数内部的修改会影响外部
--------------------------------------------------
print 'x=',id(x) #id()打印对象地址
def funa(a):
print 'a=',id(a)
a[1] = 'hello world'
funa(x)
print x,'-------------不想改变则做如下操作'
x = range(1,6)
print 'x=',id(x)
funa(list(x)) #用工厂函数list包装一下,相当于copy一个新的元组
print x
--------------------------------------------------------
函数的返回值
函数可以有多个返回值
可以用一个tuple对象接收返回值
也可以用多个变量接收
--------------------------------
def funb():
return 1,True,'hello'
x,y,z = funb()
m=funb()
print x,y,z
print m
----------------------------------------
变量的作用域
LEGB原则:
L(local):函数本地
E(enclose):任意上层的嵌套函数。相当于list里面可以再定义list,
G(global):全局作用域(模块或python文件),importpython文件不算
B(build-in):内置作用域
global:
---------------------------------------------------------
x = 10
def fun():
x = 12 #再注释掉该行试试
print "in fun:",x
fun()
print x
print '--------------'
x = 10
def fun():
x = 12
def fun1():
x=13
print "in fun1:",x
return x
print "in fun:",x
fun() #fun1() 看看怎么调用(会叫闭包)
print x
#global关键字的使用,,方法中修改全局变量
x = 10
def fund():
#x = 10 #此时x又是一个新的对象
global x #声明用全局变量
x += 2
print "in fun:",x
fund()
print x
---------------------------------------------------------
函数的文档属性(函数的帮助文档)
文档属性
定义函数的第一个没有赋值的字符串,可以通过__doc__访问
---------------------------------------------------------
x = 10
def fune():
'''
@author:aidon
@:param
@desc
@example
@:exception
:return:
'''
print "in fun:",x
print fune.__doc__ #函数当成一个对象,有属性
-----------------------------------------------------------
函数是个对象,可以给函数增加属性