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

Python 函数详解

在写 Python 程序的时候,如果你发现自己不停地在写重复的代码,那说明你需要函数来帮你省事了。

参考文章: Python 函数 | 简单一点学习 easyeasy.me

目录

  1. 什么是函数?
  2. 为什么要用函数?
  3. 如何定义函数(def 语法)
  4. 函数参数的各种花样(位置参数、默认值、可变参数)
  5. 函数的返回值
  6. 变量作用域(局部变量 vs 全局变量)
  7. 匿名函数 lambda
  8. 函数作为参数传递
  9. 嵌套函数和闭包
  10. 装饰器(进阶)
  11. 实战:写几个有用的函数

1. 什么是函数?

函数就是把一段代码封装起来,给它起个名字,以后想用的时候直接调用名字就行。

比如你写了个计算两个数相加的功能:

def add(a, b):return a + b

你只要写好一次,之后用 add(3, 4) 就能得到 7


2. 为什么要用函数?

几个原因:

  • 复用性高:写一次,用多次;
  • 代码更清晰:每段代码都表达一个明确功能;
  • 方便维护:改一个地方,所有地方都生效;
  • 避免重复:不复制粘贴,写得更优雅。

3. 如何定义函数(def 语法)

def 关键词来定义函数:

def greet(name):print("Hello,", name)

调用方法:

greet("Tom")  # 输出:Hello, Tom

注意:

  • 函数名尽量见名知意;
  • 函数体缩进(4 空格)是必须的;
  • return 可以返回值,也可以没有。

4. 函数参数的各种花样

Python 的函数参数可以有很多种写法,主要有这些:

📌 位置参数

最常见的,就是你传几个值,函数就按顺序接收。

def say_hello(name, age):print(f"{name} is {age} years old.")

📌 默认参数

有些参数可以不传,给它设置一个默认值。

def greet(name="Guest"):print("Hi", name)

📌 可变参数 *args

接收任意数量的位置参数(会变成元组):

def add_all(*numbers):return sum(numbers)add_all(1, 2, 3, 4)  # 结果是 10

📌 关键字参数 **kwargs

接收任意数量的键值对参数(会变成字典):

def print_info(**kwargs):for key, value in kwargs.items():print(key, ":", value)print_info(name="Alice", age=20)

5. 函数的返回值

return 把值返回出去:

def double(x):return x * 2result = double(5)  # result 是 10

如果不写 return,函数默认返回 None

可以返回多个值(其实是个元组):

def calc(a, b):return a + b, a * bs, p = calc(2, 3)

6. 变量作用域(局部变量 vs 全局变量)

局部变量(local)

只在函数内部能用:

def test():x = 10  # x 是局部变量

全局变量(global)

在整个文件中都能用的变量:

x = 5def change():global xx = 10

注意:不要滥用全局变量,会让代码难维护。


7. 匿名函数 lambda

lambda 是一种简洁写法,适合只用一次的小函数:

double = lambda x: x * 2
print(double(4))  # 输出 8

常见用法是搭配 mapfilter 等函数。


8. 函数作为参数传递

Python 中,函数本身也是“值”,可以当参数传:

def apply(f, x):return f(x)print(apply(lambda x: x**2, 5))  # 输出 25

9. 嵌套函数和闭包

函数里可以再定义函数:

def outer(msg):def inner():print("Message:", msg)return innerf = outer("Hi")
f()  # 输出 Message: Hi

这种结构叫“闭包”,可以记住外层函数的变量。


10. 装饰器(进阶)

装饰器是个“函数改造器”,用来给函数加功能而不改源码,后续文章我会专门讲解装饰器如何定义与使用:

def logger(func):def wrapper(*args, **kwargs):print("Calling", func.__name__)return func(*args, **kwargs)return wrapper@logger
def greet(name):print("Hello", name)greet("Bob")

运行结果:

Calling greet
Hello Bob

11. 实战:写几个有用的函数

统计一个字符串中某个字符出现的次数

def count_char(s, ch):return s.count(ch)

判断一个数是不是素数

def is_prime(n):if n < 2:return Falsefor i in range(2, int(n**0.5)+1):if n % i == 0:return Falsereturn True

生成一个斐波那契数列

def fib(n):seq = [0, 1]for i in range(2, n):seq.append(seq[-1] + seq[-2])return seq[:n]

http://www.xdnf.cn/news/17075.html

相关文章:

  • 重生之我在暑假学习微服务第十天《网关篇》
  • 微软Dragon Ambient eXperience (DAX) 深度解析
  • 《UE教程》第一章第六回——迁移独立项目(资源)
  • 【学习嵌入式day-17-数据结构-单向链表/双向链表】
  • 【计算机网络】6应用层
  • 深度学习·基础知识
  • selenium自动化收集资料
  • 从汇编角度揭秘C++构造函数(1)
  • 【深度学习新浪潮】混元3D是什么产品?
  • 2025《艾诺提亚失落之歌》逆向工程解包尝试
  • 【模电笔记】—— 直流稳压电源——整流、滤波电路
  • 二叉树——堆及其实现
  • 防御保护07-08
  • 三种灰狼算法求解无人机三维路径规划【MATLAB实现】
  • Android AppSearch 深度解析:现代应用搜索架构与实践
  • 论文阅读笔记:《Curriculum Coarse-to-Fine Selection for High-IPC Dataset Distillation》
  • 《算法导论》第 4 章 - 分治策略
  • uniapp云打包打包安卓app失败,显示:本地安装包生成失败,请重试或者切换到非安心打包模式进行打包
  • 第十七天:原码、反码、补码与位运算
  • 【渲染流水线】主线索引-从数据到图像以UnityURP为例
  • Kafka 的基本操作(1)
  • Go语言实战案例:使用sync.Mutex实现资源加锁
  • 解决docker load加载tar镜像报json no such file or directory的错误
  • 安科瑞智慧能源管理系统在啤酒厂5MW分布式光伏防逆流控制实践
  • Redis协议数据迁移方式
  • 基于华为开发者空间的Open WebUI数据分析与可视化实战
  • 一次“无告警”的服务器宕机分析:从无迹可寻到精准定位
  • Java技术栈/面试题合集(8)-Redis篇
  • linux服务器上word转pdf后乱码问题
  • 如何对云环境或者超融合系统进行性能测试?