----
def hello(name):
return "hello,"+name
if sex=='men':
def hello():
return "hello,Man"
else:
def hello():
return "hello,Woman"
* def是一个语句,只有执行到def时,函数才开始被创建,否则不会创建函数
* 执行def语句时,先创建一个函数对象。然后创建一个函数名,并将函数名指向函数对象。和变量一样,函数也可以赋值给其他变量
* def hello(): #定义一个函数,函数体(略)
* Hi=hello #让Hi 也指向hello函数,这个时候也可以调用Hi了
* lambda的作用就是创建并返回一个函数对象
----
====== 函数参数 ======
* 传递 不可变类型时,函数内部无法改变变量值
* 传递 可变类型(字典,列表)时,函数内部可以改变变量值
----
=== 关键字参数 ===
def fun(a,b):
print a,b
fun(1,2)
fun(a=2,b=1) # 指定参数名时就忽略参数顺序
=== 默认参数 ===
def fun1(a,b=2,c=3):
print a,b,c
fun1(1) # 1,2,3
fun1(1,4) #1,4,3
fun1(1,c=4) #1,3,4
=== 任意参数(序列类型) ===
def fun2(*args):
print type(args) #
print args #(1, 2, 3)
fun2(1,2,3)
=== 默认参数(字典类型) ===
def fun3(**args):
print type(args) #
print args #{'a': 1, 'c': 3, 'b': 2}
fun3(a=1,b=2,c=3)
=== 解析列表做参数(解析语法 *) ===
def fun4(*args):
print args
a=[1,2,3]
fun4(*a) #解包语法 ×
fun4(1,2,3) #与上面一句等效
=== 混合使用===
def fun4(a,*args,**dict):
print a,args,dict
l=[1,2,3]
fun4(1,*l,**{"name":1})
=== KeyWord Noly 函数===
这个参数类型非常有用,可是在python3.0中才出现
keyword only参数可用于标准化传递的参数,提高函数调用时的可读性。或者当一个函数参数个数非常多时可以明确指定使用哪个参数
def fun5(*a,b,**c) #所有的keyword noly 参数必须位于 *xxx 之后,如果有 **xxx,则必须位于 **xxx之前
print c
fun5(*(1,2),b=3,**{'age':10}) #这里必须指定 b=3,b是keyword only参数
----
====== 函数属性 ======
===格式: 函数名.属性名 ===
函数中也可加注解,但只有Python3.0支持
添加一个属性count用于记录函数被调用的次数
def fun:
try:
bool(fun.count) #检查是否存在这个属性
fun.count+=1 #每次被调用都 + 1
except Exception, e:
fun.count=1 #初始化这个属性
print "init fun.count"
print "called:"+str(fun.count)+" times"
fun()
fun()
fun()
结果:
init fun.count
called:1 times
called:2 times
called:3 times
----
====== lambda ======
* def 的作用是创建一个函数对象并赋给一个变量(这个一个语句)
* lambda 的作用只是创建并返回一个函数对象。所以也叫“匿名函数”(这是一个表达式,因为返回了执行结果)
* lambda 只能存放少量的逻辑,更大的事务还需def来处理