---- 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来处理