15、函数
函数分内置函数与自定义函数
自定义函数
#语法 def 函数名(参数列表): 函数体
实例
#函数定义要在调用之前 #hello world! def hello(): #函数定义 print("hello world!") hello() #函数调用 #求合 def sum_num(x): #函数定义 count = 0 for i in range(x): count += i return count print(sum_num(10)) # 45 函数调用
按值传参与按引用传参
#按值传参
def change(x): x = 10 print(x) # 10 a = 1 change(a) print(a) # 1
按引用传参
def change(x): x.append([4,5,6]) print(x) # [1, 2, 3, [4, 5, 6]] a = [1,2,3] print(a) #[1, 2, 3] change(a) print(a) # [1, 2, 3, [4, 5, 6]]
参数
必须参数:调用函数时必须传入一个参数,不然传报错
def change(x): x.append([4,5,6]) print(x) change() #TypeError: change() missing 1 required positional argument: 'x'
关键字参数:根据关键字匹配参数,不用与声明顺序相同
def printinfo(name, age): print(name) print(age) printinfo(age=50, name="car") #car 50
默认参数:没有传入参数刚使用默认值
def printinfo(name="char", age="27"): print(name,end=" ") print(age) printinfo(age=26) #char 26
不定长参数:参数不确定数量,一个或者N个
def printinfo(arg1, *vartuple): # *vartuple存入所有未命名的参数他是一个元组,如果没有指定则为空元组 print(arg1) for var in vartuple: print(var) printinfo(10) #10 printinfo(10,20,30,40) #10,20,30,40
匿名函数:使用lambda来创建,lambda只是一个表达式,比def简单
lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
#求两数和 def sum(a,b): print(a+b) sum(10,10) #20 sum = lambda a,b:a+b print(sum(10,20)) #30
动态参数
def show(*arg): #*arg默认为元组类型 print(arg,type(arg)) show(1,2,3,4) #(1, 2, 3, 4) <class 'tuple'> def show(**arg): #**arg默认为字点类型 print(arg,type(arg)) show(u=1,uu=2,uuu=3) #{'u': 1, 'uu': 2, 'uuu': 3} <class 'dict'> def show(*args, **kwargs): print(args,type(args)) print(kwargs,type(kwargs))
l =[1,2,3,4]
d = {"u":1, "uu":2}
show(1,2,3,4,u=1,uu=2)
#(1, 2, 3, 4) <class 'tuple'>
#{'u': 1, 'uu': 2} <class 'dict'>
show(l,d)
#([1, 2, 3, 4], {'u': 1, 'uu': 2}) <class 'tuple'>
#{} <class 'dict'>
show(*l, **d)
#(1, 2, 3, 4) <class 'tuple'>
#{'u': 1, 'uu': 2} <class 'dict'>
s = "{0} is {1}"
result1 = s.format("alert", "sb")
print(result1) #alert is sb
l = ["alert", "sb"]
result2 = s.format(*l)
print(result2) #alert is sb
s = "{name} is {age}"
r1 = s.format(name="alert",age="sb")
print(r1) #alert is sb
d = {"name":"alert", "age":"sb"}
r2 = s.format(**d)
print(r2) #alert is sb