Python——函数

2023-05-16

函数的创建和调用:

函数的创建和调用
为什么需要函数:

复用代码
隐藏实现细节
提高可维护性
提高可读性便于调试

函数的创建:

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

def calc(a,b):#a b为形式参数,简称为形参,形参的位置是在函数的定义处
    c=a-b
    return c

result=calc(10,20)#输出-10,10,20称为实际参数的值,简称为实参,实参的位置是函数的 调用处
print(result)

res=calc(b=10,a=20)#10,会根据等号左侧的变量名字(关键字)来传参
print(res)

函数调用的参数传递内存分析

def fun(arg1,arg2):
    print('arg1:',arg1)
    print('arg2:',arg2)
    arg1=100
    arg2.append(10)
    print('arg1',arg1)
    print('arg2',arg2)

n1=11
n2=[22,33,44]
fun(n1,n2)#按照位置顺序传参,arg1,arg2是函数定义处的形参,n1,n2是函数调用处的实参,总结,实参名称与形参名称可以不一致
print('n1',n1)
print('n2',n2)

在函数的调用过程中,进行参数的传递,是否影响实参的值取决于其是否为可变对象
如果是不可变对象,在函数体的修改不会影响实参的值,arg1的值修改为100,不会影响n1的值
如果是可变对象,在函数体的修改会影响到实参的值,arg2的修改,append(10)会影响n2的值

函数参数的定义:

函数的参数定义:

函数的参数定义默认值参数:
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参

个数可变的位置参数:

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

个数可变的关键字形参:

定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
使用**定义个数可变的关键字形参
结果为一个字典

'''

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




# 函数的调用
fun(100)  # 100赋给a
fun(20, 30)  # 20赋给a,30赋给b

print('hello',end='\t')#print的默认end值是换行,可以进行修改为其他值
print('world')


#个数可变的位置参数
def fun1(*args):#函数定义时,可变的位置参数
    print(args)
    print(args[0])#输出第一个参数

fun1(10)
fun1(10,20)
fun1(10,30,405,50)


#个数可变的关键字形参
def fun2(**args):
    print(args)

fun2(a=10)#{'a': 10}
fun2(a=20,b=30,c=40)#{'a': 20, 'b': 30, 'c': 40}

'''def fun3(*args,*a):#报错:SyntaxError: invalid syntax,个数可变的位置参数只可以定义一个
    pass'''

'''def fun3(**args,**args):
    pass
    以上代码,程序也会报错,说明函数中个数可变的关键字形参也只能有一个
    '''
def fun3(*args1,**args2):
    pass
'''def fun4(**args1,*args2):
    pass
    SyntaxError: invalid syntax,上述代码报错,说明
    '''
'''
上述代码fun3不报错fun4报错,说明在函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求个数可变的位置形参放在个数可变的关键字形参之前
'''

函数返回值

def fun(num):
    odd=[] #存奇数
    even=[] #存偶数
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even

print(fun([10,29,34,43,53,55]))
'''
函数的返回值:
    (1)如果函数没有返回值【函数执行完毕之后不需要给调用处提供数据,此时return可以省略不写】
    (2)函数的返回值,如果是1个,直接返回原值
    (3)函数的返回值如果是多个,返回的结果为元组
'''
def fun1():
    print('hello')
    return

fun1()

def fun2():
    return 'hello'

res=fun2()
print(res)

def fun3():
    return 'hello','world'

print(fun3())#('hello', 'world')

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

参数传递小结

def fun(a,b,c):
    print('a=',a)
    print('b=',b)
    print('c=',c)

#函数的调用
fun(10,20,30)
lst=[11,22,33]
'''
fun(lst)#程序会报错
'''
fun(*lst)#在函数调用时,将列表中的每个元素都转换为位置实参传入,输出a=11 b=22 c=33
fun(a=100,c=300,b=200)#函数的调用,所以是关键字实参,输出a=100 b=200 c=300
dic={'a':111,'b':222,'c':333}
'''
fun(dic)
也会报错
'''
fun(**dic)#在函数调用中,将字典中的键值对都转换为关键字实参传入,输出a=111 b=222 c=333

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

def fun2(*args):  #个数可变的位置形参
    print(*args)

def fun3(**args2):  #个数可变的关键字形参
    print(args2)

fun2(10,20,30,40)#输出10 20 30 40
fun3(a=11,b=22,c=33,d=44,e=55)#输出{'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}

def fun4(a,b,c,d):
    print('a=',a)
    print('b=',b)
    print('c=',c)
    print('d=',d)

#调用fun4函数
fun4(10,20,30,40)  #位置实参传递
fun4(a=10,b=20,c=30,d=40) #关键字实参传递
fun4(10,20,c=30,d=40) #前两个参数采用位置实参传递,cd采用关键字实参传递

'''
需求:c,d只能采用关键字实参传递,那么需要在b和c之间加入*,变成:
def fun4(a,b,*,c,d):
例如fun5:
'''


def fun5(a, b, *,c, d):#从*之后的参数在函数调用时,只能采用关键字传递
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)


# 调用fun5函数
#fun5(10, 20, 30, 40)  # 位置实参传递,报错fun5() takes 2 positional arguments but 4 were given
fun5(a=10, b=20, c=30, d=40)  # 关键字实参传递
fun5(10, 20, c=30, d=40)  # 前两个参数采用位置实参传递,cd采用关键字实参传递



'''函数定义时的形参的顺序问题:以下几种方式皆可'''
def fun6(a,b,*,c,d,**args):
    pass

def fun7(*args):
    pass
def fun8(a,b=10,*args,**args1):
    pass

变量的作用域

'''
变量的作用域:
    局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会变为全局变量
    全局变量:函数体外定义的变量,可作用于函数内外
'''
def fun(a,b):
    c=a+b  #c即为局部变量,因为c是在函数体内进行定义的变量,a,b为函数的形参,作用范围也是函数内部,相当于局部变量
    print(c)

name='杨老师'   #name为全局变量,函数内部和外部都可以使用
print(name)
def fun2():
    print(name) #输出杨老师
fun2()

def fun3():
    age=20
    global age2   #global声明的age2为全局变量,可以在函数内外部使用
    age2 = 19
    print(age)
fun3()
print(age2)#输出19

递归函数

'''
递归函数:
    如果在一个函数体内调用了该函数本身,则这个函数称为递归函数
递归的组成部分:
    递归调用与递归终止条件
递归的调用过程:
    每递归调用一次函数,都会在栈内存分配一个栈帧
    每执行完一次函数,都会释放相应的空间
递归的优缺点:
    缺点:占用内存多,效率低下
    优点:思路和代码简单
'''
def fac(n):
    if n==1:
        return 1
    else:
        return n*fac(n-1)
print(fac(6))

def fib(n):
    if n==1 or n==2:
        return 1
    else:
        return fib(n-1)+fib(n-2)
print(fib(6))
for i in range(1,7):
    print(fib(i))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python——函数 的相关文章

随机推荐