Python 函数全攻略

一、Python 函数概述

Python 中的函数是可重用的代码块,能提高代码的模块化和可读性,实现特定功能并可能返回值。
函数在 Python 编程中具有至关重要的作用。就像一个固定的做月饼模型模具,外壳是固定的,往里面放各种馅就行,函数可以实现不同的特定功能而无需重复编写大量相同的代码。

Python 函数可以分为有名函数和匿名函数。有名函数在大多数情况下被广泛使用,而匿名函数通常用于一些简单的处理场景。函数是一个被命名的、独立的、完成特定功能的代码段,其功能一定要专一。例如,内置函数如print()用于输出内容到控制台,input()用于从控制台读取用户输入,len()返回对象的长度(元素个数)等。

函数可以接受输入参数,执行特定的操作,并返回结果。很多函数在执行完毕后,会通过return关键字返回一个结果给调用它的位置。在定义函数时,使用def关键字,后面跟着函数名称和参数列表,函数体中包含实现特定功能的代码。函数的调用遵循先定义后使用的原则,通过函数名称和传递相应的参数来调用函数。

函数可以提高代码的可重用性和可维护性,使代码更加模块化,易于理解和修改。在实际项目开发中,合理地定义和使用函数可以大大提高开发效率,降低代码的复杂度。例如,在一个较大的项目中,可以将不同的功能模块分别定义为不同的函数,当需要使用某个功能时,直接调用相应的函数即可,而无需重复编写相同的代码。这样不仅可以提高代码的可读性,还可以方便地进行代码的调试和维护。

总之,Python 函数是一种强大的编程工具,能够帮助开发者更高效地编写代码,提高代码的质量和可维护性。

二、函数的种类

(一)内置函数

内置函数是 Python 自带的函数,为开发者提供了极大的便利。比如str()函数可以将数据转化成字符串,当我们需要将一个整数或其他数据类型转换为字符串进行输出或其他操作时,str()函数就派上了用场。list()函数能将一个可迭代对象转换成列表,比如将一个元组转换为列表,方便进行增删改查等操作。len()函数返回对象中的元素个数,对于判断数据结构的大小非常有用。还有sum()函数用于计算可迭代对象中的所有元素的和,在处理数值数据时很常见。内置函数数量众多,涵盖了各种常见的操作需求,极大地提高了开发效率。

(二)自定义函数

自定义函数是由程序员根据特定需求编写的函数。程序员可以根据实际情况定义函数的参数和返回值。例如,计算两个数的和的自定义函数可以这样写:

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

通过自定义函数,我们可以实现各种复杂的业务逻辑,满足不同项目的需求。自定义函数可以接受不同类型的参数,如整数、字符串、列表等,并根据参数进行相应的处理,返回不同类型的值。

(三)匿名函数

匿名函数,也称为 lambda 函数,无名称且接受参数且只有一个表达式。例如,add = lambda x, y : x+y,这个匿名函数实现了两个数相加的功能。匿名函数通常用于一些简单的处理场景,比如在map()、filter()等函数中作为参数使用。它的优点在于简洁明了,无需定义函数名,对于一些临时的、简单的操作非常方便。

(四)高阶函数

高阶函数可以接受一个或多个函数作为参数并返回函数。比如map()函数就是一个高阶函数,它接受一个函数和一个可迭代对象作为参数,将函数作用于可迭代对象的每个元素,并返回一个新的可迭代对象。例如:

def square(x):
    return x * x
numbers = [1, 2, 3, 4, 5]
squared_numbers = map(square, numbers)

高阶函数的强大之处在于它可以将函数作为参数进行传递,实现更加灵活的编程。

(五)闭包函数

闭包函数可以访问其定义范围外的变量,常用于实现装饰器等功能。闭包函数的本质是函数的嵌套定义,即在函数内部再定义函数。例如:

def Maker(name):
    num = 100
    def func1(weight, height, age):
        weight += 1
        height += 1
        age += 1
        print(name, weight, height, age)
    return func1

闭包函数可以保存函数的状态信息,使函数的局部变量信息依然可以保存下来。这在一些需要保持状态的场景中非常有用,比如实现计数器等功能。

三、函数的作用

函数在 Python 编程中具有重要的作用,主要体现在实现代码重用和模块化编程,从而提高程序的可维护性。

首先,代码重用是函数的一大优势。以计算阶乘为例,我们可以将求阶乘的功能封装成一个函数,每次求阶乘时,只需通过修改参数即可调用函数。比如在处理组合数的计算时,需要用到阶乘的计算,就可以直接调用这个函数,而无需重复编写求阶乘的代码。这样大大提高了开发效率,减少了代码量。

其次,函数有助于实现模块化编程。将一个复杂的程序分解为多个独立的函数模块,每个函数模块负责特定的功能,使得程序结构更加清晰。比如在一个数据处理程序中,可以将数据读取、数据清洗、数据分析等功能分别封装成不同的函数。这样,当需要修改某个功能时,只需找到对应的函数进行修改,而不会影响其他部分的代码,提高了程序的可维护性。

函数还可以通过参数传递和返回值,实现不同模块之间的数据交互。例如,一个函数可以接受多个参数,对这些参数进行处理后,返回一个结果给调用它的位置。这样,不同的函数之间可以通过参数和返回值进行协作,共同完成复杂的任务。

此外,函数还可以提高代码的可读性。一个好的函数命名可以清晰地表达函数的功能,使得其他开发者能够快速理解代码的意图。例如,使用calculate_area这样的函数名,可以很容易地知道这个函数是用于计算面积的。

在实际项目开发中,函数的作用更加明显。例如,在一个 Web 应用开发项目中,可能会有用户认证、数据存储、业务逻辑处理等多个功能模块。将这些功能模块分别封装成不同的函数,可以使得代码更加清晰、易于维护。当需要添加新功能或者修改现有功能时,只需对相应的函数进行修改,而不会影响其他部分的代码。

总之,函数在 Python 编程中起着至关重要的作用,通过实现代码重用和模块化编程,提高了程序的可维护性、可读性和开发效率。

四、常用函数有哪些

(一)基本输出输入函数

print()函数是 Python 中最常用的输出函数之一,它可以将各种类型的数据输出到控制台。例如,可以输出字符串、整数、浮点数等。print(“Hello, World!”)会在控制台输出Hello, World!。如果要输出多个值,可以用逗号分隔,例如print(“The value is”, 10)会输出The value is 10。

input()函数用于获取用户的输入。它会在控制台显示一个提示信息,然后等待用户输入内容。例如,name = input(“Please enter your name: “)会提示用户输入名字,并将用户输入的内容赋值给变量name。

(二)进制转换函数

在 Python 中,我们可以轻松地进行不同进制之间的转换。进制是表示数字的一种方式,常见的进制包括二进制、八进制、十进制和十六进制。

十进制转其他进制:Python 提供了内置函数bin()、oct()和hex()来分别将十进制数转换为二进制、八进制和十六进制。例如,decimal_number = 10,binary_number = bin(decimal_number)会将十进制数 10 转换为二进制,结果为0b1010。同理,octal_number = oct(decimal_number)将得到八进制的0o12,hexadecimal_number = hex(decimal_number)将得到十六进制的0xa。

其他进制转十进制:可以使用int()函数,例如int(‘0b1010’, 2)会将二进制数1010转换为十进制的 10;int(‘0o12’, 8)将八进制数12转换为十进制的 10;int(‘0xa’, 16)将十六进制数0xa转换为十进制的 10。

(三)求数据类型函数

type()函数用于获取变量的类型。例如,n = “hello world”,type(n)会返回,表示变量n是字符串类型。

isinstance()函数用于判断变量是否属于某一数据类型,可以判断子类是否属于父类。例如,str1 = ‘ss’,如果要判断str1是否是字符串类型,可以使用isinstance(str1, str),会返回True。推荐使用isinstance()函数来判断变量类型。

(四)关键字函数

keyword.kwlist()函数可以查看 Python 中的关键字。例如,import keyword,print(keyword.kwlist)会输出 Python 的所有关键字,如[‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]。

(五)数学函数

abs()函数用于返回数字的绝对值。例如,print(abs(-5))会输出 5。

pow()函数用于计算任意数的 n 次方的值。例如,print(pow(2, 5))会输出 32,表示 2 的 5 次方。

(六)其他常用函数

range()函数用于生成一个整数序列,常用于循环中。例如,for i in range(5)会循环 5 次,输出 0、1、2、3、4。range([start,] stop [,step]),其中start可以不写,默认值是 0,若给定则从start开始;stop必须给定;取值范围是[start,stop);step是步长,若不给则默认为 1。

五、如何高效使用函数

(一)列表推导式

列表推导式是一种在 Python 中快速创建列表的简洁方法,它可以极大地简化代码。在 Python 编程中,列表推导式(List Comprehension)基于已有的列表或任何可迭代对象,通过简洁的语法,快速生成满足特定条件的元素组成的新列表。其基本形式如下:[expression for item in iterable if condition]。其中,expression是一个表达式,定义了新列表中每个元素的值;item是从iterable中获取的每个元素;condition是一个可选的条件语句,用于过滤iterable中的元素。

例如,假设我们有一个列表,包含 1 到 9 的数字,想要创建一个新列表,其中包含原列表中每个数字的平方。使用列表推导式可以轻松实现:numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9],squares = [x2 for x in numbers]。列表推导式会遍历numbers中的每个元素,计算其平方,并将结果存储在新的列表squares中。 我们还可以在列表推导式中加入条件语句,以过滤掉不需要的元素。例如,如果只想要平方小于 50 的数字,可以这样写:filtered_squares = [x2 for x in numbers if x**2 < 50]。

列表推导式不仅使代码更加简洁,而且执行效率也往往比传统的for循环或map函数更高。它具有代码简洁性、可读性强、执行效率高以及功能强大等优势。但在使用时也需要注意避免过度使用、关注性能问题以及进行充分的测试和调试。

(二)上下文管理器

上下文管理器在 Python 中是一个强大且方便的工具,用于确保代码块的执行前后能够自动执行某些操作,如资源的获取与释放、异常的处理等。通过上下文管理器,我们可以更加优雅地管理资源,避免资源泄露和异常处理不当等问题。

上下文管理器的主要作用有两个方面:一是自动管理资源,在 Python 中,我们经常需要操作一些需要手动管理资源的对象,如文件、数据库连接、网络连接等。使用上下文管理器,我们可以确保在代码块执行完毕后,这些资源能够自动得到释放,从而避免资源泄露和内存溢出等问题。二是简化异常处理,上下文管理器还提供了简化异常处理的能力。当在代码块中发生异常时,上下文管理器可以确保在退出代码块之前执行一些清理操作,如关闭文件、断开连接等。

要使用上下文管理器,我们需要定义一个实现了enter()和exit()方法的类。这两个方法分别在进入和退出代码块时自动调用。例如,定义一个文件操作的上下文管理器:

class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting the context")
        if exc_type:
            print(f"An exception occurred: {exc_value}")
        return True

使用with语句:

with MyContextManager() as cm:
    print("Inside the context")

在这个例子中,当进入with语句块时,会调用MyContextManager类的enter方法,并打印 “Entering the context”。然后,我们可以安全地在代码块中使用资源或执行操作。当退出with语句块时,无论是否发生异常,都会自动调用exit方法,并打印 “Exiting the context”。

Python 标准库中提供了许多内置的上下文管理器,如文件操作、线程锁等。此外,我们还可以使用第三方库或自定义上下文管理器来满足特定的需求。

(三)Lambda 函数

Lambda 函数,也称为匿名函数,是一种无名称且接受参数且只有一个表达式的函数。例如,add = lambda x, y : x+y,这个匿名函数实现了两个数相加的功能。

Lambda 函数的语法格式为:lambda [parameter_list] : expression。其中,parameter_list是参数列表,expression是表达式,根据参数计算并返回结果。

Lambda 函数通常用于一些简单的处理场景,比如在map()、filter()等函数中作为参数使用。它的优点在于简洁明了,无需定义函数名,对于一些临时的、简单的操作非常方便。
例如,使用lambda函数结合map()函数将列表中的每个元素乘以 2:

numbers = [1, 2, 3, 4, 5]
doubled_numbers = list(map(lambda x: x * 2, numbers))
print(doubled_numbers)

输出为[2, 4, 6, 8, 10]。

又比如,使用lambda函数结合filter()函数过滤列表,只保留偶数:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)

输出为[2, 4, 6, 8]。

(四)解构赋值

解构赋值是一种在 Python 中快速分配序列元素到多个变量的方法。它可以让我们更加简洁地处理多个变量的赋值问题。

例如,普通的解构赋值:[var1, var2, var3] = [1, 2, 3],这样var1的值是 1,var2的值是 2,var3的值是 3。

解构赋值可以搭配解包运算符(*)使用。例如:var1, *var2, var3 = 1, 2, 3, 4,这里var2会接收中间的两个值,即var2 = [2, 3]。

Python 的解构赋值还支持嵌套,例如:[var1, var2, (var3, var4)] = (1, 2, [3, 4]),这样var4的值是 4。
解构赋值在函数的参数上也可以使用,例如:def sumList(numList): return sum(numList),这里的numList就是解构赋值的一种应用,它可以接收任意数量的参数。

(五)函数装饰器

函数装饰器是一种动态为函数添加新功能的方法。它可以在不修改原函数代码的情况下,为函数添加额外的功能。

装饰器本质上是一个可调用对象,通常是一个函数,它接受一个函数作为参数,并返回一个新的函数。这个新函数通常会在调用原函数之前或之后执行一些额外的代码,从而实现为原函数添加新功能的目的。

例如,一个简单的装饰器:

def use_log(func):
    def wrapper():
        print("%s is running" % func.__name__)
        return func()
    return wrapper

@use_log
def say_hello_world():
    print("hello world!")

在这个例子中,use_log是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapper。当我们使用@use_log装饰say_hello_world函数时,实际上是将say_hello_world函数作为参数传递给use_log函数,并将返回的新函数重新赋值给say_hello_world。这样,当我们调用say_hello_world函数时,实际上是调用了装饰后的函数,会先打印出 “say_hello_world is running”,然后再执行原函数的功能。

函数装饰器可以用于插入日志、性能测试、事务处理、缓存、权限校验等场景,它能够使得意图更加明确、减少冗余性、复用代码、促进代码封装。