1.为什么使用函数
2.函数的定义与调用
3.函数的返回值
4.函数的参数
5.总结
一,使用函数的原因
例子:
突然python中的len方法不能直接使用了,然后现在有一个要求,让你计算'hello world'怎么计算
现在可以这样写
例如:
s1 = "hello world" length = 0 for i in s1: length = length+1 print(length)
功能实现了,非常完美,比如现在又有一个要求,要求另外一个字符串的长度'Holle world'
于是,这个时候可以这样写
s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) s2 = "hello eva" length = 0 for i in s2: length = length+1 print(length) for循环实现len功能2
这样也是可以完成功能的效果,但是还不是那么的完美
主要的原因有两点
1.之前我们使用len方法就可以直接拿到一个字符串的长度,现在是想想通过的功能我们把相同的代码写了好多遍 ------ 代码冗余
2.然后就是两极化读起来也很简单,一看就知道这两句代码是在计算长度,但是刚刚的代码却不那么容易读懂 ------ 可可读性差
这样想一想就会知道有没有什么可以代替这些代码,即让代码不冗余,还有可读性好的效果
接下来让我带着你认识一下函数
函数定义和调用
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函数调用 mylen() 函数的定义和调用
定义与调用的总结
定义:def关键字开头,空格之后接函数名称和小括号(),最后一个':'.
def是固定的,不能改变,必须是连续的def三个字母,不能分开...在Python中是一个关键字
空格为了将def关键字和函数名分开,必须有一个空格或多个空格
函数名:函数名只能包含字符串,下划线和数字且不能以数字开头,虽然函数名可以随便起,但是给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上就是对的
注释:每一个函数都应该对功能和参数惊醒相应的说明,应该在函数下面第一行,以增强代码的可读性
调用:就是函数名()要记得加上括号
函数的返回值
返回值一共分为四种
1.当没有return的时候
返回值为None
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函数调用 str_len = mylen() #因为没有返回值,此时的str_len为None print('str_len : %s'%str_len) 不写return
2.当有return时候
1.存在return,后边没有返回值的时候返回值为None
def ret_demo(): print(111) return print(222) ret = ret_demo() print(ret) 只写return
2.存在return,后边有一个返回值是,返回值为这一个元素
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函数调用 str_len = mylen() print('str_len : %s'%str_len) 返回一个值
3.存在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) 多个返回值的接收
在python中用逗号分割的多个值就认为是一个元组
>>> 1,2 #python中把用逗号分割的多个值就认为是一个元组。 (1, 2) >>> 1,2,3,4 (1, 2, 3, 4) >>> (1,2,3,4) (1, 2, 3, 4)
序列解压拓展
#序列解压一 >>> a,b,c,d = (1,2,3,4) >>> a >>> b >>> c >>> d #序列解压二 >>> a,_,_,d=(1,2,3,4) >>> a >>> d >>> a,*_=(1,2,3,4) >>> *_,d=(1,2,3,4) >>> a >>> d #也适用于字符串、列表、字典、集合 >>> a,b = {'name':'eva','age':18} >>> a 'name' >>> b 'age'
函数的参数
函数的参数分为两种,一个是实参一个是形参,实参给形参传值的过程叫做传参
实参和形参
参数还有分别:
调用函数时传递的这个参数叫做实际参数,因为这个实际的要交给函数的内容,简称实参
定义函数时的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' 位置参数必须传参
默认参数
1.正常的使用
使用方法
为什么要有默认参数:将变化较小的值设置成默认参数
默认参数的定义
def stu_info(name,sex = "male"): """打印学生信息函数,由于班中大部分学生都是男生, 所以设置默认参数sex的默认值为'male' """ print(name,sex) stu_info('alex') stu_info('eva','female') 默认参数
3.参数陷阱:默认参数是一个可变数据类型
def defult_param(a,l = []): l.append(a) print(l) defult_param('alex') defult_param('egon')
动态参数
按位置传值多余的参数都有参数都有args统一接受不,保存成一个元组的形式
*args的用法
def mysum(*args): the_sum = 0 for i in args: the_sum+=i return the_sum the_sum = mysum(1,2,3,4) print(the_sum) *args求和函数应用
**keargs的用法
def stu_info(**kwargs): print(kwargs) print(kwargs['name'],kwargs['sex']) stu_info(name = 'alex',sex = 'male')