用户工具



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)    # <type 'tuple'>
    print args          #(1, 2, 3)
fun2(1,2,3)

默认参数(字典类型)

def fun3(**args):
    print type(args)    # <type 'dict'>
    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来处理