本质:函数就是对功能的封装
优点:
1.简化代码结构,增加代码复用度
2.如果想修改某些功能或调试某个bug,还需要修改对应的函数即可
定义函数:
格式:
def 函数名(参数列表):
语句
return 表达式
def:函数代码块以def关键字开始
函数名:遵循标识符规则
参数列表:参数1,参数2,。。。参数n:任何传入函数的参数和变量,必须放在圆括号之间,用逗号分隔。函数从函数的调用者那里获取的信息
“:”:冒号函数内容以冒号开始,并且缩进
语句:函数封装的功能
return:一般用于结束函数,并返回信息给函数的调用者
表达式:即为要返回给函数的调用者的信息
注意:最后return 表达式,可以不写,相当于return None
最简单的函数(无参无返回值)
def myPrint():
print("sunck is a good man")
#函数的调用
myPrint()
函数的调用
格式:
函数名(参数列表)
函数名:是要使用的功能的函数名字
参数列表:函数的调用者是函数传递的信息
函数调用的本质:实参给形参赋值的过程
函数的参数
#形参:形式参数,定义函数时小括号中的变量,本质是变量
def myPrint(str, age):
print(str, age)
#实参:实际参数,调用函数时给函数传递的数据,本质是值
myPrint("sunck is a good man", 16)
函数的返回值
def mySum(num1, num2):
#将结果返回给函数的调用者
return num1 + num2
#执行完return,后面的代码不执行了
print("*******")
res = mySum(1,2)
print(res)
传递参数
1.值传递:传递的不可变类型(string、tuple、number)
def fun1(num):
num = 10
temp = 20
fun1(temp)
print(temp)
结果:20
原因:首先要明白,函数调用时,传的参数是实参,记住这一点之后就容易理解了,什么是实参,就是具体的值,我的理解就是就像创建一个对象时那样,比如per = Person("tom", 18),括号里的“tom”和“18”都是具体的值,这样的才能叫做实参。说回来,此时之所以fun1函数接受了temp,只是因为它有值,函数用的就是它的值,也就是用temp指向的数字2的地址的,而执行到函数内部temp=10时,此刻temp还是指向20的地址的。所以,输出是temp还是20。
2.引用传递:传递的可变类型(list、dict、set)
def fun2(lis):
lis[0] = 100
li = [1,2,3,4,5]
fun2(li)
print(li)
结果:[100,2,3,4,5]
原因:同理,li被函数用,是因为它有值,函数用的是li指向值的地址,也就是列表的地址,而在函数中会被执行li[0]=100,此时,要知道,li依旧指向列表的地址,是不变的,不过呢,此时是列表中的元素li[0]它指向的地址又之前的1现在指向了100了,所以输出后会发现li中元素发生变化,但要明白的是li指向的地址其实没有变