MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python内置函数的应用与拓展

2021-06-241.3k 阅读

一、Python 内置函数简介

Python 作为一种简洁高效的编程语言,拥有丰富的内置函数。这些函数是 Python 标准库的一部分,无需额外安装或导入,在任何 Python 代码中都可以直接使用。内置函数涵盖了多种功能,从基本的数学运算、类型转换,到序列操作、迭代器操作等,极大地方便了开发者的编程工作。它们不仅提高了代码的编写效率,而且很多内置函数经过优化,在性能上也表现出色。

二、常用数学运算相关内置函数

(一)abs 函数

abs函数用于返回一个数的绝对值。其语法非常简单:abs(x),其中x可以是整数、浮点数或复数。

# 整数的绝对值
num1 = -5
print(abs(num1))  
# 浮点数的绝对值
num2 = -3.14
print(abs(num2))  
# 复数的绝对值(模)
num3 = 3 + 4j
print(abs(num3))  

对于复数,abs函数返回的是其模,根据复数模的计算公式$\sqrt{a^2 + b^2}$,其中a是实部,b是虚部。

(二)round 函数

round函数用于对数字进行四舍五入操作。它有两种常见的用法:

  1. round(number):将number四舍五入到最接近的整数。如果number正好在两个整数中间,那么会舍入到偶数。
  2. round(number, ndigits):将number四舍五入到指定的小数位数ndigits
# 四舍五入到最接近的整数
num4 = 3.5
print(round(num4))  
num5 = 4.5
print(round(num5))  
# 四舍五入到指定小数位数
num6 = 3.14159
print(round(num6, 2))  

在第一个例子中,3.5舍入到44.5舍入到4,这体现了“四舍六入五成双”的规则。在第二个例子中,将3.14159四舍五入到两位小数,得到3.14

(三)sum 函数

sum函数用于对可迭代对象(如列表、元组等)中的元素进行求和。其基本语法为sum(iterable, start=0),其中iterable是要进行求和的可迭代对象,start是可选参数,表示起始值,默认为0

# 对列表中的整数求和
list1 = [1, 2, 3, 4, 5]
print(sum(list1))  
# 对元组中的浮点数求和,并指定起始值
tuple1 = (1.5, 2.5, 3.5)
print(sum(tuple1, 10))  

在第一个例子中,直接对列表[1, 2, 3, 4, 5]求和,结果为15。在第二个例子中,对元组(1.5, 2.5, 3.5)求和,并以10作为起始值,结果为17.5

三、类型转换相关内置函数

(一)int 函数

int函数用于将一个数值或字符串转换为整数。它有几种常见的用法:

  1. int(x):如果x是浮点数,直接截断小数部分转换为整数。如果x是字符串,字符串必须只包含数字字符(可以有正负号),否则会报错。
  2. int(x, base):将字符串x按照指定的进制base转换为十进制整数。base的取值范围是 2 到 36。
# 浮点数转换为整数
float_num = 3.14
print(int(float_num))  
# 字符串转换为整数
str_num1 = '123'
print(int(str_num1))  
# 二进制字符串转换为十进制整数
str_num2 = '1010'
print(int(str_num2, 2))  

在第一个例子中,3.14转换为3。在第二个例子中,字符串'123'转换为整数123。在第三个例子中,二进制字符串'1010'转换为十进制整数10

(二)float 函数

float函数用于将一个整数或字符串转换为浮点数。如果是字符串,字符串必须能被解析为有效的浮点数格式。

# 整数转换为浮点数
int_num = 5
print(float(int_num))  
# 字符串转换为浮点数
str_float = '3.14'
print(float(str_float))  

在第一个例子中,整数5转换为浮点数5.0。在第二个例子中,字符串'3.14'转换为浮点数3.14

(三)str 函数

str函数用于将其他类型的数据转换为字符串。这在格式化输出、日志记录等场景中经常用到。

# 整数转换为字符串
num = 100
print(str(num))  
# 列表转换为字符串
list2 = [1, 2, 3]
print(str(list2))  

在第一个例子中,整数100转换为字符串'100'。在第二个例子中,列表[1, 2, 3]转换为字符串'[1, 2, 3]'

四、序列操作相关内置函数

(一)len 函数

len函数用于返回一个序列(如字符串、列表、元组、字典等)的长度,即元素的个数。

# 字符串的长度
str1 = 'Hello, World!'
print(len(str1))  
# 列表的长度
list3 = [1, 3, 5, 7]
print(len(list3))  
# 字典的长度(键值对的数量)
dict1 = {'a': 1, 'b': 2}
print(len(dict1))  

在第一个例子中,字符串'Hello, World!'的长度为13。在第二个例子中,列表[1, 3, 5, 7]的长度为4。在第三个例子中,字典{'a': 1, 'b': 2}的长度为2

(二)max 和 min 函数

max函数用于返回可迭代对象中的最大值,min函数则用于返回最小值。它们可以接受多个参数,也可以接受一个可迭代对象作为参数。

# 多个参数中的最大值和最小值
print(max(1, 3, 5))  
print(min(1, 3, 5))  
# 列表中的最大值和最小值
list4 = [10, 20, 5]
print(max(list4))  
print(min(list4))  

在第一个例子中,max(1, 3, 5)返回5min(1, 3, 5)返回1。在第二个例子中,列表[10, 20, 5]max返回20min返回5

(三)sorted 函数

sorted函数用于对可迭代对象进行排序,并返回一个新的已排序列表。它不会改变原始的可迭代对象。其基本语法为sorted(iterable, key=None, reverse=False)。其中,key是一个可选函数,用于指定排序的依据;reverse是一个布尔值,默认为False,表示升序排序,如果设置为True,则为降序排序。

# 对列表进行升序排序
list5 = [3, 1, 4, 1, 5, 9]
print(sorted(list5))  
# 对列表进行降序排序
print(sorted(list5, reverse=True))  
# 根据元素的绝对值进行排序
list6 = [-3, 1, -4, 1, -5, 9]
print(sorted(list6, key=abs))  

在第一个例子中,列表[3, 1, 4, 1, 5, 9]升序排序后为[1, 1, 3, 4, 5, 9]。在第二个例子中,降序排序后为[9, 5, 4, 3, 1, 1]。在第三个例子中,根据元素绝对值排序后为[1, 1, -3, -4, -5, 9]

五、迭代器操作相关内置函数

(一)range 函数

range函数用于生成一个整数序列,通常用于循环迭代。它有三种常见的用法:

  1. range(stop):生成从0stop - 1的整数序列。
  2. range(start, stop):生成从startstop - 1的整数序列。
  3. range(start, stop, step):生成从start开始,每次增加step,直到stop - 1的整数序列。
# 生成从 0 到 4 的整数序列
for i in range(5):
    print(i)  
# 生成从 3 到 7 的整数序列
for i in range(3, 8):
    print(i)  
# 生成从 0 到 10,步长为 2 的整数序列
for i in range(0, 11, 2):
    print(i)  

在第一个例子中,range(5)生成序列0, 1, 2, 3, 4。在第二个例子中,range(3, 8)生成序列3, 4, 5, 6, 7。在第三个例子中,range(0, 11, 2)生成序列0, 2, 4, 6, 8, 10

(二)enumerate 函数

enumerate函数用于将一个可迭代对象(如列表、字符串等)组合为一个索引序列,同时获取索引和元素。它返回的是一个枚举对象,可以使用listdict等函数将其转换为相应的类型。

# 对列表使用 enumerate
list7 = ['a', 'b', 'c']
for index, value in enumerate(list7):
    print(f'Index: {index}, Value: {value}')  

上述代码中,enumerate(list7)将列表list7转换为一个枚举对象,在循环中可以同时获取索引index和元素value,输出为Index: 0, Value: aIndex: 1, Value: bIndex: 2, Value: c

(三)zip 函数

zip函数用于将多个可迭代对象(如列表、元组等)中的元素一一对应打包成元组,返回一个可迭代的zip对象。如果可迭代对象的长度不一致,zip会在最短的可迭代对象耗尽时停止。

# 对两个列表使用 zip
list8 = [1, 2, 3]
list9 = ['a', 'b', 'c']
for pair in zip(list8, list9):
    print(pair)  

上述代码中,zip(list8, list9)将两个列表对应元素打包成元组,输出为(1, 'a')(2, 'b')(3, 'c')

六、函数式编程相关内置函数

(一)map 函数

map函数会根据提供的函数对指定序列做映射。其语法为map(function, iterable),其中function是要应用到序列每个元素上的函数,iterable是一个或多个可迭代对象。

# 对列表中的每个元素求平方
def square(x):
    return x * x


list10 = [1, 2, 3, 4]
result = map(square, list10)
print(list(result))  

在上述代码中,map(square, list10)square函数应用到列表list10的每个元素上,得到一个新的可迭代对象,通过list函数将其转换为列表,输出为[1, 4, 9, 16]

(二)filter 函数

filter函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表(在 Python 2 中返回列表,在 Python 3 中返回迭代器)。其语法为filter(function, iterable),其中function是一个返回布尔值的函数,iterable是要过滤的可迭代对象。

# 过滤出列表中的偶数
def is_even(x):
    return x % 2 == 0


list11 = [1, 2, 3, 4, 5]
result = filter(is_even, list11)
print(list(result))  

在上述代码中,filter(is_even, list11)使用is_even函数过滤列表list11,只保留偶数,输出为[2, 4]

(三)reduce 函数

reduce函数在 Python 3 中已经从内置函数移到了functools模块中。它会对参数序列中元素进行累积。在 Python 2 中,其语法为reduce(function, iterable[, initializer]),在 Python 3 中使用时需先导入functools模块,即from functools import reducefunction是一个有两个参数的函数,iterable是可迭代对象,initializer是可选的初始值。

from functools import reduce


# 计算列表元素的乘积
def multiply(x, y):
    return x * y


list12 = [1, 2, 3, 4]
result = reduce(multiply, list12, 1)
print(result)  

在上述代码中,reduce(multiply, list12, 1)从初始值1开始,依次将multiply函数应用到列表元素上,最终计算出列表元素的乘积,输出为24

七、Python 内置函数的拓展应用

(一)结合 lambda 表达式

lambda 表达式是一种匿名函数,它可以与许多内置函数结合使用,使代码更加简洁。例如,在mapfilter函数中,使用 lambda 表达式可以避免定义单独的函数。

# 使用 lambda 表达式与 map 函数求列表元素平方
list13 = [1, 2, 3, 4]
result = map(lambda x: x * x, list13)
print(list(result))  
# 使用 lambda 表达式与 filter 函数过滤出奇数
list14 = [1, 2, 3, 4, 5]
result = filter(lambda x: x % 2!= 0, list14)
print(list(result))  

在第一个例子中,map(lambda x: x * x, list13)使用 lambda 表达式定义了求平方的函数,直接应用到列表元素上。在第二个例子中,filter(lambda x: x % 2!= 0, list14)使用 lambda 表达式定义了判断奇数的函数,对列表进行过滤。

(二)在自定义类中的应用

内置函数也可以在自定义类中使用,通过重载一些特殊方法。例如,len函数可以通过在类中定义__len__方法来支持对类实例的长度计算。

class MyList:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)


my_list = MyList([1, 2, 3, 4])
print(len(my_list))  

在上述代码中,自定义类MyList通过定义__len__方法,使得len函数可以用于计算MyList实例的长度,这里输出为4

(三)在数据处理和分析中的应用

在数据处理和分析场景中,内置函数与第三方库(如numpypandas)结合使用,可以高效地处理大量数据。例如,sum函数可以与numpy数组结合计算数组元素的总和。

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(sum(arr))  

在上述代码中,numpy数组arr可以直接使用sum函数计算总和,输出为15。结合numpy的高效计算特性,在处理大规模数值数据时性能更优。

八、内置函数的性能考量

虽然内置函数通常经过优化,性能较好,但在处理大规模数据时,不同内置函数的性能表现仍可能有所差异。例如,maplist推导式在某些情况下的性能不同。

import timeit

# 使用 map 函数
def using_map():
    return list(map(lambda x: x * x, range(10000)))


# 使用列表推导式
def using_list_comprehension():
    return [x * x for x in range(10000)]


map_time = timeit.timeit(using_map, number = 1000)
comprehension_time = timeit.timeit(using_list_comprehension, number = 1000)

print(f'Map time: {map_time}')
print(f'List comprehension time: {comprehension_time}')

上述代码使用timeit模块来测量map函数和列表推导式在对range(10000)中的每个元素求平方操作的时间。在很多情况下,列表推导式的性能会优于map函数,因为列表推导式在 Python 解释器层面有更优化的实现。所以在实际编程中,需要根据具体场景选择性能更优的方式来处理数据。

九、内置函数的错误处理

在使用内置函数时,可能会遇到各种错误。例如,int函数在将字符串转换为整数时,如果字符串格式不正确会抛出ValueError

try:
    num = int('abc')
except ValueError as e:
    print(f'Error: {e}')  

在上述代码中,int('abc')会抛出ValueError,通过try - except语句捕获并处理该错误,输出Error: invalid literal for int() with base 10: 'abc'。类似地,divmod函数在除数为0时会抛出ZeroDivisionError,开发者需要根据具体的内置函数可能出现的错误类型,合理地进行错误处理,以确保程序的健壮性。

十、总结与展望

Python 的内置函数是其强大功能的重要组成部分,涵盖了数学运算、类型转换、序列操作、迭代器操作、函数式编程等多个方面。通过深入理解和灵活运用这些内置函数,开发者可以写出更加简洁、高效的代码。同时,结合 lambda 表达式、自定义类以及与第三方库的协同使用,可以进一步拓展内置函数的应用场景。在实际编程中,还需要关注内置函数的性能和错误处理,以提升程序的质量。随着 Python 的不断发展,内置函数也可能会不断更新和完善,开发者需要持续学习,以充分利用这些功能,更好地应对各种编程任务。