1.函数额度定义与调用
- 定义函数
定义函数的格式如下:
def 函数名():
代码
# 函数的定义
def printInfo():
print('-----------------')
print('人生苦短,我用Python')
print('-----------------')
- 调用函数
定义了函数之后,就相当于有了一个具有某些功能的代码,要想让这些代码执行,就需要去调用它
# 函数调用
printInfo()
2.函数参数(一)
- 定义带有参数的函数
def addNum(a,b):
c=a+b
print(c)
- 调用带参数的函数
以上面的例子:
addNum(1,2)
# 打印结果就为:3
# 在Python中还可以这样玩:
def addNum2(a,b=3):
print(a+b)
addNum2(1)
addNum2(1,1)
# 打印结果为:4
# 2
- 小总结
定义时小括号中的参数,用来接收参数用的,称为“形参”
调用时小括号中的参数,用来传递给函数用的,称为“实参”
3.函数参数(二)
- 缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下面会打印默认的age,如果age没有被传入:
def printInfo(name,age=35):
print("Name:",name)
print("Age:",age)
printInfo("miki")
printInfo("miki",9)
以上的输出结果:
Name: miki Age: 35
Name: miki Age: 9
注意:带有默认值的参数一定要位于参数列表的最后面。
- 不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,声明时不会命名。
基本语法如下:
加了星号(*)的遍历 args 会存放所有未命名的变量参数,args为元组;而加**的变量kwargs 会存放命名的参数,即形如 key=value 的参数,kwargs为字典。
def fun(a,b,*args,**kwargs):
print("a=",a)
print("b=",b)
print("args=",args)
print("kwargs=",kwargs)
# 函数调用
fun(1,2,3,4,5, m=7,x=8,y=9)
打印结果为:
a= 1
b= 2
args= (3, 4, 5)
kwargs= {'m': 7, 'x': 8, 'y': 9}
- 引用传参
可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
注意:Python 中函数参数是引用传递(不是值传递),对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。
4.函数的返回值(一)
- 带有返回值的函数
想要在函数中把结果返回给调用者,需要在函数中使用return。
def add2num(a,b):
c=a+b
retuen c
# 或者
def add2num(a,b):
return a+b
- 保存函数的返回值
5.函数的返回值(二)
在Python中可以拥有多个返回值,其本质是利用了元组
def addNum3(a):
b=a+10
c=a+20
return b,c
x,y=addNum3(3)
print(x)
print(y)
打印结果如下:
13
23
6.局部变量和全局变量
- 局部变量
局部变量指在程序中只在特定过程或函数中可以访问的变量。
总结:
1.局部变量,就是在函数内部定义的变量
2.不同的函数,可以定义相同名字的局部变量,但是各用各的不产生影响
3.局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
- 全局变量
1.什么叫全局变量
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
a=200
def funTest1():
a=30
print('test1-1 now,value of a is %d'%a)
a=40
print('test1-2 now,value of a is %d'%a)
def funTest2():
global a
a+=100
print('test2-1 now,value of a is %d'%a)
funTest1()
funTest2()
2.全局变量和局部变量名字相同问题
3.修改全局变量
既然全局变量,就是能够在所有的函数中使用,那么可否进行修改呢?
当然可以!使用 global 关键字就行!
4.可变类型的全局变量
- 总结1
- 在函数外部定义的变量叫做全局变量
- 全局变量能够在所有的函数中进行访问
- 如果在函数中修改全局变量,那么就需要使用 global 进行声明,否则出错
- 如果全局变量的名字和局部变量名字相同,那么使用的是局部变量
- 总结2
- 在函数中不使用global 声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即全局变量不能指向新的数据
- 对于不可变类型的全局变量来说,因为其指向的数据不能修改,所以不使用 global 时无法修改全局变量
- 对于可变类型的全局变量来说,因为其指向的数据可以修改,所以不使用 global 时也可以修改全局变量
- 可变类型:值可以修改(内存地址不变,但是保存的值变化了),引用可以修改(变量的内存地址变化了)
- 不可变类型:值不可以修改,可以修改变量的引用(=赋值号)
在函数里面修改全局变量:
1.如果全局变量是可变类型:所以在函数里面任意修改(值,引用)
2.如果全局变量是不可变类型:在函数里面不能修改值,也不能修改引用,除非加上 global 才能修改引用