函数及其参数
本节主要有:
- 函数简介,参数默认值
- 参数的两种传递方式:
- 位置参数
- 关键字参数
- 不定长参数:
- 位置参数装包
- 关键字参数装包
- 参数的解包( * 和 ** )
Tips:如果不想改变原数据,传递参数时尽量用其副本
# 函数也是一个对象
# 对象是内存中专门用来存储数据的一块区域
# 一切皆对象
# 函数的参数:
def rt ( a ) :
print( 'zzzz', a )
rt( 3 )
def sum(a,b,c) :
print(a*b*c)
sum(4,5,8)
# 定义形参时可以指定默值,没有传递对应参数,默认值生效
def fn( a , b=10 , c=20 ) :
print(a,b,c)
fn(a=1, c=2)
fn(1,2,5)
# 实参的传递方式
# - 位置参数
# 形参和实参位置一一对应
# - 关键字参数
# 直接根据参数名传递参数
# 混合使用时,必须将位置参数写在前面
fn( 3,c=1 )
# 传递参数时,解析器不会检查实参的类型,实参可以是任意类型的数据
def p( ) :
print('hello')
def p1(a) :# a当作一个函数对象的参数
print('a =', a)
a( )
p1(p)
def fn1(a) :
# 在方法中,通过形参修改对象时,会影响到所有指向该对象的变量
a[0]=100
print('a=',a)
c = [1,2,3]
fn1(c.copy( ))# 用c的副本传递给a , c不会受到影响
print('c=',c)
fn1(c[ : ])# 用c的切片传递给a , c不会受到影响
print('c=',c)
fn1(c)
print('c=',c)
# 不定长参数
# 在定义函数时,可以在形式参数前加上一个*,
# 它将会将传递的实参保存到一个元组tuple中(装包)
def fn2(*nums) :
print('nums =',nums,type(nums))
def fn3(*nums) :
result = 0
for n in nums :
result+=n
print(result)
fn2(1,2,3,4,5,6)
fn3(1,2,3,4,5,6)
# 可变参数*b不是必须写在最后,但它后面的实参传递时,必须以关键字形式传递
def fn(a,*b,c) :
print('a =',a)
print('b =',b)
print('c =',c)
fn(1,2,3,4,c=5)
# 如果形参开头只写一个*,则所有的实参传递时,必须以关键字形式传递
def fn(*,a,b,c) :
print('a =',a)
print('b =',b)
print('c =',c)
fn(a=1,b=2,c=3)
# *形参只能接收位置参数
# **形参可以接收其他剩余的关键字参数,存储到一个字典中,
# 字典key是参数的名字,value是参数的值
# **形参只能放在所有参数的最后
def fn3(a,b,**c) :
print('a =',a)
print('b =',b)
print('c =',c)
fn3(1,d=4,b=2,c=3)
# 参数的解包
def fn4(a,b,c) :
print('a =',a)
print('b =',b)
print('c =',c)
# 在传递实参时在序列前加上*,可以对序列进行解包后依次传递参数
t = (4,5,6)
fn4(*t)
# 字典需要用**,字典中的key要与形式参数一一对应,传递的是value
d = { 'a':7 , 'c':8 , 'b':9 }
fn4( **d )