# ## 函数简介(function)
# - 函数也是一个对象
# - 对象是内存中专门用来存储数据的一块区域
# - 函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用
# - 创建函数:
# def 函数名([形参1,形参2,...形参n]) :
# 代码块
# - 函数名必须要符号标识符的规范
# (可以包含字母、数字、下划线、但是不能以数字开头)
# - 函数中保存的代码不会立即执行,需要调用函数代码才会执行
# - 调用函数:
# 函数对象()
# - 定义函数一般都是要实现某种功能的
# ## 函数的参数
# - 在定义函数时,可以在函数名后的()中定义数量不等的形参,
# 多个形参之间使用,隔开
# - 形参(形式参数),定义形参就相当于在函数内部声明了变量,但是并不赋值
# - 实参(实际参数)
# - 如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,
# 实参将会赋值给对应的形参,简单来说,有几个形参就得传几个实参
# 1.定义函数时指定形参
def fn2(a , b) :
# print('a =',a)
# print('b =',b)
print(a,"+",b,"=",a + b)
# 调用函数时,来传递实参
fn2(10,20)
fn2(123,456)
# 2.定义一个函数
# 定义形参时,可以为形参指定默认值
# 指定了默认值以后,如果用户传递了参数则默认值没有任何作用
# 如果用户没有传递,则默认值就会生效
def fn(a = 5 , b = 10 , c = 20):
print('a =',a)
print('b =',b)
print('c =',c)
fn(1 , 2 , 3)
fn(1 , 2)
fn()
# 3.实参的传递方式
# 位置参数
# 位置参数就是将对应位置的实参复制给对应位置的形参
# 第一个实参赋值给第一个形参,第二个实参赋值给第二个形参 。。。
# fn(1 , 2 , 3)
# 关键字参数
# 关键字参数,可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
# fn(b=1 , c=2 , a=3)
# print('hello' , end='')
# 位置参数和关键字参数可以混合使用
# 混合使用关键字和位置参数时,必须将位置参数写到前面
# fn(1,c=30)
def fn2(a):
print('a =',a)
# 4.函数在调用时,解析器不会检查实参的类型
# 实参可以传递任意类型的对象
b = 123
b = True
b = 'hello'
b = None
b = [1,2,3]
# fn2(b)
fn2(fn)
def fn3(a , b):
print(a+b)
# fn3(123,"456")
def fn4(a):
# 在函数中对形参进行重新赋值,不会影响其他的变量
# a = 20
# a是一个列表,尝试修改列表中的元素
# 如果形参执行的是一个对象,当我们通过形参去修改对象时
# 会影响到所有指向该对象的变量
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
# fn4(c)
# 如果不想对象被影响,可以用以下方法
fn4(c.copy())
fn4(c[:])
print('c =',c,id(c))