函数
函数也是一个对象
对象是内存中专门用来存储数据的一块区域,函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用
创建函数:def 函数名([形参1,形参2,…形参n]) :
代码块
函数名必须要符合标识符的规范
(可以包含字母、数字、下划线、但是不能以数字开头)
函数中保存的代码不会立即执行,需要调用函数代码才会执行
-调用函数:
函数对象()
-定义函数一般都是要实现某种功能的
定义函数
def zichuang():
print('这是一个自创函数!')#定义函数
zichuang()#调用函数
#result
这是一个自创函数!
即zichuang是函数对象,zichuang()是调用函数
函数参数
在定义函数时,可以在函数名后的()中定义数量不等的形参,
多个形参之间使用,隔开
形参(形式参数),定义形参就相当于在函数内部声明了变量,但是并不赋值
实参(实际参数)
如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,
实参将会赋值给对应的形参,简单来说,有几个形参就得传几个实参
def chengji(a, b, c):
print('三个数的乘积 =', a * b * c)
chengji(1, 3, 4)
#result
三个数的乘积 = 12
练习:定义一个函数,可以根据不同的用户名显示不同的欢迎信息
a = input('请输入您的用户名:')
def yonghu(b):
print(b, '欢迎使用!')
yonghu(a)
#result
请输入您的用户名:zfd
zfd 欢迎使用!
定义一个函数
定义形参时,可以为形参指定默认值
指定了默认值以后,如果用户传递了参数则默认值没有任何作用
如果用户没有传递,则默认值就会生效
def lianxi (a=1,b=3,c=5):
print('a=',a)
print('b=',b)
print('c=',c)
lianxi(2)
#result
a= 2
b= 3
c= 5
实参的传递方式
位置参数
位置参数就是将对应位置的实参复制给对应位置的形参
第一个实参赋值给第一个形参,第二个实参赋值给第二个形参 。。。
def lianxi(a,b,c):
print(a,b,c)
lianxi(1,3,4)
#result
1 3 4
关键字参数
关键字参数,可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
位置参数和关键字参数可以混合使用
混合使用关键字和位置参数时,必须将位置参数写到前面,并且关键字参数不能重复
def lianxi(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
#lianxi(1,3,4) 这种是位置参数
lianxi(a=2,c=4,b=3)#这种是关键字参数,即直接将参数赋值
#result
a= 2
b= 3
c= 4
函数在调用时,解析器不会检查实参的类型
实参可以传递任意类型的对象
def hanshu (a):
print(a,type(a),id(a))
hanshu(1)
hanshu('str')
hanshu(True)
hanshu(input )
#result
1 <class 'int'> 140704112222608
str <class 'str'> 1817487751216
True <class 'bool'> 140704111700304
<built-in function input> <class 'builtin_function_or_method'> 1817458306328
在函数中对形参进行重新赋值,不会影响其他的变量,如果形参执行的是一个对象,当我们通过形参去修改对象时,会影响到所有指向该对象的变量
def hanshu(a,b):
a=12#这里是对变量重新赋值
b=[4,5,6]#这里是对变量重新赋值
print('a=',a,id(a))
print('b=', b, id(b))
c=10
d=[1,2,3]
hanshu(c,d)
print('c=',c,id(c))
print('d=',d,id(d))
#result
a= 12 140704167994096
b= [4, 5, 6] 2347341599624
c= 10 140704167994032
d= [1, 2, 3] 2347341599112
def hanshu(a,b):
a=12
b[0]=110#这里是修改对象,则指向这个对象的变量都会变,即这里修改的是变量b对应的对象,同时变量d也指向这个对象,所以导致变量d也跟着变。
print('a=',a,id(a))
print('b=', b, id(b))
c=10
d=[1,2,3]
hanshu(c,d)
print('c=',c,id(c))
print('d=',d,id(d))
#result
a= 12 140704167994096
b= [110, 2, 3] 2375211831688
c= 10 140704167994032
d= [110, 2, 3] 2375211831688
所以如果有形参修改对象的要求并且不希望原变量也跟着变,那么可以传进去一个变量的副本(浅复制)或者切片,对副本进行修改则不会修改对象,也不会影响原来的变量。
def hanshu(a,b,e):
a[0]=112
b[0]=110
e[0]=119
print('a=',a,id(a))
print('b=', b, id(b