1、定义一个函数
def max(num1,num2) : #函数头
if num1>num2:
return num1 #函数体
else :
return num2
函数包括函数头和函数体,函数头由以def开头,括号里包括形参,
并以冒号结束
参数就像是一个占位符,当调用函数时就将值传递给参数
函数也可以不带参数
2、调用一个函数
注意:1、带返回值的函数也可以作为语句被调用,在这种情况下,函数返回值就会被忽略掉。
2、函数在内存中被调用,函数可以定义在脚本中的任意一个位置。
3、调用栈
每次调用函数时,系统就会创建一个为函数存储它的参数和变量的激活记录,然后将这个激活记录放在一个被称为堆栈的内存区域。
调用栈被称为执行堆栈或运行堆栈,经常被简称为堆栈。
当一个函数调用另一个函数时,调用者的激活记录保持不变,然后为新的函数调用创建一个新的激活记录。当一个函数结束它的工作之后就将程序控制权转移给它的调用者,并且从堆栈中删除它的激活记录。
堆栈采用先进后出的方式存储激活记录
当堆中的对象不在需要时,python会自动将这些对象清空
6.4 ## 带返回值和不带返回值的函数
注意:
1、不管是否是使用return ,所有python的函数都将返回一个值。如果某个值没有返回值,在默认的情况下,它返回一个特殊的值None。
因此无返回值函数不会返回值,它也被称为None函数。None函数可以赋值给一个变量来表明这个变量不指向任何对象。
None函数可以终止函数并将控制权返回调用者
return
或
return None
实例:
def printgrade():
if score>100 or score <0
return None
6.5、位置参数和关键字参数:
实参的两种类型:位置参数和关键字参数
位置参数:
def nprintln(message,n):
for i in range(n):
print(message)
可以使用nprintln(‘a’,3)将a传递给messge, 将3 传递给n,然后将a输出三次
而nprintln(3,‘a’)是将a传递给n,将3传递给message
位置参数的实参必须与函数头中定义的形参的个数,顺序,类型上匹配。
关键字参数:
通过name = value的形式传递每个参数的方式
例如:
nprintln(n=5,message = 'a')使用关键字参数可以以任意的顺序出现
位置参数可以和关键字参数混在一起,但位置参数不能出现在任意关键字参数之后
例如:
def f(p1,p2,p3):
f(30,p2=4,10)调用它会出错,因为位置参数10出现在关键字参数之后
6.6通过传递引用来传递参数:
重点:当调用带参数的函数时,每个实参的引用值被传递给形参
术语通过值传递
数据通常是对象,对象的变量通常指向对象的引用
调用函数时,实参的值就被传递给形参。这个值通常就是对象的引用值。
***重点:所有变量指向的都是对象,他们的地址都是对象的地址
数字和字符串都被称为不可变对象。不可变对象的内容是不可以被改变的
***将一个新数字赋值给变量时,python就会给变量创建一个新对象。
不可变对象的地址是不变的,每个变量指向的同一个变量的地址是相同的
if __name__ == '__main__':
c= 1
d= 2
a = 1
b = 2
print(id(a),id(b),id(c),id(d))
print(a,b)
``
结果:
8791529935936 8791529935904 8791529935904 8791529935936