函数
初识函数的定义与调用:
#函数的定义 def func(): """计算S1的长度""" s1="hello world" count=0 for i in s1: count += 1 print(count) #函数的调用 func()
总结:
定义:def关键词开头,空格之后接函数名称和圆括号(),最后还有个:号。
def是固定的,不能变,必须是连续的,不能分开。空格是为了将def关键字和函数分开,必须空
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头
括号必须最后加上,以上就是函数开头的书写格式。
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是 函数名() 要记得加上括号。
函数的返回值:
#函数定义 def func(): """计算s1的长度""" s1 = "hello world" count = 0 for i in s1: count =count+1 return count #函数调用 str_len=func() print('str_len : %s'%str_len)
return关键字的的作用:
return 是一个关键字,在pycharm里,你会看到它变成蓝色了。你必须一字不差的把这个单词给背下来。
这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”
要研究返回值,我们还要知道返回值有几种情况:分别是(没有返回值、返回一个值、返回多个值)
没有返回值:
不写return的情况下,会默认返回一个None:我们写的第一个函数,就没有写return,这就是没有返回值的一种情况
#函数定义 def func(): """计算s1的长度""" s1 = "hello world" count = 0 for i in s1: count +=1 print(count) #函数调用 str_len = func() #因为没有返回值,此时的str_len为None print('str_len : %s'%str_len)
只写return,后面不写其他内容,也会返回None,既然没有要返回的值,完全可以不写return,为什么还要写个return呢?这里我们要说一下return的其他用法,就是一旦遇到return,结束整个函数。
返回一个值:
刚刚我们已经写过一个返回一个值的情况,只需在return后面写上要返回的内容即可。
#函数定义 def func(): """计算s1的长度""" s1 = "hello world" count = 0 for i in s1: count +=1 return count #函数调用 str_len = func() print('str_len : %s'%str_len
注意:return和返回值之间要有空格,可以返回任意数据类型的值
返回多个值:
可以返回任意多个、任意数据类型的值
def ret_demo1(): '''返回多个值''' return 1,2,3,4 def ret_demo2(): '''返回多个任意类型的值''' return 1,['a','b'],3,4 ret1 = ret_demo1() print(ret1) ret2 = ret_demo2() print(ret2)
返回的多个值会被组织成元组被返回,也可以用多个值来接收
def ret_demo2(): return 1,['a','b'],3,4 #返回多个值,用一个变量接收 ret2 = ret_demo2() print(ret2) #返回多个值,用多个变量接收 a,b,c,d = ret_demo2() print(a,b,c,d) #用多个值接收返回值:返回几个值,就用几个变量接收 a,b,c,d = ret_demo2() print(a,b,c,d)
函数的参数
详细参数:
1 def func(a,b): #站在函数定义的角度上:位置参数:必须传 2 print(a,b) 3 #站在调用函数的角度上 4 func(1,2) #按位置传参 5 func(b=1,a=2) #按照关键字传参 6 func(1,b=2) #混用:必须先按照位置传参,再按照关键字传参
实参与形参
参数还有分别:
我们调用函数时传递的这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。
定义函数时的s1,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
传递多个参数
参数可以传递多个,多个参数之间用逗号分割。
def mymax(x,y): the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma)
位置参数:
站在实参角度
1.按照位置传值
def mymax(x,y): #此时x=10,y=20 the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma)
2.按照关键字传值
def mymax(x,y): #此时x = 20,y = 10 print(x,y) the_max = x if x > y else y return the_max ma = mymax(y = 10,x = 20) print(ma)
3.位置、关键字形式混着用
def mymax(x,y): #此时x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max ma = mymax(10,y = 20) print(ma)
站在形参角度
位置参数必须传值
def mymax(x,y): #此时x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max #调用mymax不传递参数 ma = mymax() print(ma) #结果 TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'
默认参数:
站在定义函数的角度上——默认参数
def welcome(name,sex='male'): #sex 默认参数 print('welcome:%s,sex:%s' %(name,sex)) welcome('黄小贵’) welcome('曹海娇’,'female') 默认参数 是可以不传参数 如果不传默认是设置的默认值,如果传就用传入的值 默认的值是在定义阶段就确定了 默认参数的陷阱:针对可变的数据类型 如: def demo3(a=[]): a.append(1) print(a) demo3() demo3([]) demo3()
动态参数:
按位置传值多余的参数都由args统一接收,保存成一个元组的形式
1 def func(*args): 2 count=0 3 for i in args: 4 count +=i 5 return count 6 print(func(1,2,3,4,5,6))
动态参数
站在函数定义的角度上:*做聚合用,将一个一个的参数组合成一个元组
站在函数调用的角度上:*做打散用,将一个列表或者元组打散成多个参数
*只针对按位置传参
**动态参数,接受按关键字传递过来的参数,组织成一个字典 如:
1 def demo4(**kwargs): 2 print(kwargs) 3 4 d={'a':1,'b':2,'c':3} 5 demo4(**d)
站在传参的角度:按位置,按关键字
1 def demo5(*args,**kwargs): 2 print(args) 3 print(kwargs) 4 5 demo5(1,2,3,a=12,b=4) #必须按照
站在函数定义的角度:所有的参数都是形式参数
默认参数
位置参数
动态参数:*args **kwargs
站在函数调用的角度上:所有的参数都是实际参数
按照位置传
按照关键字传
混用:按照位置传必须在关键字传参之前 如:
1 def func(位置参数1,位置参数2,*args,默认参数=10,**kwargs): 2 print(位置参数1,位置参数2) 3 print(默认参数) 4 print(args) 5 print(kwargs) 6 func(1,2,3,4,5,默认参数='hahaha',a=10,b=20)
下节预习:
函数的镶嵌调用
1 def func(): 2 print(123) 3 def func2(): 4 func() 5 print(345) 6 func2()
1 def func(x,y,z): 2 print(x,y,z) 3 def func2(a,b,c): 4 print('func2',a,b,c) 5 func2(x,y,z) 6 func(4,5,6)