python的可变对象与函数

本文深入探讨Python中对象的概念,特别是可变对象的特性,以及如何通过函数进行操作。同时,详细介绍了函数的定义、参数类型,包括位置参数、关键字参数、不定长参数和参数解包,帮助读者掌握Python函数的高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值