Bootstrap

python--函数的创建、调用(封装)、参数的传递、返回值、形参的定义


函数的创建和调用

结构

def 函数名 ([输入参数]):
    函数体
    [return xxx]

print('----函数的创建---')
def calc (a,b):
    c=a+b
    return c #函数的结果给调度处 一般的结果会传递给变量

result=calc(10,30)
print(result)


函数的参数传递

print('----函数的创建---')
def calc (a,b):     #a和b占用了两个实际值的位置 ---所以是形参 ,形参的位置在函数的定义处
    c=a+b
    return c #函数的结果给调度处 一般的结果会传递给变量

result=calc(10,30) #10 30 称为实际参数的值。简称实参 实参出现的位置是函数的调度处
print(result)

参数传递的方式

位置传参:实参的第一个位置传递给了形参的第一个位置

实参1,实参2

关键字传参:(赋值名称参数相同的参数)

形参名称=实参,


print('----函数的创建---')
def calc (a,b):     #a和b占用了两个实际值的位置 -------所以是形参 ,形参的位置在函数的定义处
    c=a+b
    return c #函数的结果给调度处 一般的结果会传递给变量
#根据=左侧的变量传参
#=左侧的变量名称 称为关键字参数
result=calc(b=10,a=30)#10 30 称为实际参数的值。简称实参 实参出现的位置是函数的调度处

print(result)


在函数调用过程中,进行参数传递

如果是不可变对象,在函数体的修改不会影响实参的值

如果是可变对象,在函数体中的修改会影响到实参的值


def fun (arg1,arg2): #是函数定义处的参数是形参
    print('arg1',arg1)
    print('arg1',arg2)
    arg1=100
    arg2.append(10)
    print('arg1:',arg1)
    print('arg2:',arg2)

n1=11
n2=[22,33,44]
print( 'n1:',n1)
print('n2:',n2)
'''
在函数调用过程中,进行参数传递
如果是不可变对象,在函数体的修改不会影响实参的值
如果是可变对象,在函数体中的修改会影响到实参的值
'''
fun(n1,n2)#位置传参 n1 n2是函数调用处的实参

print( 'n1:',n1)
print('n2:',n2)


返回值(函数返回多个值时候,结果为元组)

函数的返回值:
如何函数没有返回值--函数执行完毕后不需要给调度处提供数据 return可以不写
函数的返回值如果是一个--直接就是返回类型 
函数的返回值如果是多个,返回的结果为元组
def fun (num): #是函数定义处的参数是形参
    odd=[]#空列表 存奇数
    even=[]#空列表 存偶数
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even

lst=[10,29,34,23,44,53,55]
'''
函数的返回值:
如何函数没有返回值--函数执行完毕后不需要给调度处提供数据 return可以不写
函数的返回值如果是一个--直接就是返回类型 
函数的返回值如果是多个,返回的结果为元组
'''
def fun1():
    print('hello')
def fun2():
    return 'hello'
def fun3():
    return 'hello','world'

print(fun(lst))#得到了元组
fun1()
res=fun2()
print(res)
res=fun3()
print(res)

'''函数在定义时候 是否需要返回值 视情况而定'''


 函数的形参定义(给形参传递参数时:只有实参与默认值不符合才需要传递)


def fun(a,b=10):#b=10为默认值参数
    print(a,b)

fun(100)
fun(20,30)

在实际应用中 可以传递实参的值用来修改形参的默认值

 

print('hello')#print函数的默认值是\n换行
print('world')
print('hello',end ='\t')#修改为\t 
print('world')

 

 


个数可变的位置参数

定义参数时
无法事先确定传递位置参数的个数,使用可变的位置参数 
*用于定义可变的位置参数
结果为一个元组

 

'''
定义参数时
无法事先确定传递位置参数的个数,使用可变的位置参数 
*用于定义可变的位置参数
结果为一个元组
'''
def fun(*args):
    print(args)

fun(10)
fun(15,20)
print(19,20,30)

'''
def fun(*args,*b):错误 个数可变的位置参数只能是一个
'''


 个数可变的关键字形参

定义参数时
无法事先确定传递关键字实参的个数,使用可变的关键字形参
**用于定义可变的位置参数
结果为一个字典
'''
定义参数时
无法事先确定传递关键字实参的个数,使用可变的关键字形参
**用于定义可变的位置参数
结果为一个字典
'''
def fun(**args):#args是关键字
    print(args)

fun(a=10) #a是关键字
fun(a=30,b=56) #输出是字典

'''
def fun(**args,**b):错误 个数可变的关键字置参数只能是一个
'''

 


同时存在个数可变的位置参数和个数可变的关键字参数

同时存在个数可变的位置参数 和个数可变的关键字参数
要求:
个数可变的可变的位置参数 在个数可变的关键字形参之前
'''
同时存在个数可变的位置参数 和个数可变的关键字参数
要求:
个数可变的可变的位置参数 在个数可变的关键字形参之前

'''

def fun1(*a,**b):
    pass

'''

程序报错
def fun2(**c,*a):
    pass
'''

总结

(函数调用的参数传递)

def fun(a, b, c):
    # abc是形参--在函数定义处
    print('a=',a)
    print('b=',b)
    print('c=',c)

fun(10, 20, 30) # 函数调用时候的参数传递,称为位置传参----一个一个传递
print('--------------')
lst=[11, 22, 33] #列表的位置传参
# fun(lst) 函数报错 只传递来了一个参数
fun(*lst)  #在函数调用时 将列表中的每一个元素都转换为位置实参传入
print('--------------')
fun(a=100,c=200,b=90) #关键字传参
print('--------------')
dic={'a':100, 'c':34, 'b':35} #字典中的关键字传参
fun(**dic)

 


总结

(函数定义的参数传递)

def fun(a, b=10):
    # ab--在函数定义处 ab是形参 且进行了赋值 所以b称为默认值传参
    print('a=', a)
    print('b=', b)

def fun1(*args):
    # 个数可变的位置传参 输出的结果是列表
    print(args)
def fun2(**args):
    # 个数可变的关键字形参
    print(args)
print('-----------')
fun(10)
fun(20,90)
print('-----------')
fun1(2,5,6,8,1) #输出为列表
print('-----------')
fun2(张三=9, 李四=0, a=2, 字典='你') #输出是字典 键=值


 

def fun3(a,b,c,d):
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)
fun3(1,2,3,4) #位置实参传递
print('-----------')
fun3(a=10,b=7,c=4,d=90) #关键字实参传递
print('-----------')
fun3(10,7,c=4,d=90) #前两个参数是位置实参传递 后两个采用的是关键字实参传递


 

'''需求 c d只能采用关键字传递'''
def fun4(a,b,*,c,d): #*之后的的参数 在函数调用的时候 采用关键字传参
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)
#fun4(1, 2, 3, 4)  # 位置实参传递 ab没有采用关键字
print('-----------')
fun4(a=10, b=7, c=4, d=90)  # 关键字实参传递
print('-----------')
fun4(10, 7, c=4, d=90)  # 前两个参数是位置实参传递 后两个采用的是关键字实参传递

 


函数定义时候形参的顺序问题


'''函数定义时候形参的顺序问题'''
'''
def fun5(a,b,*,c,d,**args):
    pass
def fun6(*args,**args2):
    pass
def fun7(a,b=10,*args,**args2):
    pass
'''
def fun5(a,b,*,c,d,**args):
    print('a=',a)
    print('b=',b)
    print('c=',c)
    print('d=',d)
    print('args=',args)
fun5(10,20,d=5,c=6,e=1,李四=2,吗='王二')
print('---------------')
def fun6(*args,**args2):
    print('args',args)
    print('args2',args2)
fun6(10,50,65,80,7,a=10,老王=80,老李='80')
print('---------------')
def fun7(a,b=10,*args,**args2):
    print('a=', a)
    print('b=', b)
    print('args', args)
    print('args2', args2)
fun7(50,f=10,老王=80,老李='80')
fun7(50,8,9,5,f=10,老王=80,老李='80')

 

;