Python函数

本文深入讲解了Python函数的基础知识,包括定义、参数、返回值、缺省参数和不定长参数。还探讨了函数的嵌套调用,局部变量和全局变量的使用,以及递归函数和匿名函数的概念。通过实例展示了如何创建名片管理系统、求素数、判断闰年以及计算日期等实用功能。

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

1 函数的基础知识

1.1 函数定义及调用

什么是函数?

  • 编写代码的效率
  • 代码的重用
  • 具有独立功能的代码块组织为一个小模块

定义函数

  • def 函数名():
  • 代码

调用函数

  • 直接用函数名()进行调用,需要在定义之后进行调用,位置也是写在定义后面

练习:
定义一个函数,能够输出自己的姓名和年龄,并且调用这个函数让它执行

def print_mess():
    name=input('请输入姓名:')
    age=input('请输入年龄:')
    tel_num=input('请输入手机号码:')
    print('姓名是:%s,年龄是:%s,手机号码是:%s'%(name,age,tel_num))
print_mess()

在这里插入图片描述

1.2 函数的参数

  • 形参:就是定义函数的时候,小括号里面的内容,用来接收实参而存在的

  • 实参:就是调用函数的时候,小括号里面的内容

def sum_two_nums(a,b):
    result=a+b
    print(result)
sum_two_nums(45,67)

结果:
在这里插入图片描述
求三角形的周长:

def print_perimeter(a,b,c):
    per=a+b+c
    return per
    # print('这是三角形的周长') # 不会执行
per=print_perimeter(3,4,5)
print(per)

在这里插入图片描述

1.3 函数的返回值

  • 返回值:就是函数返回给调用者的一个结果,需要用return
  • return相当于循环中的break,在函数中遇到return那么就结束了,不管后面有多少代码,都不会执行
#如果要返回多个返回值,那么可以把多个返回值组织成列表、元组等,
#或者用逗号分隔开
def add(a,b):
    return a
    return b #这个return没实际意义,在return a,已经结束
res=add(34,67)
print(res)

结果:
在这里插入图片描述
根据参数、返回值
无参数,无返回值
无参数,有返回值
有参数,无返回值
有参数,有返回值

def A():
    pass
def A():
    return
def A(a):
    pass
def A(a):
    return

1.4 缺省参数

  • 在调用的时候,缺了参数,但是缺的参数在定义函数的时候,就已经给这个参数赋值 了

  • 在调用的时候,如果没有给出这个参数的值,那么使用定义函数中这个参数的
    默认值,否则就会报错

  • 在调用的时候,如果在调用的过程中也给出了这个参数的值,并且在定义时也赋
    值了,那么使用调用函数中的值

def add(a,b,c,d=34):
    print(a)
    print(b)
    print(c)
    print(d)
add(22,45,56,36)

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

1.5不定长参数

在调用函数的时候,参数个数不确定,那么需要在定义不定长参数函数的时候,用*表示可以接收参数个数为n个,*前面的参数是必须要传入的参数,确定传入参数个数,后面传入的都放到一个元组里面。

在不定长参数中*和**分别代表不同的含义

  • *代表的是元组
  • **代表的是字典
def add_nums(a,b,c,*args):
    result=a+b+c
    print(args)
    for temp in args:
        result+=temp
    print('result=%d'%result)
#方法一:
# add_nums(1,2,3,23,45,78,89)
#方法二:
A=(23,45,78,89)
add_nums(1,2,3,*A)

结果:
在这里插入图片描述
元组和字典结合

def print_num(a,b,c,*args,**kwargs):
    result=a+b+c
    print(result)
    print(args)
    print(kwargs)
#方法一:
A=(34,56,'hello')
B={'name':'xiaowang','age':34}
print_num(2,3,4,*A,**B)
#方法二:
# print_num(2,3,4,34,56,345,'hello',name='xiaowang',age=34)

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

2 函数的嵌套调用

2.1函数怎样进行嵌套?

一个函数里面调用了另一个函数,就是函数嵌套

2.2 函数嵌套的应用

打印图形
1、写一个函数打印一条横线

def print_one_line():
    print('-'*30)
print_one_line()

结果:
在这里插入图片描述
2、打印自定义行数的横线(嵌套)

def print_one_line():
    print('-'*30)
def print_num_lines(a):
    i=0
    while i<a:
        print_one_line()
        i+=1
print_num_lines(5)

结果:(打印五条)
在这里插入图片描述
数学计算
1、写一个函数求三个数的和

def sum_three_num(a,b,c):
    result=a+b+c
    print(result)
    return result
sum_three_num(1,2,3)

结果:
6
2、写一个函数求三个数的平均值

def sum_three_num(a,b,c):
    result=a+b+c
    return result
def avg_three_num(a1,b1,c1):
    sum1=sum_three_num(a1,b1,c1)
    avg=round(sum1/3,2)  #保留俩位小数
    print(avg)
avg_three_num(1,1.3,1.2)

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

3 局部变量和全局变量

3.1 局部变量和全局变量的定义

局部变量

  • 在函数内部定义的变量
  • 不同的函数可以定义相同的名字的局部变量
  • 为了临时保存数据,在函数中定义变量进行存储

使用范围:

  • 局部函数

全局变量

  • 如果一个变量,既能在一个函数中使用,也能在其他函数中使用,就是全局变量

使用范围:

  • 所有函数

3.2 全局变量和局部变量的使用

  • 当函数中有自己的变量的时候,那么使用自己的局部变量。
a=20
def A():
    a=10
    print(a)
A()

结果:(使用局部变量:a=10)
10

  • 当函数中没有这个变量的时候,那么使用全局变量。
a=20
def A():
    print(a)
A()

结果:(使用全局变量a=20)
20

3.3 修改全局变量

当局部变量和全局变量名字一样的时候,如果想在函数中修改这个局部变量为全局变量,那么使用global

a=20
def A():
    global a #将局部变量的值变为全局变量
    a=10
    print(a)
# a=20
def B():
    print(a)

A()
B()

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

4 递归函数和匿名函数

4.1 递归函数

递归函数:自己调用自己
例子:
计算阶乘n! = 1 * 2 * 3…n

阶乘的计算
1!=1
2!=2*1=2*1!
3!=3*2*1=3*2!
n!=n*(n-1)
def num(a):
    if a>1:
        result=a*num(a-1)
    else:
        result=1
    return result

res=num(5)
print(res)

结果:
120

4.2 匿名函数

Lambda函数能接收任何数量的参数但只能返回一个表达式的值
匿名函数不能直接调用print,因为lanmbda需要一个表达式
匿名函数:

  • 用lambda关键字创建一个函数,省略了用def定义函数的标准步骤

用法:

  • lambda [arg1,arg2,argn]:expression
res=lambda a,b:a+b
print(res(3,5))

res=lambda a,b:a*b
print(res(4,5))

结果:
8
20

调用:

  • 匿名函数返回的是一个表达式的值,所以需要用一个变量接收
    匿名函数(参数)

匿名函数的使用:

  • 可以仅仅作为一个函数使用,可直接实现想要的功能
  • 还可以作为函数的参数使用,在调用的时候把lambda式子传递给函数的形参

自己定义的函数

def fun(a,b,opt):
    print('a=%d'%a)
    print('b=%d'%b)
    print('result=%d'%opt(a,b))
fun(1,2,lambda x,y:x+y)

结果:
在这里插入图片描述
**还可以作为内置函数的参数:sort(key=lambda x:x[key])
下面的数据如何指定按age或name排序?

students=[{'name':'laowang','age':23},{'name':'xiaoli','age':19},
          {'name':'xiaozhao','age':34}]
#按name排序
students.sort(key=lambda x:x['name'])
print(students)
#按年级降序排序
students.sort(key=lambda x:x['age'],reverse=True)
print(students)

结果:
在这里插入图片描述
函数的拼接:

def str_name(n1,n2,test):
    print(n1)
    print(n2)
    print(test(n1,n2))
str_name('zhang','xiaoming',lambda m,n:m+n)

结果:
在这里插入图片描述
作为内置函数的参数,还可以从键盘输入,但是输入的这个lambda表达式只是一个字符串,所以需要用eval()转换成函数

def add_sum(a,b,fun):
    return fun(a,b)
fun_new=input('请输入一个lambda表达式:')
fun_new=eval(fun_new)
print(type(fun_new))
res=add_sum(3,4,fun_new)
print(res)

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

5 练习

5.1 创建名片管理系统

名片管理系统v1.0
1、增加一个名片
2、删除一个名片
3、修改名片
4、查看某个名片
5、查看所有名片
6、退出系统

card_infos=[]
def print_menu():
    """显示功能模块"""
    print('*'*50)
    print('名片管理系统v1.0')
    print('1、增加一个名片')
    print('2、删除一个名片')
    print('3、修改名片')
    print('4、查看某个名片')
    print('5、查看所有名片')
    print('6、退出系统')
    print('*'*50)
def add_new_card():
    """完成增加名片的功能"""
    # 用来存储添加的名片信息
    card_info={}
    name=input('请输入添加的姓名:')
    qq=input('请输入qq号:')
    weixin=input('请输入微信号:')
    addr=input('请输入地址:')
    card_info['name']=name
    card_info['qq']=qq
    card_info['weixin']=weixin
    card_info['addr']=addr
    # 把每一次添加的名片信息加入到list中
    card_infos.append(card_info)
    # 测试的
    # print(card_infos)
def del_one_card():
    """删除一个名片"""
    del_name=input('请输入删除的名片姓名:')
    flag=0
    for temp in card_infos:
        if temp['name']==del_name:
            card_infos.remove(temp)
            flag=1
            print('删除成功')
    if flag==0:
        print('用户不存在')
def alt_one_card():
    alt_name=input('请输入要修改的名片姓名:')
    flag=0
    for temp in card_infos:
        if temp['name']==alt_name:
            i=card_infos.index(temp)
            new_name=input('请输入新的名片姓名:')
            new_qq=input('请输入新名片的qq号:')
            new_weixin=input('请输入新名片的微信:')
            new_addr=input('请输入新名片的地址:')
            card_infos[i]['name']=new_name
            card_infos[i]['qq']=new_qq
            card_infos[i]['weixin']=new_weixin
            card_infos[i]['addr']=new_addr
            flag=1
            print('修改成功')
    if flag==0:
        print('您要修改的用户不存在')
def find_one_card():
    name=input('请输入要查找的姓名:')
    flag=0 # 用来表示有没有找到这个人,0代表没有这个人
    for temp in card_infos:
        if temp['name']==name:
            print('姓名:%s\tqq号:%s\t微信:%s\t地址:%s'%
                  (temp['name'],temp['qq'],temp['weixin'],temp['addr']))
            flag=1
            print('恭喜你,有这个人')
    if flag==0:
        print('查无此人')
def find_all_card():
    """查找所有名片信息"""
    print('姓名\tqq\t微信\t地址')
    for temp in card_infos:
        print('%s\t%s\t%s\t%s'%(temp['name'],temp['qq'],temp['weixin'],temp['addr']))
def main():
    """控制整个程序的流程"""
    print_menu()
    while True:
        num = int(input('请输入序号:'))
        if num == 1:
            add_new_card()
        elif num == 2:
            del_one_card()
        elif num == 3:
           alt_one_card()
        elif num == 4:
            find_one_card()
        elif num == 5:
            find_all_card()
        elif num == 6:
            break
main()

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

2 用函数实现求100-200里面所有的素数

    提示:素数的特征是除了1和其本身被整除,其他数都不能被整除的数
def prime():
    for i in range(100,200):
        for j in range(2,i):
            if i % j ==0:
                break
            if i == j + 1:
                print(i)
prime()

结果:
101、103、107、109、113、127、131、137、139、149、151、157、163、167、173、179、181、191、193、197、199

3、请用函数实现一个判断用户输入的年份是否是闰年的程序
提示:
1、能被400整除的年份
2、能被4整除,但是不能被100整除的年份
以上2种方法满足一种即为闰年

def leap_year(a):
    if a%400==0 or (a%4==0 and a%100!=0):
        print('%d是闰年'%a)
    else:
        print('%d不是闰年'%a)

leap_year(2004)

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

5.2 判断第几天

1、用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也考虑进去
20180601
是今年第X天

time=input('请输入年月日:')
def is_leap_year(year):
    if year%400==0 or (year%4==0 and year%100!=0):
        return 1
    else:
        return 0

# 计算天数
def month_turn_day(year,month,day):
    day_sum=0
    month31=[1,3,5,7,8,10,12]
    month30=[4,6,9,11]
    for x in range(1,month+1):
        if x in month31:
            day_sum+=31
        elif x in month30:
            day_sum+=30
        elif is_leap_year(year) and x==2:
            day_sum+=29
        elif x==2:
            day_sum+=28
    day_sum+=day
    print('%s是今年的第%d天'%(time,day_sum))
# 获取年月日
def get_y_m_d(time):
    year=int(time[0:4])
    month=int(time[4:6])
    day=int(time[6:8])
    month_turn_day(year,month,day)
get_y_m_d(time)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值