Python基础学习(六)--函数,参数,递归

一、函数

函数就是组织好的,可以重复利用的,用来实现独立功能的代码段。
可以提高程序的代码重用率

(一)定义

1.格式

形如:

def 函数名():
    代码段

函数名实际上就是一个标识符,明明要求与变量命名要求完全相同,在此不再赘述。

2.尝试
floor=int(input('请输入楼层:'))
if floor==1:
    print('西单大悦城1层欢迎您')
    print('1楼、鞋类商品')
    print('2楼、女性服饰')
    print('3楼、男装')
    print('您现在在1层')
elif floor==2:
    print('西单大悦城2层欢迎您')
    print('1楼、鞋类商品')
    print('2楼、女性服饰')
    print('3楼、男装')
    print('您现在在2层')
elif floor==3:
    print('西单大悦城3层欢迎您')
    prt()print('1楼、鞋类商品')
    print('2楼、女性服饰')
    print('3楼、男装')
    print('您现在在3层')

可以看到上述代码有非常多重复的地方,如果用函数的话,可修改成:

def prt(f):    # 定义函数
    print('西单大悦城',f,'层欢迎您')
    print('1楼、鞋类商品')
    print('2楼、女性服饰')
    print('3楼、男装')
    print('您现在在',f,'层')
floor=int(input('请输入楼层:'))
if floor==1:
    prt(1)    # 调用函数
elif floor==2:
    prt(2)
elif floor==3:
    prt(3)
重点

1.只在调用的时候执行
2.函数必须先定义后调用

(二)参数

定义的时候,称为形参,因为没有实际的值
调用的时候,你给它什么值,它就是什么值

def qiuhe2(a,b):
    c=a+b
    print(c)
qiuhe2(2,3)    # 5
qiuhe2(5,6)    # 11

(三)函数调用的本质

函数调用的本质是函数名对应内存地址

def qiuhe3(a,b,c):
    s=a+b+c
    print(s)
qiuhe3(1,2,3)
print(qiuhe3)    # <function qiuhe3 at 0x000000000209D1E0>
qiuhe=qiuhe3    # 将qiuhe3的内存地址赋给qiuhe变量
# 同
print(id(qiuhe3))
print(id(qiuhe))
qiuhe(1,2,3)
面试题
def hs():
    print(i+1)
i=5
a=hs
b=hs
a()    # 6
i=7
a()    # 8
b()    # 8

二、参数的定义方式

(一)位置参数

前面用的那些就是位置参数,形参与实参一一对应传值。

(二)关键字参数

关键字参数无视参数顺序

def cha(a,b):    # a:3 b:1
    print(a-b)
cha(b=1,a=3)

当位置参数与关键字参数一起使用时,主要特别注意
关键字参数和位置参数同时使用时,关键字参数必须在位置参数后面

def hs(a,b,c):
    print(a,b,c)    # 2 3 7
hs(2,3,c=7)

若调用时用
hs(a=2,4,5)    # 报错

(三)默认参数

def dengji(name,age,sex='男'):
    print(name,age,sex)
dengji('张三',19)    # 张三 19 男
dengji('李四',20,'男')    # 李四 20 男
dengji('王五',21,'女')    # 王五 21 女

默认参数使用时要放在后面

def xiaozhu(a=3,b):     # 报错

def xiaozhu(b,a=3):
    print(a,b)
xiaozhu(1,2)

(四)可变参数

1.’*’
(1)’*'使参数变为了一个元组,所有传递的参数变为元组的元素
def kb(*a):
    print(a)
    # for x in a:
    #     print(x)
kb(1)    # (1,)
kb(1,2,3,4)    # (1,2,3,4)
kb()    # ()
def kb2(*a):
    print(a)
x=(1,2,3)
kb2(*x)    # (1, 2, 3)
kb2(x)    # ((1, 2, 3),)
(2)’*'具有打散序列的功能
def func(a,b,c):
    print(a,b,c)
tup=(1,2,3)
func(*tup)    # 1 2 3
lst=[1,2,3]
func(*lst)    # 1 2 3
2.’**’
(1)’**'使参数变成一个字典,所有传递的参数变为字典的键值对

!!!这里传参要求是键=值的形式

def kb(**kwargs):
    print(kwargs,type(kwargs))
kb(name='张三',age=18)    # {'name': '张三', 'age': 18} <class 'dict'>
kb(name='张三',age=18,sex='男')    # {'name': '张三', 'age': 18, 'sex': '男'} <class 'dict'>
kb()    # {} <class 'dict'>
(2)’**'有打散字典的功能,实参的key值必须与形参名相同,否则报错
def kb(name,age):
    print(name,age)
# 这里的key值必须与形参名相同,否则报错
a={'name':'张三','age':18}
kb(**a)    # 张三 18
(3)’**kwargs’必须放在’*args’后面
# 若写成def kb(**b,*a),会报错
def kb(*a,**b):
    print(a,b)
a={'name':'张三','age':18}
kb(1,2,3,**a)    # (1, 2, 3) {'name': '张三', 'age': 18}
kb(1,2,3,*a)    # (1, 2, 3, 'name', 'age') {}

总结

定义函数时,参数的位置:位置参数,元组参数,默认参数,字典参数
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)
结果:
a= 1
b= (2, 3, 4, 5)
c= 9
d= {}

kb(1,2,3,name='张三')
结果:
a= 1
b= (2, 3)
c= 9
d= {'name': '张三'}

三、返回值

没有return的函数,均返回空值None
python中可以返回多个值–元组类型
return的两个作用:1.返回内容;2.结束此方法

return返回内容:

def qiuhe(a,b):
    c=a+b
    return c
x=qiuhe(1,2)
print(x)    # 3
y=qiuhe(10,20)
print(y)    #30
注意!!!
a=[1,2,30,]
x=a.remove(30)
# a=[1,2],x=None,说明remove()是一个有参数没有返回值的函数
print(x)    # None

返回值为多个值:

def hs(a,b):
    c=a+b
    d=a-b
    e=a*b
    return c,d,e
x=hs(5,6)
print(x)    # (11, -1, 30)
x,y,z=hs(5,6)
print(x,y,z)    # 11 -1 30

可以借助下面的两个代码段,好好体会什么叫做return的结束此方法的作用:

def hanshu(a,b):
    return
    c=a+b
    d=a-b
    return c,d
x=hanshu(5,6)
print(x)    # None
def hs():
    i=0
    while i<5:
        if i==2:
            return
        print(i)
        i+=1
x=hs()
print(x)
结果:
0
1
None

四、函数间的调用

def hs1(x,y):
    print(x*y)    # 6
def hs2(a,b,c):
    hs1(a,b)
    print(c)    # 4
hs2(2,3,4)
def total(price,num):
    return price*num
def pd():
    t=total(price,num)
    if t>300:
        return t*0.8
    else:
        return int(t)-int(t%10)
price = float(input('请输入西红柿单价:'))
num = float(input('请输入数量:'))
print('最终价格为:',pd())

五、递归函数

函数三大件:
1.递归前进
2.递归后退
3.递归边界

当递归边界成立的时候,递归后退,不成立的时候递归前进

(一)求阶乘
def jiecheng(n):
    if n==1:
        return 1
    else:
        return n*jiecheng(n-1)
x=jiecheng(6)
print(x)
(二)求第n个月的兔子数(斐波那契序列)
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))

# 使用循环的写法
def tuzi(n):
    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')
n=int(input('请输入月份:'))
tuzi(n)
(三)折半查找

只能用于有序的序列

def zbcz(a,start,end,key):
    if start>end:
        return -1
    middle=(start+end)//2
    if key<a[middle]:
        return zbcz(a,start,middle-1,key)
    elif key>a[middle]:
        return zbcz(a,middle+1,end,key)
    else:
        return middle
a=[1,2,3,4,5,6,7,8,9,10]
k=int(input('请输入想要查找的数:'))
x=zbcz(a,0,len(a)-1,k)
if x>=0:
    print(k, '的位置为:', x)
else:
    print('该序列中没有',k)

# 循环实现
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
        else:
            return middle
    return -1
a=[1,2,3,4,5,6,7,8,9,10]
k=int(input('请输入想要查找的数:'))
x=zbcz(a,0,len(a)-1,k)
if x>=0:
    print(k,'的位置为:',x)
else:
    print('该序列中没有',k)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值