Python 中,关于函数的参数传递,有两种首要的方法:传值和传引证。事实上,Python 的参数传递是一种“传目标引证”的方法。接下来的文章咱们将具体介绍 Python 的函数参数传递机制,这对了解 Python 编程语言的底层完成以及优化你的代码都十分有帮助。

一、Python 中的变量和目标

在深化了解参数传递之前,咱们首先需求了解 Python 中的变量和目标的概念。

在 Python 中,所有的数据都是目标,无论是数字、字符串还是自界说类型。而变量则是指向目标的引证。

x = 3
y = x

在这个比如中,xy 都是指向整数 3 这个目标的引证。咱们能够经过 id() 函数检查它们指向的目标的内存地址,验证这一点。

print(id(x))  # 输出:94832830448320
print(id(y))  # 输出:94832830448320

二、可变目标和不可变目标

在 Python 中,目标能够分为可变目标和不可变目标。例如,列表、字典和集合是可变目标,而数字、字符串和元组是不可变目标。

关于不可变目标,咱们无法改动目标本身,但是能够改动变量所指向的目标。

x = 3
print(id(x))  # 输出:94832830448320
x = 4
print(id(x))  # 输出:94832830448352

在这个比如中,咱们先是让变量 x 指向了整数 3,然后又让 x 指向了整数 4。咱们无法改动整数 3 本身,但是能够改动 x 所指向的目标。

关于可变目标,咱们既能够改动目标本身,也能够改动变量所指向的目标。

x = [1, 2, 3]
print(id(x))  # 输出:139644486420232
x.append(4)
print(id(x))  # 输出:139644486420232
x = [1, 2, 3, 4, 5]
print(id(x))  # 输出:139644486437576

在这个比如中,咱们先是让变量 x 指向了一个列表 [1, 2, 3],然后咱们经过 append() 办法改动了这个列表,使其变为了 [1, 2, 3, 4]。此时,x 所指向的目标并没有改动,但是目标本身发生了改动。然后,咱们让 x 指向了一个新的列表 [1, 2, 3, 4, 5]。此时,x 所指向的目标改动了。

了解可变目标和不可变目标的差异,关于咱们正确了解 Python 变量和函数的行为,以及编写正确、有用的代码都是十分重要的。

三、参数传递机制

在 Python 中,函数参数的传递遵循“传目标引证”的方法。关于可变目标和不可变目标,表现出来的效果类似传值和传引证。

1. 不可变目标的参数传递

当咱们将一个不可变目标作为参数传递给函数时,函数内部无法改动这个目标本身。函数假如对这个参数进行改动,实践上是创立了一个新的目标。

def change(n):
    print(id(n))
    n = 1000
    print(id(n))
x = 3
print(id(x))
change(x)
print(x)

在这个比如中,函数 change() 企图改动参数 n。但是由于 n 是一个不可变目标,所以函数内部其实创立了一个新的目标,而本来的目标并没有改动。

2. 可变目标的参数传递

当咱们将一个可变目标作为参数传递给函数时,函数内部能够改动这个目标本身。

def change(n):
    print(id(n))
    n.append(4)
x = [1, 2, 3]
print(id(x))
change(x)
print(x)

在这个比如中,函数 change() 改动了参数 n。由于 n 是一个可变目标,所以函数内部的改动影响到了本来的目标。

四、函数参数传递机制的实践运用

了解了 Python 的参数传递机制,有助于咱们编写出更好的代码。例如,假如咱们知道一个函数内部会改动传入的可变目标,咱们或许需求在传入参数之前先创立一个副本。

def change(n):
    n.append(4)
x = [1, 2, 3]
change(x[:])
print(x)

在这个比如中,咱们传入了 x 的副本,因此函数内部的改动不会影响到 x

总的来说,Python 的函数参数传递机制遵循“传目标引证”的方法,了解这一点,能帮助咱们更好的了解 Python 的作业原理,并编写出更有用率和可读性更强的代码。

五、匿名函数 lambda

Python 中的 lambda 是一个十分有用的匿名函数东西,它允许咱们快速界说简略的函数。

# 运用lambda界说一个匿名函数
square = lambda x: x**2
print(square(5))  # 输出:25

在这个比如中,咱们运用 lambda 关键字界说了一个匿名函数,该函数接纳一个参数 x 并回来 x 的平方。

1. lambda 的运用场景

尽管 lambda 函数功能有限(只能写在一行上,不能包括杂乱的逻辑),但在某些情况下,它的运用能够让代码更简洁。例如,当咱们需求传入一个小的、临时的函数作为其他函数的参数时,就能够运用 lambda。

# 运用lambda在列表排序中完成自界说排序规矩
data = [{'name':'Alan', 'age':20}, {'name':'Lisa', 'age':18}, {'name':'Tom', 'age':22}]
data.sort(key=lambda x: x['age'])
print(data)
# 输出:[{'name': 'Lisa', 'age': 18}, {'name': 'Alan', 'age': 20}, {'name': 'Tom', 'age': 22}]

在这个比如中,咱们运用 lambda 函数作为 sort() 函数的 key 参数,来完成根据年纪的排序。

六、函数式编程东西

Python 供给了一些内建函数,用于支持函数式编程,如 map()filter()reduce() 等。这些函数能够用来对列表或其他可迭代目标进行操作,而无需编写循环。

1. map() 函数

map() 函数接纳一个函数和一个可迭代目标作为参数,并将该函数运用于可迭代目标的每个元素,然后回来一个新的可迭代目标。

# 运用map()函数将列表中的每个元素平方
nums = [1, 2, 3, 4, 5]
squares = map(lambda x: x**2, nums)
print(list(squares))  # 输出:[1, 4, 9, 16, 25]

在这个比如中,咱们运用 map() 函数和一个 lambda 函数,将列表中的每个元素平方。

2. filter() 函数

filter() 函数接纳一个函数和一个可迭代目标作为参数,并回来一个新的可迭代目标,该目标包括所有使该函数回来 True 的元素。

# 运用filter()函数挑选出列表中的偶数
nums = [1, 2, 3, 4, 5]
evens = filter(lambda x: x % 2 == 0, nums)
print(list(evens))  # 输出:[2, 4]

在这个比如中,咱们运用 filter() 函数和一个 lambda 函数,挑选出列表中的偶数。

了解和掌握 Python 函数的这些特性,能够帮助咱们编写出愈加灵敏、有用和简洁的代码。在未来的学习和作业中,咱们还将遇到更多关于函数的运用场景,如装修器、生成器等等,这些都能够看作是 Python 函数特性的延伸和运用。

七、高阶函数

在 Python 中,函数是第一类目标,这意味着咱们能够将函数作为参数传递给其他函数,也能够让函数回来另一个函数。这样的函数,咱们一般称之为高阶函数。高阶函数是函数式编程中的重要概念。

1. 函数作为参数

# 界说一个函数,承受另一个函数作为参数
def apply_func(func, x):
    return func(x)
# 界说一个函数,核算平方
def square(x):
    return x ** 2
print(apply_func(square, 5))  # 输出:25

在这个比如中,apply_func 是一个高阶函数,它接纳另一个函数 square 作为参数。

2. 函数作为回来值

# 界说一个函数,回来另一个函数
def get_func(power):
    def power_func(x):
        return x ** power
    return power_func
square = get_func(2)
print(square(5))  # 输出:25

在这个比如中,get_func 是一个高阶函数,它回来一个新的函数 power_func

高阶函数为咱们的代码供给了很大的灵敏性。例如,咱们能够根据需求动态创立和修正函数,也能够构建愈加杂乱的函数逻辑。

八、总结

函数是 Python 编程的根底之一,掌握 Python 函数的各种特性和用法对咱们的编程技术提高十分重要。经过本篇文章,咱们对 Python 函数的基本概念和用法进行了回顾,并学习了 Python 中一些更高级的函数特性和用法,包括默许参数、可变参数、lambda 表达式、高阶函数等等。希望这些内容对你有所帮助,祝你在 Python 编程的道路上越走越远。