前言

什么是函数,为什么它又叫做函数?


一、函数的定义

以前在中学阶段我们就学习过函数,那时的函数的定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。
现今学习了计算机后,在这个学科中函数的定义变为:函数是一段具有特定功能的,可重用的语句块,用函数名来表示并且可以通过函数名进行功能的调用。并且函数还可以看作是是一段具有名字的子程序,可以在需要的地方调用执行,不需要再每一个需要使用的地方重复的编写这些语句。(函数还可以有参数的输入,每一次执行都可以输入不同的参数,以实现不同数据的处理,执行之后还可以反馈相应的处理结果)

二、使用函数的目的

1.降低编程的难度

函数是一种功能的抽象,利用它可以将一个复杂的大问题分解成一系列的小问题,然后还可以将这些小问题分解为更小的问题,当分解的小到一定的程度时就可以很简单的将它们决绝了,这就是一种分而治之的思想(有自顶向下和自底向上两种)

2.代码的重用

函数可以在一个程序的多个位置使用,也可以用于多个的程序,当需要修改代码时我们只需要在函数中修改一次,那么所有调用该函数的功能都将会得到更新,这种的代码重用降低了代码行数和代码维护的难度。

三、函数的使用

1、语法

Python使用def保留字定义一个函数:

def<函数名>(<参数列表>):<函数体>return<返回值列表>

函数名: 可以是任何有效的python标识符
参数列表(形参):可以是零个,一个或多个 (调用函数时给函数的变量值,其中多个的参数需要使用逗号隔开,没有参数时也需要保留括号)
函数体:调用函数时执行的代码,由一行或多行语句组成
return保留字:函数执行结束时有返回值时使用

2、调用形式

函数调用和执行的一般形式

<函数名>(<参数列表>)

其中调用参数时参数列表中需要给出传入函数中的参数(实参)

使用自定义函数输出生日快乐!!!

def happy():print("Happy birthday to you !!!")
def happyB(name):happy()happy()print("Happy birthday, dear {} !!!".format(name))happy()
happyB("赞")
print()
happyB("赞赞")

结果如下

Happy birthday to you !!!
Happy birthday to you !!!
Happy birthday, dear 赞 !!!
Happy birthday to you !!!Happy birthday to you !!!
Happy birthday to you !!!
Happy birthday, dear 赞赞 !!!
Happy birthday to you !!!

**我们定义的一个函数 happyB() , 括号中的name是形参,用来指代要输入的实际变量,并且完成函数内部的功能。

3、调用过程

程序调用一个函数需要执行四个步骤
(1)调用程序在调用处暂停执行
(2)在调用时将实参复制给函数的形参
(3)执行函数体语句
(4)函数调用结束给出返回值,程序回到调用前的暂停处继续执行
对于上述的例题,1-7行为函数的定义,函数只有在调用时才会被执行。因此在上述的程序的执行过程中1-7行并不会直接执行,程序先直接执行第八行的 happyB(“赞”) ,程序执行到这里时就调用了happyB()函数,这时程序才进行1-7行的执行,并且 实参(“赞”)会对函数中的形参(name)进行覆盖类似于执行了: name = “赞” ,然后实参代替形参执行函数体的内容。当函数执行完毕后,重新回到第八行执行余下的语句。
当函数执行happyB()的函数体时,第一条执行的语句就是happy()函数——和上述的执行过程相似(不重复)。

*函数式编程

函数式编程是一种编程范式,常见的编程范式还包括命令式编程和面向对象编程等。
函数式编程的主要思想是把程序的过程尽量写成一系列的函数的调用,通过函数进一步的提高封装的级别,函数式编程通过使用一系列函数能够使代码编写更简洁,更易于理解,是中小规模软件项目中最常见的编程方式。

4、lambda函数

可以参考另一篇博客:https://blog.csdn.net/weixin_52626164/article/details/116676414

四、函数的参数传递

** 函数可以定义可选参数,使用参数的位置或者名称传递参数的数值,根据函数中变量的不同作用域有不同的函数返回值方式

1 、可选参数和可变数量参数

可选参数:定义函数时 函数的参数存在默认值,就是在不需要传入实参时函数内部直接使用的参数。当函数被调用时没有传入对应的参数值,就是用定义时的默认值代替参数位置可选参数必须定义在非可选参数的后面
可变数量参数:在调用一个函数时 我们不知道需要传入的参数有多少个,所以我们可以使用一个不确定的变量替代这些我们不确定的参数个数,python中使用 (*) 实现。并且带星号的可变参数只能出现在参数列表的最后,在调用时输入的可变数量参数被当作元组类型传递到函数中。

>>> def vfunc(a, *b):print(type(b))for n in b :a +=nreturn a>>> vfunc(1,2,3,4,5)
<class 'tuple'>
15
>>>

可以看出上述的 *b 就是一个可变数量参数,我们通过type() 知道了 *b 的类型为元组类型,在我们调用函数时我们传入(1,2,3,4,5)其中(2,3,4,5)就是元组类型的可变数量参数,它们当作一个元组传递给了 *b 。

2、参数位置传递和名称传递

函数调用时,参数默认采用按照位置顺序的方式传递给函数:

>>> def dup(str, times = 2):print (str*times)>>> dup("赞赞",4)
赞赞赞赞赞赞赞赞
>>>

我们可以知道上述的函数中 “赞赞”传递给了str , 4 传递给了默认参数 times = 2,这是显而易见的。如果函数是这个呢?

>>> def func(x1,y1,z1,x2,y2,z2):return>>> result = func(1,2,3,4,5,6)

当函数中参数变为六个时,这时函数的可读性是不是就特别的差了。故此我们可以得知按照位置传递参数的方法固然的很好,但当参数较多时就难以理解函数的意思,它就不香了。所以python中按照形参名称输入实参的方式就应运而生了:

result = func(x2 = 4, y2 = 5, z2 = 6, x1 = 1, y1 = 2, z1 = 3)

由于调用函数时指定了参数的名称,所以参数之间的顺序就可以任意的调整了。

3、变量的作用

一个程序中变量分为两种:全局变量,局部变量
全局变量:在函数之外定义的变量,一般没有缩进,程序执行的全过程有效
局部变量:函数内部定义的变量,仅在函数的内部有效,当函数退出时变量将不存在

>>> n = 1  #  n 是全局变量
>>> def func(a,b):c = a*b   # c 是局部变量,a 和b作为函数参数也是局部变量return c>>> s = func ("knock" , 2)
>>> print(c)        # 执行完函数,函数内部的局部变量被释放无法找到
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>print(c)
NameError: name 'c' is not defined

函数执行完退出后,其内部的变量将被释放。
如果函数内部使用了全局变量呢?

>>> n = 1
>>> def func(a,b):n = breturn a*b>>> s= func ("knock", 2)
>>> print (s,n)
knockknock 1
>>>

怎么回事? 我们不是在函数中使用了全局变量 n 吗?为啥 n 的输出结果还是1呢?

因为函数 func() 内部有自己的内存空间,它将 n =b 语句理解为生成一个局部变量 n ,并将参数 b 赋值给它,因此函数 func() 没有把 n 当作为全局变量,所以函数执行结束时,局部变量 n 被释放,固全局变量 n 的值没有改变

那怎样才能让函数知道 n 时全局变量呢?

使用global关键字声明即可:

>>> n = 1
>>> def func(a,b):global nn = breturn a*b>>> s= func ("knock", 2)
>>> print (s,n)
knockknock 2
>>>

是不是 n 的值变为2了,牛啊牛啊!!!全局变量声明global

渐渐的我们发现如果定义的全局变量不是整数 n ,而是列表类型 ls ,它又不一样了

>>>ls = []
>>> def func(a,b):ls.append(b)  #将局部变量b增加到全局列表变量ls中return a*b>>> s = func("knock",2)
>>> print(s,ls)  # 测试一下 ls 的值是否改变
knockknock [2]

发现了吗?和之前的整数变量 n 不同,全局列表变量在函数 func() 调用后竟然发生了变化!

————列表等组合数据类型由于操作多个数据,所以它们在使用中又创建和引用的区别。当列表变量被方括号([ ],无论是否为空)赋值时,这个列表才被真实创建,否则只是对之前创建列表的一次引用。

简单来说就是对于列表类型,函数可以直接使用全局列表而不需要采用global进行声明。

总结下
(1)简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放。
(2)简单数据类型在使用global保留字声明后,作为全局变量使用,函数退出后该变量保留且值被函数改变
(3)对于组合数据类型的全局变量,如果在函数内部没有 被真实创建的同名变量,则函数内部可以直接使用并修改全局变量的值
(4)如果函数内部真实创建了组合数据类型变量,无论是否有同名变量,函数仅对局部变量进行操作,函数退出后局部变量被释放,全局变量不变。

Python中函数的定义和参数传递相关推荐

  1. python中怎么调用函数_浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...

  2. python函数定义及调用-浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数�C封装独立的功能 2.调用函数�C享受封装的成果 函数的作用:在开 ...

  3. python中home定义是什么_第48p,什么是函数?,Python中函数的定义

    原标题:第48p,什么是函数?,Python中函数的定义 大家好,我是 杨数 Tos ,这是<从 零 基础到大神>系列课程的第 48 篇文章 ,第三阶段的课程 : Python进阶知识:详 ...

  4. 站长在线Python精讲:在Python中函数的定义与创建详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中函数的定义与创建详解>.本文的主要内容有:函数的定义.函数的定义规则.函数的创建. 目录 1.函数的定义 2 ...

  5. python 定义函数方法,python中函数如何定义?python函数的调用方法介绍

    本篇文章给大家带来的内容是关于python中函数如何定义?python函数的调用方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 函数的概念,函数是将具有独立功能的代码块 ...

  6. python中函数的定义包括_python中函数的定义及调用

    python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...

  7. python函数和方法概念_第48p,什么是函数?,Python中函数的定义

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第48篇文章,第三阶段的课程:Python进阶知识:详细讲解Python中的函数(一)====> 函数概念介绍(上篇). 函数 ...

  8. python中函数的定义实例_Python基础之函数的定义与使用实例

    此文实例介绍了Python基础之函数的定义与使用.推荐给大伙学习一下,内容如下: Python 定义函数使用 def 关键字,一般格式如下: def 函数名(参数列表): 函数体 让我们使用函数来输出 ...

  9. python函数定义及调用-python 中函数的定义以及调用先后顺序问题

    一.解释型语言 解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次.因此效率比较低. 解释型语言是相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间 ...

最新文章

  1. Strict Mode (JavaScript)
  2. WCF一个运行环境,一个服务逻辑人,一个客户
  3. Microsoft Build 2016 Day 1 记录
  4. 最详细的 SAP ABAP Web Service 创建和消费步骤讲解
  5. 字符设备驱动高级篇1——新接口介绍
  6. 聚类算法——Birch详解
  7. groupby索引有效吗_两千字揭密 MySQL 8.0.19 三大索引新功能
  8. Android 广播接收器注册与注销源码分析
  9. win10wifi间歇性断网重启后恢复_实用!Xbox Series X 在重启后也能快速恢复之前的游戏状态...
  10. dnspod ddns 下载_简约时尚休闲女装毛衣针织衫春装详情页_psd素材免费下载_ 750*13450像素(编号:24815329)...
  11. SQL Server Service Borker 1
  12. 浙大PAT考试经验/考前必看/日常刷题总结(经验只写了一点点
  13. teamspeak3自建服务器,宝塔面板安装teamspeak3 – 搭建自己的语音聊天服务器
  14. 新浪微博开放平台API访问频率限制解决方法
  15. 伤感日志:时光远走,流年轻度
  16. RobotFrameWork Web自动化测试之测试环境搭建
  17. 《MLB棒球创造营》:走近棒球运动·德州游骑兵队
  18. 私域运营第五讲:实体店私域流量拉新实体餐饮店如何通过搭建私域流量实现营收增长
  19. 计算机农业sci,科学网—SCI-EI收录农业工程期刊 - 王宝济的博文
  20. 二分算法。yxc教的

热门文章

  1. 如何优雅地进行接口管理?(大厂内部分享)
  2. 23种设计模式(2)-工厂模式
  3. StringHelper--封转自己的字符串工具类
  4. Java多线程学习十一:你知道哪几种锁?各有什么特点
  5. matlab arctan 反函数,arctanx的导数是什么 反函数求导公式
  6. go新手看的开源项目 哪些适合_最近大家都在用 Go 语言玩什么?这几个新的开源项目告诉你...
  7. leetcode题解77-组合
  8. 单点登录原理与简单实现【转载】
  9. C#实现文件下载的几种方式
  10. Maven发布web项目到tomcat