十六、python里的函数
十六、python里的函数
python里函数分为内置函数与自定义函数
内置函数:如int(),str(),len()等,所有的内置函数参考https://docs.python.org/3/library/functions.html
自定义函数的定义与调用(重点)
def funct(): # 函数名(),括号里可以写参数,也可以不写
"""函数说明或注释""" # 说明可以不写,大型程序为了程序可读性最好写
print("xxx") # 函数代码主体
print("xxx") # 函数代码主体
print("xxx") # 函数代码主体
return 0 # 函数返回值,可有可无
funct() # 调用函数的方式(调用函数也就是执行函数内部的代码)
实例
def wash(a, b, c):
print("加水{}升".format(a))
print("搓洗{}分钟".format(b))
print("脱水{}分钟".format(c))
wash(3, 40, 10)
wash(b=40, a=3, c=10) # 关键字参数可以换位置
默认参数(缺省值)
def connect_ssh(host,usr,password,port=22): # port=22为默认参数
print(host, usr, password, port)
host = input("input host:")
user = input("input user:")
password = input("password")
connect_ssh(host,user,password,33) # 不用再传port的值,默认就是22,也可以传一个新的值替代22
可变长参数
def funct1(*args): # args可变,
num1 = 0
for i in args:
if isinstance(i,int):
num1 += i
print(num1)
funct1(1,2,3,4,"a","v")
小结
1.为什么要传参?
每次调用函数可能会有不同的需求,传参就相当于是和函数做交互,传不同的值给函数来实现不同的需求
2.形参和实参
3.位置参数
实参与形参按顺序一一对应
4.关键字参数
在实参里也要写上形参的名字,这样做可以改变顺序
5.默认值参数
大部分情况下值不变,极少数值不一样的情况下可以使用默认值参数。
默认值参数就是不传值就用默认的,传了值就用传的值。
6.可变长参数
参数个数不确定的情况就用可变长参数
函数返回值(重点)
函数的功能要专一,一个函数只能完成一个功能
函数返回值额度作用:把函数的执行结果返回给需要调用的地方
函数return返回的是一个值,所以要赋值给一个变量,然后通过调用变量得到返回值
函数返回值写在函数体的最后,因为函数返回值意味着函数的结束
def funct1(*args):
num1 = 0
for i in args:
if isinstance(i,int):
num1 += i
return num1 # return返回的值才可以被调用
sum = funct1(1,2,3,4,5,5)
if sum > 10:
print("大了")
else:
print("小了")
小结
函数的结果要被其他地方调用,就不要在函数里用print打印,而是用return做成返回值,再把这个返回值赋值给一个变量,让调用者使用这个变量就是在使用这个函数的结果。
嵌套函数
实例1
def bbb():
print("bbb")
aaa()
def aaa():
print("aaa")
bbb()
实例2
def aaa():
print("aaa")
def bbb():
print("bbb")
aaa()
bbb()
实例1与实例2都是同样打印出
bbb
aaa
请问下面的代码有没有问题
def bbb():
print("bbb")
aaa()
bbb()
def aaa():
print("aaa")
报错NameError: name 'aaa' is not defined
总结:
函数要先定义才能调用
函数类似一个变量,定义函数就是把函数体内的代码在内存开辟一个空间存放进去,然后可以通过函数名来调用
调用函数其实就是执行函数体内的代码
函数变量的作用域:全局变量,局部变量
实例
name="zhangsan" #全局变量
def change_name():
name="lisi" #这个变量只能在函数内生效,也就是局部变量(可以说这个函数就是这个变量的作用域)
gender="male"
print(name)
change_name()
print(name) #打印出zhangsan
print(gender) # 这句会报错,因为它是局部变量,在外面调用不了
实例
def change_name():
global name, gender # 这句可以把name改为全局变量,但不建议这样用,如果多次调用函数,这样很容易混乱,容易与外部的变量冲突
name="lisi"
gender="male"
print(name)
change_name() # 这句的结果为lisi,调用函数内部的print(name)得到的结果
print(name) # 这句的结果为lisi
print(gender) # 可以调用gender变量了,能打印出结果
递归函数(拓展)
函数可以调用其他函数,也可以调用自己,如果一个函数自己调用自己,就是递归函数,但递归也有次数上限(保护机制),所以递归需要一个结束条件
在计算机中,函数调用通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的。所以递归调用的次数过多,会导致栈溢出。