一、重新认识Python函数:不只是工具,更是“一等公民”
在Python中,函数的功能非常强大,它不仅仅是实现某项功能的代码块,更是一个可以自由操作的“对象”(Object)。这为编程带来了极大的灵活性。
一个简单的函数:
def test():
print('这是一个普通的测试函数')
为什么说函数是“对象”?它有什么神通?
1.可以添加属性:像普通对象一样,给函数“贴标签”。
test.desc = '测试使用,请勿在正式环境下部署'
test.version = '1.0'
2.可以赋值给变量:让函数换个“名字”使用。
my_test = test 现在 my_test 和 test 指向同一个函数
my_test() 输出:这是一个普通的测试函数
3.可以作为参数传递:将函数作为“礼物”送给另一个函数。
def callit(func):
print('开始调用另一个函数:')
func()
callit(test) 将test函数作为参数传入
4.可以作为返回值:一个函数可以“生出”另一个函数,这在闭包和装饰器中很常见。
二、玩转函数参数:灵活应对各种调用场景
Python为函数的参数设计提供了极大的便利,让你不再为参数个数和顺序发愁。
l默认参数:给参数一个备选值,调用时可以省略。
def greet(name, greeting='你好'): greeting默认为‘你好’
print(f'{greeting}, {name}!')
greet('小明') 输出:你好,小明!
greet('小红', greeting='Hello') 输出:Hello,小红!
l可变参数(*args 和 kwargs)**:能像“百宝箱”一样接收任意数量的参数。
o*args:接收任意数量的位置参数,打包成元组。
okwargs:接收任意数量的关键字参数,打包成字典。
def show_msg(*args, **kwargs):
print(f'所有位置参数:{args}')
print(f'所有关键字参数:{kwargs}')
show_msg(1, 2, 3, name='小明', age=18)
输出:
所有位置参数:(1, 2, 3)
所有关键字参数:{'name': '小明', 'age': 18}
l参数解包(Unpacking):反过来,把一个列表或字典“拆开”传给函数。
numbers = [10, 20]
info = {'sep': '---', 'end': '!!!'}
解包传参
print(*numbers, **info) 等价于 print(10, 20, sep='---', end='!!!')
三、高阶函数与匿名函数:让代码更抽象、更简洁
高阶函数(Higher-Order Function)
定义:把函数作为参数,或者把函数作为返回值的函数。
作用:实现“行为参数化”,让核心逻辑和具体操作分离,代码复用性更高。
def info(message):
return '[提醒]' + message
def warn(message):
return '[警告]' + message
def log(level_func, text):
"""高阶函数:接收一个函数(消息级别处理函数)作为参数"""
processed_msg = level_func(text)
print(processed_msg)
log(info, '系统启动中...') 输出:[提醒]系统启动中...
log(warn, '内存占用过高!') 输出:[警告]内存占用过高!
四匿名函数(Lambda)
定义:没有名字、只有一行的临时小函数。
使用场景:当函数非常简单,且只在一处使用时,用lambda可以省去定义正式函数的步骤,让代码更紧凑。
语法:lambda 参数: 返回值表达式
例子1:定义简单计算
add = lambda x, y: x + y
print(add(5, 3)) 输出:8
例子2:作为高阶函数的参数(这才是lambda最常用的地方)
numbers = [1, 2, 3, 4]
使用map和lambda将列表每个元素平方
squared = list(map(lambda x: x**2, numbers))
print(squared) 输出:[1, 4, 9, 16]
使用filter和lambda过滤出偶数
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) 输出:[2, 4]
四、强大的内置数据处理函数:函数式编程工具
Python内置了一些与lambda和高阶函数绝配的工具,用于处理数据集合。
lmap(func, iterable):将函数映射到可迭代对象的每个元素上,产生新的结果。
将字符串列表转为大写
names = ['alice', 'bob', 'charlie']
upper_names = list(map(str.upper, names))
print(upper_names) #输出:['ALICE', 'BOB', 'CHARLIE']
lfilter(func, iterable):根据函数返回的True/False过滤可迭代对象的元素。
过滤出长度大于3的名字
long_names = list(filter(lambda name: len(name) > 3, names))
print(long_names) 输出:['alice', 'charlie']
lsorted(iterable, key=func, reverse=False):排序,key参数指定根据哪个规则排序。
按名字长度排序
sorted_by_length = sorted(names, key=len)
print(sorted_by_length) 输出:['bob', 'alice', 'charlie']
lmax/min(iterable, key=func):找出最大/最小值。
找最长的名字
longest = max(names, key=len)
print(longest) 输出:charlie