• 写在函数之前
  • 可变对象
    每个对象都保存了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)