目录
1. 术之本源--函数的定义
Python函数通过def关键字定义,函数的基本结构如下:
def 函数名(参数):
# 函数体
return 返回值
# ------示例------
def great(name):
return f"你好, {name}"
# 调用函数
print(great('大圣'))
2. 灵力流转--参数与返回值
2.1 参数
2.1.1 位置参数
按照顺序传递的参数,输入时传入的参数按照位置与函数定义中的参数对应。示例如下:
def change_shape(shape, color):
return f"变成了{color}的{shape}"
print(change_shape("大圣", "金色"))
2.1.2 默认参数
为参数提供默认值。当输入时没有传入参数时,函数调用默认值工作,同时要注意,使用默认参数时,参数要放在所有参数的后面。示例如下:
def change_shape(shape="大圣", color="金色"):
return f"变成了{color}的{shape}"
print(change_shape())
2.1.3 关键字参数
接收键值对形式的参数,通过关键字针对性的传入参数,不必考虑在函数中该参数对应的位置是哪里。示例如下:
def change_shape(shape, color):
return f"变成了{color}的{shape}"
print(change_shape(color = "金色", shape = "大圣"))
当调用函数时要注意,关键字参数必须要位置参数之后:
def change_shape(shape, color):
return f"变成了{color}的{shape}"
print(change_shape("大圣", color="金色"))
2.1.4 可变参数--*args
接受任意数量的参数。python中提供了两种可变参数:*args和**kwargs。
*args使用示例如下:
# *args:用于接收任意数量的位置参数,存储为一个元组
def change_shape(*args):
for shape in args:
print(f"变成了{shape}")
change_shape("大圣", "弼马温", "猴子")
*args结合其他参数使用时,必须放在普通参数之后,此时,*args接受位置参数之后的所有参数:
def change_shape(color, *shapes):
for shape in shapes:
print(f"变成了{color}的{shape}")
change_shape("金色", "大圣", "孙猴子", "弼马温")
2.1.5 可变参数--**kwargs
**kwargs用于接收任意数量的关键字参数,并将它们打包成一个字典。
def change_shape(**kwargs):
for key, value in kwargs.items():
print(f"{key}变成了{value}!")
change_shape(猴子="老虎", 老鹰="凤凰", 大树="石头")
**kwargs结合其他参数使用时,必须放在所有参数之后。
def change_shape(color, **shapes):
for key, value in shapes.items():
print(f"{key}变成了{color}的{value}")
change_shape("金色", 猴子="老虎", 老鹰="凤凰", 大叔="石头")
2.1.6 *args和**kwargs同时使用
在同一个函数中,可以同时使用*args和**kwargs,但是,需要遵循以下顺序:普通参数 > *args > **kwargs。当把普通参数放在后面时,必须使用关键字参数。
def change_shape(color, *args, **kwargs):
for shape in args:
print(f"变成了{color}的{shape}")
for key, value in kwargs.items():
print(f"变成了{key}的{value}")
change_shape("金色", "老虎", "老鹰", 猴子="石头", 大树="山")
2.1.7 特殊字符-- / 和 *
/ 用于指定某些参数必须通过位置参数的方式传递,而不能通过关键字参数的方式传递。/ 左侧,必须通过位置参数传递,/ 右侧,可以通过位置参数或关键字参数传递
def greet(name, /, message):
print(f"{name}, {message}")
greet("大圣", message="你好")
* 用于指定某些参数必须通过关键字参数的方式传递,而不能通过位置参数的方式传递。* 右侧,必须通过关键字参数传递。
def greet(*, name, message):
print(f"{name}, {message}")
greet(name="孙悟空", message="你好")
当结合 / 与 * 使用时,/ 左侧,必须通过位置参数传递,/ 和 * 之间可以通过位置参数或者关键字参数传递,* 右侧,必须通过关键字参数传递。
def example(a, b, /, c, *, d, e):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}")
example(1, 2, c=3, d=4, e=5)
2.2 返回值
函数可以通过return返回一个值,也可以通过元组的形式返回多个值.
def change_shape(shape, color):
return shape, color
result = change_shape("老虎", "金色")
print(result)
3. 无尽丹田--作用域
函数的作用域分为局部作用域和全局作用域。函数内,如果变量名相同,局部变量优先。
3.1 global
如果要修改全局变量,可以使用global关键字
shape = "猴子" # 全局变量
def change_shape():
shape = "老虎" # 局部变量
print(f"函数内:{shape}")
change_shape()
print(f"函数外:{shape}")
# global关键字修改局部变量
def global_change_shape():
global shape
shape = "牛马" # 局部变量
print(f"函数内:{shape}")
global_change_shape()
print(f"函数外:{shape}")
3.2 nonlocal
nonlocal的作用类似于global,但是它作用于嵌套函数的外层函数的作用域,并非是全局作用域。
x = 100
def outer():
x = 10
def inner():
nonlocal x # nonlocal声明的变量必须存在于外层函数的作用域
x = 20
inner()
print(f"外层函数的x: {x}")
def inner_global():
global x
x = 200
outer()
inner_global()
print(f"全局的x: {x}")
4 身化万千--高阶函数
python中可以将函数作为参数或者返回值使用。
4.1 函数作为参数
python中,如果要将函数作为参数使用,要注意,在调用函数参数时,不加()。
def transform(shape, action):
return action(shape)
def change_to_tiger(shape):
return f"{shape}变成了老虎"
print(transform("猴子", change_to_tiger))
4.2 函数作为返回值
函数作为返回值使用时,类似二维列表,调用时利用()一步一步完全调用函数。也就是说,调用外层函数时,返回内层函数的引用,内层函数产生并开始准备发挥作用。通过引用再次调用函数时,内层函数开始真正的发挥作用。
def create_transformer(action):
def transformer(shape):
return f"{shape}{action}"
return transformer
# 1. 调用外层函数create_transformer,此时change_to_eagle相当于transformer函数
change_to_eagle = create_transformer("变成了老鹰")
# 2.调用change_to_eagle,进入transformer函数
print(change_to_eagle("猴子"))
5. 隐身--匿名函数
匿名函数不需要明显的使用def关键字定义函数。顾名思义,匿名函数没有名字,通常应用于定义简单的、一次性的函数逻辑。
5.1 基本用法
匿名函数通过lambda定义,因此也被称为lambda函数
# 基本语法
lambda 参数1, 参数2, ... : 表达式
# 匿名函数与def定义函数对比--以求和为例
# def函数
def add(x, y):
return x + y
print(add(3, 5))
# 匿名函数
add = lambda x, y: x + y
print(add(3, 5))
5.2 嵌套匿名函数
def make_multiplier(n):
return lambda x: x * n
double = make_multiplier(2)
print(double(5))
5.3 匿名函数与高阶函数
python中匿名函数和高阶函数是python中非常强大的特性。匿名函数快速定义简单的逻辑,而高阶函数则允许将函数作为参数或者返回值,两者结合,可以更灵活的使用python。
# map():对集合中的每个元素应用函数
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)
# filter():过滤集合中的元素
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
# reduce():对集合中的元素进行累积计算
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)
# sorted():自定义排序规则
words = ['apple', 'banana', 'cherry', 'date']
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)
6. 生生不息--递归函数
递归函数通过调用自身,实现无限循环。
def change_shape(n):
if n==0:
return "变回原形"
else:
print(f"第{n}次变化")
return change_shape(n-1)
print(change_shape(3))
7. 法天相地--装饰器
装饰器允许在不修改函数代码的情况下,动态的增加功能。其本质上是一个高阶函数,即接受一个函数作为输入,并返回一个新的函数。
def magic(func):
def wrapper(*args, **kwargs):
print("咒语:变变变")
return func(*args, **kwargs)
return wrapper
"""
@magic的实现相当于以下步骤:
change_shape = magic(change_shape)
change_shape("老虎")
事实上是将返回的wrapper()函数更名为change_shape
"""
@magic
def change_shape(shape):
return f"变成了{shape}"
print(change_shape("老虎"))
8. 毫毛化身--迭代器与生成器
8.1 迭代器
python中,迭代器是一种可以逐步返回元素的对象。使用iter()函数将可迭代对象(如列表、元组、字符串等)转换为迭代器。
# 使用iter()
numbers = [1, 2, 3, 4]
iter_obj = iter(numbers)
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
print(next(iter_obj))
# print(next(iter_obj)) 抛出StopIteration异常
8.2 生成器
生成器是一种特殊的迭代器,使用yield语句来逐步返回值。生成器在调用yield时会暂停执行,并在下一次调用时从yield语句后继续。
# 使用yield
def my_generator():
print("Start")
yield 1
print("Continue")
yield 2
print("End")
yield 3
gen = my_generator()
for item in gen:
print(item)