作者主页

现有专栏
算法篇 Linux篇
QT百日筑基篇 数据结构篇
python篇

python函数语法简介


目录/索引:

目录

数学中的函数vs计算机中的函数:

一、数学中的函数(定义)

二、Python 中的函数(程序函数)

三、核心区别对照表

什么是函数

函数return的使用

py中函数返回值的进阶

global:函数变量扬名天下的利器:

函数的缺省值:

不同传参:

函数的递归:

一、什么是递归

二、递归执行原理(栈)


函数:

数学中的函数vs计算机中的函数:

一、数学中的函数(定义)

数学函数:y=f(x),集合映射关系

  1. 定义域:输入x的取值范围
  2. 值域:输出y的取值范围
  3. 核心规则:一个自变量 x 只能对应唯一 y(一一映射 / 多对一,不能一对多)
  4. 纯映射:输入确定,输出永远固定,无副作用 例:f(x)=2x+1,x=3 永远得到 7,不受外界影响

二、Python 中的函数(程序函数)

一段可复用代码块,只是借用 “函数” 名字,本质是代码执行单元,规则完全放开。

三、核心区别对照表

对比维度 数学函数 Python 函数
核心本质 数集之间的映射关系 封装代码、执行操作的代码模块
输入规则 一个 x 只能对应唯一 y(禁止一对多) 无限制,同一个入参可以返回不同结果
输出唯一性 纯函数,输入固定→输出永久固定 存在有副作用函数,输入相同结果可变
返回值 一定有唯一对应输出 可以无返回值(默认返回None
是否依赖外部 只依赖自变量 x,和外界无关 可读取 / 修改全局变量、文件、网络、时间等外部数据
副作用 绝对无副作用,只计算数值 大量副作用:打印、修改变量、读写文件、弹窗
参数数量 单变量 / 多变量,但都是数值 任意参数:数字、字符串、列表、对象、甚至其他函数
定义域限制 严格限定 x 取值(如x​要求x≥0) 不强制校验输入,传非法值只会报错,不会自动限制定义域
是否能重复调用 只是抽象映射,不存在 “调用执行” 必须手动调用才会运行,可反复执行
逻辑复杂度 仅数学运算(加减乘除、三角函数等) 可分支、循环、判断、IO、网络、复杂业务逻辑

什么是函数

函数是封装一段可重复执行代码的代码块,实现代码复用、简化逻辑、降低冗余。 分为两类:

  1. 内置函数:Python 自带(print()len()input()
  2. 自定义函数:用户用 def 关键字自己定义

在python中如何去定义一个函数呢???

语法:

def 函数名(参数...):
缩进  函数体

缩进  return 值    #有返回值使用return来进行接收

我们写一个简单的打印程序吧。

我们对函数进行了定义:在这个函数中我们实现了一个print的功能, 然后我们这个函数有参数我们就将参数进行书写,没有参数就将不写参数, 但是没有参数也是要写()这个括号不能进行省略,我们函数的功能要写函数名+()的方式进行调用(也就是下面的printf()//这个就是一个函数的调用)

def printf():
    print("这是python的一个函数的编写")
    
printf();


函数return的使用

我们如果想要函数中的值的化我们是需要进行返回我们想要得到的值的, 那我们直接进行return就行了,向我们下面的程序。我们想得到相加之后的值,我们采用了returnx+y的值, 并在函数外面进行调用打印。

def  add(x,y):
    return x+y

print(add(1,2))

py中函数返回值的进阶

在py中可以进行多返回值进行返回, 在c/c++中只能返回一个值。

所以这也是py的一些特色吧。

这里我们把x+1的值给了a, 我们把y+1给了b, 所以在py中可以进行多值的返回。

def test(x,y):
    return x+1, y+1

a,b = test(1,2)
print(a)
print(b)

我们如果返回多个值,但是也有几个值不想要,我们就能进行_来进行占位

像下面的代码,我们只将会y+1给了b,x+1给_代表我们不接受这个参数。

def test(x,y):
    return x+1, y+1

_,b = test(1,2)
print(b)

实参和形参

a=0
b=1
print(f"未进入函数前: a={a}b={b}")

def test(a,b):
    a+=10
    b+=10
    print(f"函数内: a={a}b={b}")

test(a,b)
print(f"进入函数后: a={a}b={b}")

我们发现我们的参数在函数体内部进行了+=10函数体内部的a,b进行了改变,出函数时和进函数的值是一样的, 所以我们这里进入函数内部a,b出来的时候不会发生任何变化。

所以我们在外面传的实参, 在函数的参数叫做形参。 所以形参的改变不影响实参的改变。

global:函数变量扬名天下的利器:

global 用于在函数内部声明要使用 / 修改全局变量

  1. 只读取全局变量,不加 global 也能读;
  2. 如果要修改、重新赋值全局变量,必须先写 global 变量名,否则 Python 会把它当成局部变量。
a=0
b=1
print(f"未进入函数前: a={a}b={b}")
def test(a,b):
    global num
    num=100;
    a+=10
    b+=10
    print(f"函数内: a={a}b={b}")

test(a,b)
print(f"进入函数后: a={a}b={b}")
print(num)

函数的缺省值:

缺省规则:参数的缺省值只能从右向左进行书写。

如果我给这个参数的传参数,缺省值没有任何的作用, 如果,我不传这个参数的话, 那么就会用这个缺省值

def add(a,b=10):
    return a+b;

print(add(1,2));
print(add(1));

不同传参:

我可在传参的时候就指定内部的形参要哪个参数。

def add(x,y):
    print(f"x={x}, y = {y}")
    return x+y
add(y=1,x=2)

函数的递归:

一、什么是递归

递归:函数自己调用自己,把大问题拆解成结构相同、规模更小的子问题,直到触达终止条件。 公式:

  1. 基线条件(出口):停止递归,不再调用自身(必须写,否则无限递归报错)
  2. 递归条件:缩小问题规模,再次调用自己

二、递归执行原理(栈)

每次函数自调用,会在调用栈开辟新空间保存当前变量; 满足基线条件后逐层返回,栈依次释放。 Python 默认递归深度限制约 1000 层,超过抛出 RecursionError

def factorial(n):
    # 基线条件
    if n == 1 or n == 0:
        return 1
    # 递归条件
    return n * factorial(n - 1)

print(factorial(5))  # 120

总结:

  1. 递归必须有基线条件作为出口;
  2. 每次自调用要缩小问题规模,保证能走到基线;
  3. 递归靠调用栈实现,有深度上限;
  4. 重复计算场景用缓存优化;
  5. 简单计算优先循环,树形 / 分治类问题适合递归。

下篇预告列表和元组的使用

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐