#函数:函数也是一个对象,函数就是可以用来保存一些可以执行的代码,并且在需要的时候对这些代码(语句)进行多次调用
#语法:def 函数名(形参1,形参2... ):回车 代码块
#定义一个函数
def fn():
print('第一个函数')
print('哈哈哈')
#函数中保存的代码块不会立即执行 你需要调用代码才会执行
print(fn)# 返回值是个16进制的内存地址
fn()#print input这些东西也和函数一样是对象,所以调用函数就是在函数名+括号,同print()一样
fn()#fn是函数对象 fn()是调用函数
fn()#一个函数是可以多次输出的
#函数的参数:定义一个函数 来求任意二个数的和
#函数的参数是在定义函数时可以在函数后面的括号定义不等的形参 多个形参我们可以用逗号隔开
def sum(a,b):
print(a + b)
sum(10,10)#实参:实际参数制定了形参 你在定义函数的时候必须传递实际参数,实际参数会赋值给对应的形参,你有几个形参就要传递几个实参
#函数形参的默认值:
def fn1(a,b,c=20 ):#这个c就是默认值
print(a,b,c)
print(c)
#fn1(1,2,1) #但是当我们传递实参的话 他会覆盖默认值,没有传递默认值会生效
fn1(1,2)
#位置参数
def fn2(a=5,b=10,c=20 ):#第一个实参赋值给第一个形参 第二个赋值给第二个以此类推
print(a,b,c)
fn2(b =1,c =2,a =7)#关键字参数可以不按顺序传递实参
# print('111111',end='')#end其实就是关键字参数 位置参数和关键字参数也能混合使用
fn2(1,1,c =11111)
# fn2(c =1 ,3)#混合使用的时,必须把位置参数放在关键字参数的前面
#实参的类型
def fn3(a):
print(a)
b =False
b='python'
fn3(b)#传递实参时并不会检查你插地的类型
def fn4(a,b):
print(a + b)
# fn4(123,'456')#这是一个隐患,不同类型数据相加会报错
def fn5(a):
# a = 20
a[0] =50
print('a=',a,id(a))#在函数内部对形参进行重新赋值不会影响其他变量
c = [1,2,3]
fn5(c.copy())#此时 a和c指向的都是同一个对象
print('c=',c,id(c))
# #a= [50, 2, 3] 1875034792520
# c= [50, 2, 3] 1875034792520
#如果我希望a和c不互相影响可以使用copy进行浅复制
#总结:如果你传递的是一个可变对象的时候,你由不希望我在函数内部的操作影响到函数外部的
#时候 那么你就可以考虑传递一个副本