Python中的函数(10)

本文详细探讨了Python中的函数,包括定义、调用、函数的本质、各种参数类型如位值、关键字、默认和可变参数,以及*args和**kwargs的使用。还重点介绍了函数的返回值和递归函数的概念,通过实例展示了如何实现阶乘计算、斐波那契数列以及查找数字位置等递归操作。

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

函数定义:

函数是组织好的,可重复使用的,用来实现独立功能的代码段。
函数可以提高程序代码的重用率。
def 函数名():
函数封装的代码

1.def是英文define(定义)的缩写
2.函数名称应该能够表达函数封装代码的功能,方便后续调用
3.函数名符合标识符命名规则
4.函数先定义,后调用
5.函数不调用,不执行
6.函数可以调用多次

函数调用:

通过 函数名()即可完成对函数的调用

#从上向下执行程序
def say():#定义函数
    print("1.嗯")
    print('2.哈')
    print("3.嘿")
#只有在程序中,主动调用函数,才会让函数执行
say()#函数的调用不能放在函数定义上方

运行结果:

在这里插入图片描述

函数调用的本质

#函数调用的本质:本质是函数名对应的内存地址()
def xiaogou():
    print('ni好')

print(id(xiaogou))
d=xiaogou#将xiaogou的内存地址赋值给d变量
print(id(d))
d()

运行结果:
在这里插入图片描述

def hs():
    print(i+1)

i=5
a=hs
b=hs
a()
i=7
b()
"""
运行结果:
6
8
"""

定义带有参数的函数

def qiuhe(a,b):#定义的时候,成为形参,因为它没有实际的的值,给它什么值,他就是什么值,没有数据,占了位置
    c=a+b
    print(c)
qiuhe(2,3)#5 实参:调用的时候,参数为实参有实际的值了
qiuhe(5,6)#11

函数的参数

位值参数

#位置参数
def hs(a,b):
    c=a+b
    print(c)
hs(2,3)
#hs(2,3,4)#不对,必须是一一对应着的参数
'''
运行结果:
5
'''

关键字参数

# 关键字参数,针对实参
def hs(a, b, c):
    print(a, b, c)
# 关键字参数和位置参数同时使用时,关键字参数必须在位置参数后面 定义
hs(c=1, a=2, b=3)
hs(2, 3, c=7)  # 关键字参数,针对实参,这里正确
# hs(a=2,3,4)#比如这里,报错
"""
运行结果:
2 3 1
2 3 7
"""

默认参数

#默认参数:写在形参里面
def dengji(name,age,sex='男'):
    print(name,age,sex)


dengji("张三",19)
dengji("李四",20,'男')
dengji('王五',21,'女')#女 会修改默认参数 男

"""
运行结果:
张三 19 男
李四 20 男
王五 21"""

可变参数

元组参数 *args
#元组参数
def kb(*a):#通过给形参前面添加*号,使参数变成一个元组,所有传递的参数变成元组的元素
    print(a,type(a))#元组
kb(1)#(1,) <class 'tuple'>
kb(1,2,3,4)#(1, 2, 3, 4) <class 'tuple'>
kb()#() <class 'tuple'>

*具有打散序列的功能

print("第一个")
def kb2(*args):
    print(args,type(args))
x=(1, 2, 3)
kb2(x)#这里将一整个x看做了一个整体
kb2(*x)#一个个对应的传过去

print("第二个")
#*具有打散序列的功能
def kb2(*args):
    print(args,type(args))
    print(args[0],args[1],args[2])
x=(1, 2, 3)
kb2(*x)

运行结果:
在这里插入图片描述

a = [1, 2, 3]
print(*a)

b = (1, 2, 3)
print(*b)

c, *d = a
print(c, d)
"""
运行结果:
1 2 3
1 2 3
1 [2, 3]
"""

字典参数 **kwargs
def kb(**kwargs):
    print(kwargs,type(kwargs))
kb(name='张三',age=18)
kb(name='张三',age=20,sex='男')
kb()

运行结果:
在这里插入图片描述

打散字典

def kb(name,age):
    print(name,age)
a={"name":"张三","age":"20"}#这里的key值要和形参一样
kb(**a)
"""
运行结果:
张三 20
"""

注意: **kwargs 必须放在*args后面

def kb(*a,**b):
    print(a,b)
a={"name":"张三","age":"20"}
kb(1,2,3,**a)
"""
运行结果:
(1, 2, 3) {'name': '张三', 'age': '20'}

"""

四种函数参数的总结

#定义函数时参数的顺序:
# 位置参数、元组参数、默认参数、字典参数
def kb(a, *b, c=9, **d):
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)


kb(1, 2, 3, 4, 5)


def kb2(a, *b, c=9, **d):
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)


kb2(1, 2, 3, name='张三')


def kb3(a, b=9, *c, **d):
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)


kb3(1, 2, 3, 4)

函数的返回值

return关键字的两个作用
return 关键字可以返回结果
return,表示返回,后续的代码都不会被执行

def hs(a, b):
    c = a + b
    d = a - b
    e = a * b
    return c, d, e  # python中可以有多个返回值


# 使用一个变量x接收多个值,返回多值就是返回一个tuple
x = hs(5, 6)
print(x)


def hs(a, b):
    c = a + b
    d = a - b
    e = a * b
    return c, d, e  # python中可以有多个返回值


# 使用等量变量来接收返回值
a, b, c = hs(5, 6)
print(a, b, c)

运行结果:
在这里插入图片描述

def hanshu():
    i = 0
    while i < 5:
        if i == 2:
            return  # return 没有返回值,返回值为空
        print(i)
        i += 1


x = hanshu()
print(x)

运行结果:
在这里插入图片描述

函数之间的调用

#函数之间的调用
def hs1(x,y):
    print(x*y)
def hs2(a,b,c):#在hs2()函数中调用hs1()
    hs1(a,b)
    print(c)
hs2(2,3,4)
"""
运行结果:
6
4
"""
def getMoney(price,numbers):

    return price*numbers

def zheKou(money):
    if money>300:
        return money*0.8
    else:
        d=int(money)-int(money)%10
        return d

price = float(input("价格"))
num = float(input("重量"))

# money=getMoney(price,num)
# money=zheKou(money)
#先运行函数里面的,由内而外
money=zheKou(getMoney(price,num))
print(money)

运行结果:
在这里插入图片描述

递归函数

递归:如果一个函数在内部调用自身本身,这个函数就是递归函数
使用递归函数的条件:
1.必须留出口
2.自己调用自己

递归三件:
1.递归前进
2.递归后退
3.递归边界
当递归边界成立的时候,递归后退,不成立的时候递归前进

1.求6的阶乘
#求6的阶乘
def jiecheng(n):
    if n == 1:  # 递归边界
        return 1
    else:
        return n * jiecheng(n - 1)


x = jiecheng(6)
print(x) # 720
2.斐波那契数列的规则
#斐波那契数列的规矩
#1 1 2 3 5 8 13 21
def tuzi(n):
    if n==1 or n==2:
        return 1
    else:
        return tuzi(n-1)+tuzi(n-2)
n=int(input("请输入月份"))
print(n,"月的兔子数是",tuzi(n))
#下面把每月的兔子数给遍历出来
for i in range(1,n+1):
    print("第",i,"个月的兔子数是",tuzi(i))

运行结果:
在这里插入图片描述
用循环的形式写出来

n=int(input("月份") )
a,b=1,1,
for i in range(1,n+1):
    if i ==1 or i==2:
        print(1,end='\t')
    else:
        a,b=b,a+b
        print(b,end="\t")

在这里插入图片描述

3.先向里面的递归,再打印外面的heihei
#先向里面的递归,再打印外面的heihei
def p_n(n):
    print(n)
    if n==1:
        return
    p_n(n-1)
    print("--heihei")
p_n(4)

运行结果:
在这里插入图片描述

4.查找数字的所在位置
def zbcz(a, start, end, key):
    if start > end:
        return -1
    middle = (start + end) // 2
    if key > a[middle]:
        return zbcz(a, middle + 1, end, key)
    elif key < a[middle]:
        return zbcz(a, start, middle - 1, key)
    else:
        return middle


a = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
k = int(input("请输入要查找的数:"))
x = zbcz(a, 0, len(a) - 1, k)
print(k, "的位置是", x)

运行结果:
在这里插入图片描述
用循环的形式写出来

def zbcz(a, start, end, k):
    while start <= end:
        middle = (start + end) // 2
        if k > a[middle]:  # 如果要查找的数比中间数大
            start = middle + 1  # 那么向右边查找
        elif k < a[middle]:  # 如果查找的数比中间数小
            end = middle - 1  # 那么向左查找
        elif k == a[middle]:  # 如果相等,那么返回此时的middle值
            return middle
    return -1  # 如果循环结束没有找到,那么返回-1


a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = int(input('请输入要查找的数:'))
x = zbcz(a, 0, len(a) - 1, n)  # 调用二分查找(也叫折半查找)函数。位置下标从0开始到最后一个下标
if x == -1:
    print("查无此数")
else:
    print(n, "的位置是", x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值