【Python】基础语法入门(三)


前言

在上一篇基础语法(二)中,我们掌握了条件语句和循环语句,让程序具备了"做选择"和"重复执行"的能力。但随着编程场景变复杂,重复代码会越来越多,比如多次计算不同区间的和、反复校验数据格式,复制粘贴不仅繁琐,后续修改也麻烦。这一篇,我们聚焦Python的核心语法"函数",从定义、调用到参数传递,一步步解锁代码的"复用与封装"能力,让代码更简洁、更易维护。


一、函数是什么?

在编程中,函数本质是一段可重复使用的代码片段,就像生活中的"工具",比如锤子可以反复用来钉钉子,函数可以反复用来解决某类问题。

1.1 为什么需要函数?

我们举个例子:计算1-100、300-400、1-1000的和,不使用函数的写法是这样的:

python 复制代码
# 计算1-100的和
sum1 = 0
for i in range(1, 101):
    sum1 += i
print(sum1)

# 计算300-400的和
sum2 = 0
for i in range(300, 401):
    sum2 += i
print(sum2)

# 计算1-1000的和
sum3 = 0
for i in range(1, 1001):
    sum3 += i
print(sum3)

可以看到,三段代码逻辑几乎一致,只是参数不同。但如果我们使用函数封装去写的话,我们只需写一次逻辑,后续则可直接调用:

python 复制代码
# 定义函数:计算区间[beg, end]的和
def calcSum(beg, end):
    sum_total = 0
    for i in range(beg, end + 1):
        sum_total += i
    return sum_total

# 调用函数:传入不同参数,重复使用逻辑
print(calcSum(1, 100))   # 输出1-100的和
print(calcSum(300, 400)) # 输出300-400的和
print(calcSum(1, 1000))  # 输出1-1000的和
输出结果

5050

35350

500500

函数的核心价值的是:消除重复代码、简化维护、提升可读性,后续若要修改计算逻辑(比如改成求乘积),只需改函数内部,所有调用处都会生效。

1.2 函数的本质

我们可以把函数想象成一个"工厂" :

  • 输入:函数的参数(原材料)。
  • 处理:函数体中的代码逻辑(加工过程)。
  • 输出:函数的返回值(最终产品)。

二、函数的定义与调用

2.1 函数定义

Python中用def关键字定义函数,语法结构如下:

python 复制代码
def 函数名(形参列表):
    函数体  # 缩进4个空格或1个Tab
    return 返回值  # 可选,无返回值可省略
  • def:固定开头,告诉Python"这里要定义函数了"。
  • 函数名:遵循变量命名规则(字母、数字、下划线,数字不开头),见名知意(如calcSum表示"计算和")。
  • 形参列表:函数的"输入占位符",可多个(用逗号分隔)或无(括号留空)。
  • 函数体:核心逻辑,必须要缩进。
  • return:指定函数的"输出",执行到return后函数立即结束,无返回值时可省略(默认返回None)。

2. 函数调用

定义函数后不会自动执行,必须"调用"才会触发函数体。调用格式:

python 复制代码
# 不接收返回值
函数名(实参列表)

# 接收返回值
结果 = 函数名(实参列表)
关键注意点:
  • 先定义后调用:函数必须在调用前定义,否则会报错 。
  • 实参形参匹配:形参有几个,实参就要传几个,个数不匹配也会报错 。
  • 动态类型特性:Python的形参无需指定类型,一个函数可接收不同类型的参数 。
eg:
python 复制代码
def printData(data):
    print(data)

printData(10)    # 传入整数,输出10
printData('hello')# 传入字符串,输出hello
printData(True)  # 传入布尔值,输出True

三、函数的参数与返回值

3.1 参数

形参是函数定义时的"占位符",实参是调用时实际传入的"数据",两者的关系就像签合同,"甲方、乙方"是形参,"具体人名"是实参,代入后合同才生效。

示例:多参数函数
python 复制代码
# 定义函数:计算两个数的加减乘除
def calc(a, b):
    add = a + b
    sub = a - b
    mul = a * b
    div = a / b
    return add, sub, mul, div

# 调用函数:传入两个实参
add_res, sub_res, mul_res, div_res = calc(10, 2)
print(f"加:{add_res},减:{sub_res},乘:{mul_res},除:{div_res}")

3.2 返回值

返回值是函数处理后的结果,用return语句返回,有3个实用技巧:

  • 多个返回值:用逗号分隔,接收时用多个变量承接(本质返回元组)。
  • 忽略返回值:用_表示不需要的返回值。
  • 提前结束函数:执行到return后,后续代码不再执行。
示例:多返回值与提前结束
python 复制代码
# 示例1:返回多个值,忽略不需要的结果
def getPoint():
    x = 10
    y = 20
    z = 30
    return x, y, z

x, _, z = getPoint()  # 忽略y值
print(x, z)  # 输出:10 30

# 示例2:提前结束函数
def isOdd(num):
    if num % 2 == 0:
        return False  # 偶数直接返回,后续代码不执行
    return True  # 奇数返回True

3.3 编程原则

尽量让函数只负责核心逻辑(如计算、判断),不包含用户交互(如print),这样函数的复用性更强。比如计算和的函数,返回结果让调用者决定如何展示(打印、存文件、展示到界面)。

python 复制代码
# 推荐:只负责计算,不负责交互
def calcSum(beg, end):
    sum_total = 0
    for i in range(beg, end + 1):
        sum_total += i
    return sum_total

# 调用者决定交互方式
result = calcSum(1, 100)
print(result)  # 打印到控制台
# 可后续扩展:保存到文件、网络传输等

四、变量的作用域

变量有"作用域"限制,即"变量能在哪里使用",主要分为两种:

  • 局部变量:函数内部定义的变量,仅在函数内生效,出函数后失效。
  • 全局变量:函数外部定义的变量,可在整个文件中使用(函数内可访问,修改需用global声明)。

4.1 局部变量与全局变量的隔离

python 复制代码
# 全局变量:函数外部定义
x = 20

def test():
    # 局部变量:函数内部定义,与全局变量同名但互不影响
    x = 10
    print(f"函数内部x:{x}")  # 输出:10

test()
print(f"函数外部x:{x}")  # 输出:20(全局变量未被修改)

4.2 函数内修改全局变量

如果想在函数内修改全局变量的值,必须用global关键字声明,否则会被视为定义局部变量:

python 复制代码
x = 20

def test():
    global x  # 声明x是全局变量
    x = 10  # 修改全局变量的值
    print(f"函数内部x:{x}")  # 输出:10

test()
print(f"函数外部x:{x}")  # 输出:10(全局变量已修改)

4.3 注意:语句块不影响作用域

ifwhilefor等语句块不会隔离变量,块内定义的变量在块外仍可使用:

python 复制代码
for i in range(1, 4):
    num = i  # 循环内定义的变量

print(num)  # 输出:3(变量在循环外仍生效)

五、函数的进阶用法:嵌套调用、链式调用与递归

5.1 嵌套调用:函数内部调用其他函数

函数内部可以调用另一个函数,这是编程中常见的逻辑组织方式:

python 复制代码
# 定义函数A
def funcA():
    print("执行函数A")

# 定义函数B,内部调用A
def funcB():
    print("执行函数B")
    funcA()  # 嵌套调用funcA
    print("函数B执行完毕")

# 调用funcB
funcB()
# 输出顺序:执行函数B → 执行函数A → 函数B执行完毕

5.2 链式调用:函数返回值作为另一个函数的参数

把一个函数的返回值直接作为另一个函数的参数,简化代码:

python 复制代码
# 定义判断奇数的函数
def isOdd(num):
    return num % 2 == 1

# 链式调用:isOdd的返回值作为print的参数
print(isOdd(10))  # 输出:False
print(isOdd(11))  # 输出:True

5.3 递归:函数调用自身(慎用!)

递归是嵌套调用的特殊情况,函数调用自己,适合解决"有明确终止条件、可拆分为子问题"的场景(如阶乘、斐波那契数列)。

示例:递归计算5的阶乘(5! = 5×4×3×2×1)
python 复制代码
def factor(n):
    if n == 1:
        return 1  # 终止条件:n=1时返回1
    return n * factor(n - 1)  # 递归调用:n! = n × (n-1)!

print(factor(5))  # 输出:120
递归的注意事项:
  • 必须有终止条件:否则会无限递归,导致栈溢出报错。
  • 调用层数不宜过深:Python默认递归深度约1000层,超过会报错。
  • 优先考虑循环:大部分递归可转换成循环,执行效率更高、更易维护。

六、参数默认值与关键字参数

6.1 参数默认值

定义函数时,可给形参指定默认值,调用时可省略该参数(使用默认值)。核心规则:带默认值的参数必须放在无默认值参数的后面

示例:带默认值的函数
python 复制代码
# 定义函数:计算两个数的和,debug参数默认False(不打印调试信息)
def add(x, y, debug=False):
    if debug:
        print(f"调试:x={x}, y={y}")
    return x + y

# 调用1:省略debug,使用默认值False
print(add(10, 20))  # 输出:30(无调试信息)

# 调用2:指定debug=True,打印调试信息
print(add(10, 20, debug=True))  # 输出:调试:x=10, y=20 → 30

6.2 关键字参数

默认情况下,调用函数时实参按形参顺序传递(位置参数);也可以用"关键字参数"显式指定参数名,无需遵守顺序,更清晰。

示例:关键字参数的使用
python 复制代码
def test(x, y):
    print(f"x={x}, y={y}")

# 位置参数:按顺序传递
test(10, 20)  # 输出:x=10, y=20

# 关键字参数:显式指定参数名,顺序可换
test(x=100, y=200)  # 输出:x=100, y=200
test(y=300, x=400)  # 输出:x=400, y=300

函数的核心是"复用与封装",掌握这篇的知识点:函数的定义与调用、参数与返回值、作用域、默认值与关键字参数,就能大幅简化代码、提升开发效率。

至此,我们已梳理完Python基础语法(三)的核心内容了。最后我们在文末来进行一个投个票,告诉我你对哪部分内容最感兴趣、收获最大,也欢迎在评论区聊聊你的学习感受。后续我们还将深入探索列表与元组、字典以及文件操作等内容,敬请关注 , 谢谢!

以上就是本期博客的全部内容了,感谢各位的阅读以及关注。如有内容存在疏漏或不足之处,恳请各位技术大佬不吝赐教、多多指正。

相关推荐
~无忧花开~4 小时前
JavaScript实现PDF本地预览技巧
开发语言·前端·javascript
vvoennvv4 小时前
【Python TensorFlow】 TCN-LSTM时间序列卷积长短期记忆神经网络时序预测算法(附代码)
python·神经网络·机器学习·tensorflow·lstm·tcn
靠沿4 小时前
Java数据结构初阶——LinkedList
java·开发语言·数据结构
4***99744 小时前
Kotlin序列处理
android·开发语言·kotlin
froginwe114 小时前
Scala 提取器(Extractor)
开发语言
t***D2644 小时前
Kotlin在服务端开发中的生态建设
android·开发语言·kotlin
nix.gnehc5 小时前
PyTorch
人工智能·pytorch·python
Want5955 小时前
C/C++跳动的爱心②
c语言·开发语言·c++
z***3355 小时前
SQL Server2022版+SSMS安装教程(保姆级)
后端·python·flask