- 写在函数之前
- 可变对象
每个对象都保存了3个数据 id(标识) type(类型) value(值)
# 列表是一个可变对象
a = [1,2,3]
# 修改对象里面的值,id不变
a[0] = 10
# 实际上修改了变量,此a非彼a,id已变
a = [4,5,6]
- 1.修改变量和对变量赋值对id的影响
a = [1,2,3]
print('修改前的id:',id(a))
a[0] = 10
print('修改后的id:',id(a))
a = [4,5,6]
print('赋值后的id:',id(a))
- 2.b = a 不改变id,修改对象的值会同时改变两者
a = [1,2,3]
print(a,id(a))
b = a
print(b,id(b))
b[0] = 10
print(a,id(a))
print(b,id(b))
b = [20,2,3]
print(b,id(b))
- 回到正题
函数
1.函数的定义
- 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
- 函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但用户也可以自定义函数。
# 参数1~n为形参
# 别忘记最后的:
def 函数名(参数1,参数2,参数n):
语句
return
# 调用时参数1~n为实参
函数名(参数1,参数2,参数n)
- 实参可以传递任意类型的对象
# 定义一个函数
# 形参之间用,隔开
def fn(a,b):
print('a =',a)
print('b =',b)
# 调用时要对形参赋值
fn(1,2)
a = 1
b = 2
- 注意: 函数需要调用才会运行: 函数名(参数)
2.函数的传递方式
- 解析器不限制传参的形式,所以传参之前一定要确定参数类型正确一致.
- 位置传参
- fn(1,2,3) →def fn(a,b,c)
- 关键字传参
- fn(b=2,c=3,a=1)
- 混合传参
- 注意:关键字参数不能写在位置参数的前边
- fn(1,2,c=3)
# 函数的传递方式
def fn(a,b,c=10):
print('a = ',a)
print('b = ',b)
print('c = ',c)
fn(1,2,3)
- 需要注意的点:
- 修改不改变id; 赋值改变id
- id一样,数据就一样
# 当用形参为可变对象,当修改对象的值时
# 会影响到所指向该对象的变量
def fn4(a):
a[0] = 10
print('a =',a)
c = [1,2,3]
fn4(c)
print('c =',c)
- 解决方法:
- 通过copy(实参)
- 或实参[:]切片传参
- 改变id,实现实参不变
不定长参数
- *args 位置参数
- **kwargs 关键字参数
# 不定长参数
# def s(a,b,c):
# print(a+b+c)
# 参数不够会报错
# # TypeError: s() missing 1 required positional argument: 'c'
# s(1,2)
# 裝包,在形参前加*号
def fn(*b):
print('b = ',b,type(b))
fn(1,2,3,4,5,6,7)
def s(*b):
# 定义变量保存结果
r = 0
# 遍历元组,返回结果
for i in b:
r += i
print(r)
s(1,2,34,555)
- 注意:
- *号要在形参之前
- 带*号的形参只能有一个
- *号之后的形参只能以关键字传参
- 单*号形参只接收位置参数
- 双**号形参能够接收关键字参数,并以字典形式处理
def fn2(a,b,*c):
print('a =',a)
print('b =',b)
print('c =',c)
fn2(1,2,3,4,5)
def fn3(*a,b,c):
print('a =',a)
print('b =',b)
print('c =',c)
fn3(1,2,3,b=4,c=5)
函数的解包
- 类似于收集器
# 参数的解包
def fn3(a,b,c):
print('a =',a)
print('b =',b)
print('c =',c)
t = (1,2,3)
d = {'a':1,'b':2,'c':3}
fn3(*t)
fn3(**d)