当前位置: 首页 > news >正文

python语言进阶之函数

目录

前言

函数的创建和调用

函数创建

调用函数

参数传递

形式参数和实际参数

位置参数

数量必须与定义时一致

位置必须与定义时一致

关键字参数

为参数设置默认值

可变参数

**parameter

返回值

变量的作用域

局部变量

全局变量

匿名函数


前言

提到函数,大家可能会想到数学函数,函数是数学中最重要的一个模块,贯穿整个数学。在Python中,函数的应用非常广泛。在前面我们已经多次接触过函数。例如,用于输出的print()函数、用于输入的input()函数,以及用于生成一系列整数的range()函数。但这些都是Python 内置的标准函数,可以直接使用。除了可以直接使用的标准函数之外,Python还支持自定义函数,即通过将一段有规律的、重复的代码定义为函数,以达到一次编写、多次调用的目的。使用函数可以提高代码的重复利用率。

函数的创建和调用

函数创建

创建函数也称为定义函数,可以理解为创建一个具有某种用途的工具。使用 def 关键字实现。

语法格式如下:

def functionname([parameterlist]):

["comments"]

[functionbody]

其中:functionname为函数名称,在调用函数时使用,parameterlist为可选参数,用于指定想函数中传递的参数,如果有多个参数,则各参数间使用逗号‘,’分割,如果不指定,则表示该函数没有参数,在调用时,也不指定参数,"comments"为可选参数,表示为函数指定注释,也称为文档字符串,其内容通常是说明该函数的功能、要传递的参数的作用等,可以为用户提供油耗提示和帮助的内容。Functionbody为可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。如果函数有返回值,可以使用return语句返回。

举例:

def result(a,b):
    """功能:用于计算a和b之间的计算结果
        a和b为输入的数字"""
    return a*b+a

这样我们就完成了函数的创建,接下来我们看如何调用函数。

调用函数

调用函数也就是执行函数。如果把创建的函数理解为创建一个具有某种用途的工具,那么调用函数就相当于使用该工具。

语法格式如下:

functionname([parametersvalue])

其中,functionname为函数名称,要调用的函数名称必须是已经创建好的,parametersvalue为可选参数,用于指定各个参数的值,如果需要传递多个参数值,则各参数值间使用逗号分割,如果该函数没有参数,则直接写一对小括号即可。

举例:

调用上述创建的result函数

def result(a,b):
    """功能:用于计算a和b之间的计算结果
        a和b为输入的数字"""
    return a*b+a

print(result(4,9))

运行结果如下:

参数传递

在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。

形式参数和实际参数

在使用函数时,经常会用到形式参数和实际参数。它们都被叫作参数,下面将先通过形式参数与实际参数的作用来讲解二者之间的区别。

形式参数和实际参数在作用上的区别如下:

形式参数:在定义函数时,函数名后面括号中的参数为形式参数

实际参数:在调用一个函数时,函数名后面括号中的参数为实际参数,也就是将函数的调用者提供给函数的参数。

函数定义时参数列表中的参数就是形式参数,而函数调用时传递进来的参数就是实际参数,就像剧本选主角一样,剧本的角色相当于形式参数,而演角色的演员就相当于实际参数。

举例:

#定义函数tool
def tool(list):
    str = '我叫%s,我今年%d岁了。'
    print(str%list)
#声明变量
a = ('小明',7)
b = ('小刚',8)
#调用函数
tool(a)
tool(b)

运行结果如下:

位置参数

位置参数也称必备参数,必须按照正确的顺序将其传到函数中,即调用时的数量和位置必须和定义时是一样的。

数量必须与定义时一致

在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则将抛出TypeError 异常,提示缺少必要的位置参数。

例如上面例子中,调用函数tool()时,传递两个参数:

位置必须与定义时一致

在调用函数时,指定的实际参数的位置必须与形式参数的位置一致,否则将产生以下两种结果。

抛出异常信息

抛出TypeEror 的异常信息,其主要原因在于,实际参数的类型与形式参数的类型不一致,并且在函数中,这两种类型不能正常转换。

举例:

#定义函数tool
def tool(a,b,c):
    print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool(7,'小明',98)

运行结果如下:

产生的结果与预期不符

在调用函数时,如果指定的实际参数与形式参数的位置不一致,但是他们的数据类型一致,那么就不会抛出异常,而是产生结果与预期不符的问题。

举例:

#定义函数tool
def tool(a,b,c):
    print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool('小明',98,7)

运行结果如下:

关键字参数

关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确即可。这样可以避免用户需要牢记参数位置的麻烦,使得函数的调用和参数传递更加灵活方便。

举例:

#定义函数tool
def tool(a,b,c):
    print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool(b = 7,a = '小明',c = 98)

运行结果如下:

为参数设置默认值

调用函数时,如果没有指定某个参数,则将会抛出异常。为了解决这个问题,我们可以为参数设罗默认值,即在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,可以直接使用定义函数时设置的默认值。

def functionname(.,[parameter1 = defaultvalue1]):

[functionbody]

其中,functionname为函数名称,在调用函数时使用,parameter1 = defaultvalue1为可选参数,用于指定向函数中传递的参数,并且为该参数设置默认值为defaultvalue1,functionbody为可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。

举例:

#定义函数tool
def tool(a,b,c = 100):
    print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool('小明',7)

运行结果如下:

可变参数

在Python中,还可以定义可变参数。可变参数也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个到任意个。

定义可变参数时,主要有两种形式:一种是*parameter;另一种是**parameter。

*parameter

*parameter 形式表示接收任意多个实际参数并将其放到一个元组中。例如,定义一个函数,让其可以接收任意多个实际参数。

举例:

#定义函数sum
def sum(*temp):
    print('\n我喜欢的水果有:')
    for i in temp:
        print(i)
#调用函数
sum('苹果')
sum('苹果','香蕉','梨')
sum('香蕉','榴莲','火龙果','李子','哈密瓜')

运行结果如下:

**parameter

**parameter形式表示接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中。

举例:

def printsign(**sign):
    # 定义输出姓名和星座的函数# 输出一个空行# 遍历字典# 输出组合后的信息
    print()
    for key, value in sign.items():
      print("["+ key+"]的星座是:"+ value)

printsign(绮梦='水瓶座',冷伊一='射手座')

运行结果如下:

返回值

到目前为止,我们创建的函数都只是为我们做一些事,做完即结束。但实际上,有时还需要对事的结果进行获取。为函数设置返回值的作用就是将函数的处理结果返回给调用它的函数。

在Python 中,可以在函数体内使用return 语句为函数指定返回值。该返回值可以是任意类型,并县无论retun 语句出现在函数的什么位置,只要得到执行,就会直接结束函数的执行。

举例:

def sum(a,b):
    return a+b          #返回a+b的和
#调用函数
print(sum(1,7))

运行结果如下:

变量的作用域

变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“局部变量”和“全局变量”。下面分别对这两个变量进行介绍。

局部变量

局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。也就是说,函数内部的名字只在函数运行时才会创建,在函数运行之前或者运行完毕之后,所有名字都将不存在。所以,如果在函数外部使用函数内部定义的变量,就会出现抛出NameError异常。

举例:

def sum():
    c = '世界之大,无奇不有'
    print(c) 
print(sum())

print(c)

运行结果如下:

全局变量

与局部变量对应,全局变量为能够作用于函数内外部的变量。全局变量主要有以下两种情况。

1、如果一个变量在函数外部被定义,那么它不仅可以在函数外部被访问到,而且也可以在函数内部被访问到。在函数外部定义的变量是全局变量。

举例:

c = '世界之大,无奇不有'
def sum():
    print('函数内部:'+c)
#调用函数
sum()
#直接输出全局变量c
print('函数外部:'+c)

运行结果如下:

注意:当局部变量与全局变量重名时,对函数内部的变量进行赋值后,不影响函数外部的变量。

2、在函数内部定义,在使用global 关键字修饰后,该交量将变为全局变量。在函数外部也可以访问到该变量,且还可以在函数内部对其进行修改。

举例:

def sum():
    c = '世界那么大,我想去看看'
    print('函数内部c=:'+c)
#调用函数
sum()
print('函数外部c='+c)

def sun():
    global c
    c = '世界那么大,我想去看看'
    print('函数内部c='+c)
#调用函数
sun()
#直接输出全局变量c
print('函数外部c=:'+c)

运行结果如下:

从上述结果中可以看出,在函数内部定义的变量即使与全局变量重名,也不影响全局变量的值。那么想要在函数内部改变全局变量的值,需要在定义局部变量时,使用global 关键字修饰,就可以在函数内部修改全局变量的值。

注意:尽管 Python 允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。

匿名函数

匿名函数是指没有名字的函数,应用在需要一个函数但是又不想费神命名这个函数的场合。通常情况下,这样的函数只使用一次。在pyhon中,使用lambda 表达式创建匿名函数,其

法格式如下:

result = lambda [arg1 [,arg2.,argn]]:expression

其中,result用于调用lambda表达式,[arg1 [,arg2.,argn]]为可选参数,用于指定要传递的参数列表,多个参数间使用逗号分割,expression为必选参数,用于指定一个实现具体功能的表达式,如果有参数,那么在该表达式中将应用这些参数。

举例:

#常规代码
def sum(a,b):
    result = a +b
    return result
a,b = 3,10
print(sum(a,b))

#使用 lambda 表达式的代码
result = lambda a,b: a+b
print(result(a,b))

运行结果如下:

下一篇   面向对象程序设计

相关文章:

  • Linux安装Minio
  • 基于51单片机的定时器实现LED闪烁控制(CT107D)
  • 【强化学习】Q-learning算法详解:含MATLAB和Python实现代码
  • 基于SpringBoot+Vue的智慧校园管理系统设计和实现(源码+文档+部署讲解)
  • 配置Api自动生成
  • Python中的HTTP客户端库:httpx与request | python小知识
  • canmv的例程代码与营销策略
  • 驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布
  • 【Java 面试 八股文】常见集合篇
  • CViewState::InitializeColumns函数分析最终记录是35项
  • 多模态基础模型第二篇-deepseek-r1部署
  • FPGA之​​​​​​​​​​​​​​HRBANK与HOBANK有什么区别?
  • 002 第一个python程序
  • 企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析
  • 【Leetcode 952】按公因数计算最大组件大小
  • LLM大模型学习资料整理
  • Java爬虫获取1688商品搜索API接口的实现指南
  • python | 两招解决第三方库安装难点
  • 如何画产品功能图、结构图
  • 进程与线程的区别与联系
  • 经济日报刊文:品牌经营不能让情怀唱“独角戏”
  • 上海发布首份直播电商行业自律公约,禁止虚假宣传、商业诋毁
  • 中国象棋协会坚决支持司法机关依法打击涉象棋行业的违法行为
  • 中国天主教组织发贺电对新教皇当选表示祝贺
  • 盖茨:20年内将捐出几乎全部财富,盖茨基金会2045年关闭
  • 印度杰纳布河上游两座水电站均已重新开闸