Python---函数相关知识
创始人
2024-05-14 21:01:02
0

专栏:python
个人主页:HaiFan.
专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。

函数

  • 前言
  • 函数的使用
  • 函数的语法格式
  • 函数的参数
  • 函数的返回值
  • 变量的作用域
  • 函数的执行过程
  • 函数的递归
  • 参数默认值
  • 关键字参数


前言

在初中高中的时候,我们学习过函数,python中的函数和数学中的函数有点类似,数学上的函数:y = x^2,随着x的改变,y也会改变,编程中的函数(是一段只要可以用到这个函数的功能,就调用这个函数)是一段可以重复使用的代码段。

在这里插入图片描述


函数的使用

#求一到10
sum = 0
for cnt in range(1,11):sum += cnt
print(sum)
#求一到100
sum = 0
for cnt in range(1,101):sum += cnt
print(sum)
#求一到1000
sum = 0
for cnt in range(1,1001):sum += cnt
print(sum)

像这样要求某一区间的和,每次都需要写一个循环,每次写都是一样的写法,只是数字改了改,既然差异这么小,就可以把重复的代码写出来,写成一个函数。

def add(st,ed):#st代表起始数字,ed代表末尾数字thesum = 0for i in range(st, ed + 1):thesum += iprint(thesum)

这就写成了一个函数,用st和ed来代表数字,想要打印结果的话,在函数下面调用一下函数即可。

add(1,10)
add(1,100)
add(1,1000)

在这里插入图片描述
可以明显的看出,用函数写的结果和一个循环一个循环的写,结果是一样的,但是用函数写的话,代码量少了很多,这就为做项目的时候,提供了方便。

函数的语法格式

函数是有严格的语法格式的。

def 函数名(形参列表):#def是define(定义)的意思函数体return 返回值

调用函数/使用函数

函数名(实参列表) # 不考虑返回值
返回值 = 函数名(实参列表) # 考虑返回值

函数定义是不会执行函数体的内容的,必须要调用之后,才会执行,调用几次函数,就执行几次函数。
在这里插入图片描述
从图中可以看出,再不调用函数的情况下,是没有任何输出的。

函数必须先定义,在使用。

add(1,10)def add(st,ed):thesum = 0for i in range(st, ed + 1):thesum += iprint(thesum)

在这里插入图片描述

函数的参数

形参和实参是什么?

def add(st,ed):thesum = 0for i in range(st, ed + 1):thesum += iprint(thesum)add(1,10)

形参是实参的一份临时拷贝,形参的改变不会影响实参。在这个代码中,st和ed就是形参(函数在调用的时候,实参赋值给形参),1和10就是实参。

def add(st,ed):st = 20ed = 30print(f'st = {st}')print(f'ed = {ed}')a = 1
b = 10
add(a,b)
print(f'a = {a}')
print(f'b = {b}')

在这里插入图片描述

  1. 一个函数可以有n(n不能等于负数,0或0以上都可以)个形参。
  2. 一个函数的形参有几个,那么传递实参的时候,也得传几个,函数的形参个数要和实参的个数一样,就上面的代码来说,两个形参对应两个实参。

因为python是动态类型的编程语言,函数的形参不必指定参数的类型,也可以理解为,函数支持多种不同类型的数据。

函数的返回值

函数的参数可以视为是函数的“输入”,函数的返回值可以视为函数的“输出”。
此处的“输入”“输出”不是单纯的指通过控制台输入输出。

def add1(st, ed):thesum = 0for i in range(st, ed + 1):thesum += iprint(thesum)add1(1, 10)

可以写成下面的这一种情况。

def add2(st, ed):thesum = 0for i in range(st, ed + 1):thesum += ireturn thesumret = add2(1, 10)
print(ret)

这里没有直接写print而是写成了return,return可以把函数的结果返回给函数的调用者,再有调用者负责打印函数的结果。

在这里,更加推荐第二种写法。

一个函数中可以有多个return语句

def add2(st, ed):thesum = 0for i in range(st, ed + 1):if (i + st == 100):return Falsethesum += ireturn Trueret = add2(1, 100)
print(ret)

在这里插入图片描述
执行到return语句,函数就会立刻结束执行,回调调用的位置。

一个函数可以一次返回多个返回值,使用,来分割多个返回值。

def Print():a = 10b = 11return a, bx, y = 0,0
x,y = Print()
print(x)
print(y)

在这里插入图片描述
如果函数只想关注返回值的一部分,可以使用_来忽略不想要的返回值

def Print():a = 10b = 11return a, bx, y = 0,0
_,y = Print()
print(x)
print(y)

在这里插入图片描述

变量的作用域

def Print():a = 10b = 11return a, b
a,b = Print()

这个代码中,函数内部有a和b,函数外部也有a和b,但是这两组a和b不是相同的,只是名字相同而已。

变量只能在所在的函数内部生效。

def Print():a = 10b = 11return a, b
Print()
print(a,b)

在这里插入图片描述
在不同的作用域中,允许存在名字相同的变量

x = 10def test():x = 20print(f'函数内部的x = {x}')
test()
print(f'函数外部的x = {x}')

在这里插入图片描述

注:在函数内部的变量,也称为“局部变量”
不在任何函数内部的变量,称为“全局变量”

如果函数内部尝试访问的变量在局部不存在,就会尝试在全局作用域中查找

x = 10
def test():print(f'x = {x}')
test()

在这里插入图片描述
如果想在函数内部,修改全局变量的值,需要使用global关键字声明

x = 10def test():global xx = 20print(f'修改过的全局变量x = {x}')print(f'没修改过的全局变量x = {x}')
test()

在这里插入图片描述

此处若是没有global,则函数内部的x = 10就会被视为是创建一个局部变量x。

if/while/for等语句块不会影响到变量作用域
在if/while/for中定义的变量,也可以在语句外面正常使用

for i in range(1,100):pass
print(i)

在这里插入图片描述

函数的执行过程

调用函数才会执行函数体代码,不调用则不会执行
函数体执行结束,或遇到return语句结束,则返回好函数调用的位置继续往下执行。

def test():print(2)print(3)print(4)print(1)
test()
print(5)

在这里插入图片描述

函数的递归

递归是 嵌套调用 中的一种特殊情况, 即一个函数嵌套调用自己

例如求某个数的阶乘,用递归实现

def factor(n):if n == 1:return 1return n * factor(n - 1)a = int(input())
ret = factor(a)
print(ret)

在这里插入图片描述

这个代码就是典型的递归调用。

在这里插入图片描述
在明确递推公式和初始条件的时候,就可以用递归解决一系列问题,递归的代码一般都很少。相对的,递归的代码,往往不容易被理解,很难掌握,也很容易出现栈溢出的情况。

参数默认值

python中的函数,可以给形参指定默认值,带有默认值的参数,可以在调用的时候,不用传参。

def add(x,y,flag = True):if flag:print(f'x = {x},y = {y}')return x + yprint(add(10,20))
print(add(10,20,False))

在这里插入图片描述
此处的flag = True即为参数默认值,当我们不指定第三个参数的时候,默认flag的取值为True

带有参数默认值的参数,需要放到没有默认值的参数的后面。

def add(x,flag = True,y):if flag == 1:print(f'x = {x},y = {y}')return x + yprint(add(10,20))
print(add(10,20,False))

在这里插入图片描述

关键字参数

在调用函数的时候,需要给函数指定实参,一般情况下是按照形参的顺序,来依次传递实参的,但是我们也可以通过关键字参数,来调整这里传参的顺序,指定当前实参传递给哪个形参。

关键字传参——按照形参的名字来进行传参。

def test(x,y):print(f'x = {x},y = {y}')
test(10,100)

在这里插入图片描述

def test(x,y):print(f'x = {x},y = {y}')
test(10,100)
test(x = 100,y = 10)

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...