十六、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)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的。所以递归调用的次数过多,会导致栈溢出。

posted @ 2023-06-21 17:57  村尚chun叔  阅读(55)  评论(0编辑  收藏  举报