1.可变对象
每个对象当中都保存了3个数据:id(标识)、type(类型)、value(值)
可变对象:对象里面的值可以被改变
列表是一个可变对象
a = [1,2,3]
a[0] = 10 # 改对象 改对象里面的值
这个操作是通过变量来修改对象里面的值,id不改变,不会改变变量指向的对象。
a = [4,5,6] # 改变量
这个操作是在给变量重新赋值 ,id改变,会改变变量指向的对象。
a = [1,2,3]
b = a
b[0] = 10 # 改对象
print('a',a,id(a)) # a [10, 2, 3] 2011845251848
print('b',b,id(b)) # b [10, 2, 3] 2011845251848
b = [20,2,3] # 改变量
print('a',a,id(a)) # a [10, 2, 3] 2011845251848
print('b',b,id(b)) # b [20, 2, 3] 2011844392584
2.函数的简介
函数也是⼀个对象。
函数⽤来保存⼀些可执⾏的代码,并且可以在需要时,对这些语句进⾏多次调⽤。
# 语法
# def 函数名([形参1,形参2,形参3....]):
# 代码块
注意:
函数名必须符合标识符的规范(可以包含字⺟、数字、下划线但是不能以数字开头)
print是函数对象 print()是调⽤函数
3.函数的参数
3.1 形参和实参
- 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值。
在定义函数的时候可以在括后面定义数量不等的形参,多个形参用逗号隔开。 - 实参(实际参数)指定了形参,那么在调⽤函数时必须传递实参,实参将会赋值给对应的形参,简单来说有⼏个形参就要有⼏个实参。
3.2 函数的传递方式
定义形参时,可以为形参指定默认值。指定了默认值以后,如果⽤户传递了参数则默认值不会⽣效。如果⽤户没有传递,则默认值就会⽣效。
def fn(a=5,b=6,c=10):
print('a=', a)
print('b=', b)
print('c=', c)
# 位置参数 1赋值给a 2赋值给b
fn(1,2) # a = 1, b = 2, c = 10
位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参。
关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,⽽根据参数名进⾏传递。
def fn2(a,b,c):
print('a=', a)
print('b=', b)
print('c=', c)
fn2(b=1,c=2,a=3) # a = 3, b = 1, c = 2
位置传参和关键字传参可以混合使用, 关键字传参要写在位置传参的后面。
fn2(1,2,c=20)
3.3 实参的类型
实参可以传递任意类型的对象,包括函数。
函数在调用的时候,解析器是不会检查函数的类型的。
def fn3(a,b):
print(a + b)
# fn3(1,2)
fn3(1,'2') # TypeError: unsupported operand type(s) for +: 'int' and 'str'
3.4 函数内形参的改变
在函数中对形参重新赋值,不会影响其他赋值。
def fn4(a):
a = 20
print('a =',a) # a = 20
c = [1,2,3]
fn4(c)
print('c =',c,id(c)) # c= [1, 2, 3] 2728035308296
如果形参是一个可变对象,当我们在函数内修改对象(改对象的值)会影响到所指向该对象的变量。
def fn4(a):
a[0]=10
print('a =',a) # a = [10, 2, 3]
c = [1,2,3]
fn4(c)
print('c =',c,id(c)) # c= [10, 2, 3] 1346795557640
4.不定长参数
- 在定义函数时,可以在形参前面加一个*号 ,这样这个形参可以获取到所有实参,它会将所有的实参保存到⼀个元组中。
- 带*号的形参只能有⼀个,可以和其他参数配合使⽤。
- *形参只能接受位置参数,不能接受关键字参数。
- 不定长参数不是必须写在最后,但是注意,带星号的参数后面的所有的形参必须以关键字的形式来传递。
def fn2(a,*b,c):
print('a=', a)
print('b=', b)
print('c=', c)
fn2(1,2,3,4,c=5) # a= 1, b= (2, 3, 4), c= 5
- **形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值。
- **形参只有⼀个,并且必须写在所有参数的后⾯。
def fn3(b,c,**a):
print('a=', a)
print('b=', b)
print('c=', c)
fn3(b=1,d=2,c=3,e=50,f=80) # a= {'d': 2, 'e': 50, 'f': 80},b= 1,c= 3
5.参数的解包
传递实参时,也可以在序列类型的参数前添加星号,这样它会⾃动的将序列中元素依次作为参数传递。
要求序列中的元素的个数必须和形参的个数⼀致
def fn3(a,b,c):
print('a=',a)
print('b=', b)
print('c=', c)
t = (1,2,3)
fn3(*t) # a= 1, b= 2, c= 3
def fn3(a,b,*c):
print('a=',a)
print('b=', b)
print('c=', c)
t = (1,2,3,4) # 实参比形参多,形参需要加*
fn3(*t) # a= 1, b= 2, c= (3, 4)
def fn3(a,b,c):
print('a=',a)
print('b=', b)
print('c=', c)
d= {'a':1,'b':2,'c':3}
fn3(**d) # a= 1, b= 2, c= 3