python之初识函数:
(一)为什么要使用函数:
首先举一个例子,假如我们现在要计算"hello world"这个字符串的长度,我们可以怎么计算1,直接print(len(hello world)) 就可以计算长度,那么现在
用len()这个函数了,我们还可以怎么计算呢,看下面代码
#利用for 循环计算字符串长度 s = "hello world" length = 0 for i in s: length += 1 print(length)
这样我们也可以计算出“hello world” 的长度,但是我们如果要计算多个字符串的长度呢,难道要写很多个这样的for循环吗?能不有一个有一个工具可以帮我们解决这个问题,拿出来就可以直接用,那么这个工具就叫做函数,可以很好的解决我们重复代码----->代码冗余的问题。
(二)函数的定义与调用
还是上面那个例子,我们怎样来实现呢
def mylen(): s = "hello world" length = 0 for i in s: length += 1 print(length)
这样子就定义好了一个函数,和之间的代码好像没有什么区别,除了加了一个def 和缩进,执行上面代码,什么结果也没有。上面那个过程就相当于我们只是把工具做好了,但是我们要用是不是还得取出来,再来一段代码
#函数的定义 def mylen(): ''' 计算长度的函数 ''' s = "hello world" length = 0 for i in s: length += 1 print(length) #函数的引用 mylen()
总结:
1,函数是以def关键字开头,空格之后接函数名和小括号(): 函数名和定义变量差不多,必须是字母,下划线或数字组成,不能以数字开头。此外函数名还要有一定的意义,可以简单说明函数的功能。括号()和冒号:是必须加上的,2,注释: 每一个函数都应该对函数的功能和参数进行相应的说明,以增加函数的可读性,写在函数下面第一行,用三引号引起来。3,函数的调用,函数名加()就可以了。
(三)函数的返回值
要计算函数的返回值我们得用一个变量来接受str_len=len("hello world"),那么函数中是怎么实现的呢
def mylen(): ''' 计算长度的函数 :return: ''' s = "hello world" length = 0 for i in s: length += 1 print(length) str_len = mylen() print(str—len)
但是执行上述代码,发现返回为None,说明函数没有给你返回值。那么如何得到返回值呢。只需要加上return
def mylen(): ''' 计算长度的函数 :return: ''' s = "hello world" length = 0 for i in s: length += 1 return length str_len = mylen() print(str—len)
return 关键字的作用 1,返回函数的值 2,结束函数
返回值分两种情况:1,没有返回值
2,有返回值 当返回值为一个值得时候,用一个变量接收
当返回值为多个变量的时候,可以用一个变量接收(返回以元祖形式呈现),有几个值就用几个变量接收。
(四)函数的参数
函数的参数分为实参和形参,形参是在函数定义的时候接收的,形参是在函数调用时传入的。形参分为位置参数,*args,默认参数,**kwargs四种参数,形参分为按照位置传参,按照关键字传参,动态传参(直接传元祖或字典)
def mylen(s):#s形参 ''' 计算长度的函数 参数s:要计算的字符串长度 #注释,说明函数和参数功能说明 return:要计算的字符串 :param s: :return: ''' length = 0 for i in s: length +=1 return (length) ret = mylen("hello world")#hello world为实参 ret2 = mylen("12345") ret3 = mylen("egon is somebody") ret4 = mylen("hahahhahhahahha") print(ret) print(ret2) print(ret3) print(ret4)
位置参数
站在实参角度
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) 位置、关键字混用传参
4,动态传参
def fun(**kwargs): print(kwargs) d = {"a": 10,"b":20} fun(**d)#返回为{'a': 10, 'b': 20} #动态传参
站在形参角度
位置参数必须传值
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 stu_info(name,sex = "male"): """打印学生信息函数,由于班中大部分学生都是男生, 所以设置默认参数sex的默认值为'male' """ print(name,sex) stu_info('alex') stu_info('eva','female') 默认参数
动态参数:
*args接收按位置传参多余的参数,将他们组合成元祖输出**kwargs接收多个关键字传参,并将他们组成字典输出
def fun(a,*args,x = 10,**kwargs): print(a,args,x,kwargs) fun(1,2,3,4,5,6,x= 20,y =30,z = 50) #返回值为1 (2, 3, 4, 5, 6) 20 {'y': 30, 'z': 50} 1对应a,(2,3,4,5,6,)对应args,20对应x, {'y': 30, 'z': 50}对应kwargs
小结:函数主要解决面向编程过程中的代码冗余,以及可读性差的问题
函数定义的规则:
1.定义:def 关键词开头,空格之后接函数名称和圆括号()。 2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分割。 参数可以定义多个,也可以不定义。 参数有很多种,如果涉及到多种参数的定义,应始终遵循位置参数、*args、默认参数、**kwargs顺序定义。 如上述定义过程中某参数类型缺省,其他参数依旧遵循上述排序 3.注释:函数的第一行语句应该添加注释。 4.函数体:函数内容以冒号起始,并且缩进。 5.返回值:return [表达式] 结束函数。不带表达式的return相当于返回 None def 函数名(参数1,参数2,*args,默认参数,**kwargs): """注释:函数功能和参数说明""" 函数体 …… return 返回值
调用函数的规则:
1.函数名() 函数名后面+圆括号就是函数的调用。 2.参数: 圆括号用来接收参数。 若传入多个参数: 应按先位置传值,再按关键字传值 具体的传入顺序应按照函数定义的参数情况而定 3.返回值 如果函数有返回值,还应该定义“变量”接收返回值 如果返回值有多个,也可以用多个变量来接收,变量数应和返回值数目一致 无返回值的情况: 函数名() 有返回值的情况: 变量 = 函数名() 多个变量接收多返回值: 变量1,变量2,... = 函数名()