Python因其灵活性而在数据科学领域被广泛使用,但对于初学者来说,尤其是没有编程背景的人来说,理解Python函数可能是一个挑战。函数是执行特定任务的逻辑分组语句。使用函数来避免重复编写相同的代码,因为随着代码量的增加,代码的可重用性也会降低。本质上,Python函数的最大优势在于代码的可重用性。
使用Python函数还有其他几个优点,包括避免代码重复、提高程序可读性、将复杂问题分解为更简单的问题、减少错误发生的机会以及通过使用函数使修改程序变得更容易。当学习机器学习和数据科学时,了解到使用的算法本质上就是函数。本文将涵盖Python函数的基础知识以及如何使用它们。
Python中有两类函数。
def function_name(Parameter):
这里,def关键字是必须的,return是可选的。下面是一个例子:
def wish(): print("Hello Good Evening")
现在可以调用它:
wish()
每次调用它时,都会打印“Hello Good Evening”。
让通过一个简单的例子来理解这一点。编写一个函数,输入学生的名字,并按名字打印问候信息。所以,有一点很清楚——在()内必须提供参数。
def wish(name): print("Hello", name, "Good Evening")
如果函数有参数或参数,不能调用它为wish(),因为会得到类型错误。这里,需要提供值,所以可以简单地调用它:
wish("John")
函数可以返回一些值。根据提供的逻辑,会得到一些结果,那个结果就是返回值。
def add(a, b): sum = a + b return sum
add(10, 20)
没有要求返回值sum,但Python不会给出错误,因为这不是强制性的。然而,不会得到任何值,因为没有调用返回函数。这里,可以像返回了值并将其保存在一个变量中,然后打印输出:
result = add(10, 20)print(result)
或者可以这样做:
print(add(10, 20))
Python函数可以返回多个值。
def sum_sub(a, b): sum = a + b sub = a - b return sum, sub
要执行这段代码,应该这样写:
x, y = sum_sub(20, 10)print("The sum is", x)print("The subtraction is", y)
Python中有几种类型的参数。让看看并理解什么是参数。
让通过一个例子来理解这一点:
def sub(a, b): print(a - b)sub(200, 100)
这里,a = 200和b = 100。知道这一点,因为已经分配了这些位置。所以在位置参数中,顺序很重要。如果改变顺序,结果也会改变。
这里,通过变量提供值,所以位置不重要。但是,参数的数量仍然很重要。
def sub(a, b): print(a - b)sub(a=200, b=100)
这些参数是在已经定义了参数但没有传递它时应用的。让理解这一点:
def identity(name): print("Hello your name is", name)identity()
这将给出位置错误,因为已经定义了参数,但没有传递参数。如果想避免这一点,可以这样做:
def identity(name="Guest"): print("Hello your name is", name)identity()
现在它将执行,并将“Guest”作为默认值。
它可以接收任意数量的参数:
f1(*n)*-> n 可变长参数
它也可以有0个参数。可以像这样拥有可变长参数:
def f1(*n): print("Variable length argument")f1()f1(10)f2(10, 20, 30)
它们在内部都被保存为元组,所以可以访问它们。
有两种类型的变量:全局变量和局部变量。全局变量总是在函数外面,并且可以被所有函数访问,而局部变量是在特定函数中定义的。在Python中,可以有同名的全局变量和局部变量。
a = 10 # 全局变量
def f1(): a = 20 # 局部变量 print(a)
f2(): print(a)
如果将输出作为:
f1()f2()
那么需要理解,在第一种情况中,即f1函数中a = 20,所以输出将是20,不管全局变量如何。而在f2中,输出将是10,因为没有在f2中定义局部变量,所以它将取全局变量的值。
顾名思义,递归函数是调用自身的函数。可以编写简洁的代码来帮助解决复杂问题。这里有一个例子:
def factorial(n): if n == 0: result = 1 else: result = n * factorial(n-1) return result
* 最大递归深度是995次,它可以调用同一个函数。
这些是没有名称的函数,或者可以被称为无名称函数或匿名函数。它们通常用于即时使用或一次性使用,不需要再次使用。
lambda input argument: expression
例如,计算一个数的平方:
lambda n: n*n
这里有一个快速的例子:
s = lambda a, b: a + bprint(s(2, 4))
filter(function, sequence) 这里,一个参数是filter函数本身的函数。假设想要一个从0到10的列表,只包含偶数。现在,filter函数格式是:
filter(function, sequence)
filter函数中使用的函数参数用于验证条件是否为真。如果为真,则打印序列参数,如果为假,则不打印。
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def iseven(n): if n % 2 == 0: return True else: return False
l1 = filter(iseven, l)
但有一件事需要改变——filter的默认返回类型是filter对象,所以需要将其转换为列表。
l1 = list(filter(iseven, l))print(l1)
对于每个序列,应用某个函数并生成新值。例如,假设有l = [1,2,3,4,5]。想要所有值的平方。
def squareit(n): return n * n
l1 = list(map(squareit, l))print(l1)
也可以用于多个序列。
这里,如果有10个输入值,那么输出是10或少于10。而在reduce函数中,无论元素的数量如何,元素的序列最终变成一个。
l = [10, 20, 30, 40, 50]reduce(lambda x, y: x + y, l)
from functools import reduce