1.为什么要用函数
如果不用len()这个Python内置函数统计“字符串”的长度,该如何获取长度?
s="hello word" n=0 for i in s: n+=1 print(n)
现在要计算另一个“字符串”的长度,“hello wuxi”
s="hello wuxi" n=0 for i in s: n+=1 print(n)
现在产生了一个问题:实现相同的功能,代码冗余。
而python内置的len()函数,读起来简单,一看便知这个功能。而上面的两组代码“可读性差”
print(len(s1)) print(len(s2))
2.初始函数定义与调用
def func(): 代码1 代码2 ... func()
注意事项:
一、def 关键字开头,后面接函数名加()
二、函数名的命名规范和“变量名”相同。只能包含字符串、下划线和数字且不能以数字开头、要见名知意。
三、函数的注释。用上下三引号表示
四、函数的调用。函数名加括号
三、函数的返回值
使用len()方法会得到一个“返回值”
l = [1,2,3,4,5] res=len(l) print(res)
一、return关键字
return是函数返回值的关键字,没有他,返回值为None。
可返回任意类型的数值
1.1没有返回值
下面就是无return,则返回None的例子
def mylen(): """计算s1的长度""" s1 = "hello world" n = 0 for i in s1: n = n+1 #函数调用 str_len = mylen() print(str_len) #结果为None
1.2只写一个return
return后面不写其他内容也返回None,既然没有返回内容,那为什么要写return,因为return还有一个用法:结束整个函数
def func(): print(111) return res=func() print(res)
1.3返回一个值
则返回return后的内容
def func(): print(111) return 1 ret = func() print(ret)
注意return和返回值之间要有空格
1.4返回多个值
返回多个值,并以元祖形式括起来。因为在Python中用逗号分隔的值就被认为是元祖
def func1(): '''返回多个值''' return 1,2,3,4 def func2(): '''返回多个任意类型的值''' return 1,['a','b'],3,4 ret1 = func1() print(ret1) ret2 = func2() print(ret2)
返回多个值并以元祖形式返回,可以考虑用多个值接收
def func(): return [1,2],[3,4] res=func() print(res) #([1, 2], [3, 4])
可以考虑用多个值接收。使得据结果不为元祖
def func(): return 1,['a','b'],'e' res=func() a,b,c=res print(a,b,c)
返回的是元祖形式,若不想以元祖形式返回,则可以用容器抱起来。
因为元祖是用来存放多个值的
def func(): return [[1,2],[3,4]] res=func() print(res) #结果[[1, 2], [3, 4]]
四、函数的参数
没有参数,我们只能统计固定的长度。有了函数的参数,就可以计算任何内容的长度了
def mylen(a): """计算s1的长度""" length = 0 for i in a: length +=1 return length #函数调用 str_len = mylen("hello wuxi") print('str_len:%s'%str_len)
我们依据参数告诉函数要计算的字符长度是谁的。这个过程就是传参的过程
形参和实参
参数分为定义函数阶段括号内的(形参)。还有调用调用函数时括号内的“实际参数(实参)”。
传递多个参数
多个参数之间用逗号分隔
def my_max(x,y)
位置参数
站在实参角度
1.按位置实参(正常传值)
ma = mymax(10,20)
2.关键字实参
ma = mymax(y = 10,x = 20)
3.关键字和位置实参混合
注意:位置实参必须在关键字实参的前面
ma = mymax(10,y = 20)
默认参数
在函数的定义阶段,形参(变量名)就已经被赋值了
# 在调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值
# 在调用的时候如果可以给默认值形参传值 传了那么就使用你传的值
将变化较小的值设置成默认参数,有需要改变的,可以重新设置
def stu_info(name,sex = "male"):
参数陷阱:默认参数是一个可变数据类型。比如是列表
def func(a,l=[]): l.append(a) # return ls print('点名簿包含:%s'%l) func('wuxi') func('sll') func('zdq')
可变长参数
按照位置传值,多余的值同一由args接收,保存成元祖(元祖就是用来接收多个值的)
*在实参中会将列表、元祖、集合、字符串打散成位置实参(for循环)一一传入函数中。
func(*[1,2,3]) #func(1,2,3)
**在实参中会将字典拆分成k=value的形式。
func(**{‘x’:1,'y':2}) func(x=1,y=2)
*在形参中
接收多余的位置实参,不接收关键字实参
**形参
接收关键字实参,保存成字典形式