本文共 3914 字,大约阅读时间需要 13 分钟。
装饰器、迭代器、生成器以及内置函数
装饰器是用来装饰函数的一种高级工具,它能够在不改变函数本身的情况下,为函数增加新的功能。装饰器的核心思想是通过在函数调用前后执行特定的代码来扩展函数的行为,而不会改变函数的原始功能和使用方式。例如,通过装饰器可以在函数执行前后记录日志,执行时间统计,或者在函数返回前处理结果等。
迭代器是能够通过for循环取值的对象。任何可以通过for循环遍历的对象都是可迭代的。可迭代对象的核心特征是包含__iter__()方法。迭代器协议是指对象需要实现__iter__()和__next__()方法。迭代器的使用非常高效,特别是在处理大量数据时,迭代器可以避免一次性加载所有数据到内存中,从而节省内存。
生成器是通过函数中包含yield关键字来创建的特殊函数。生成器的特点是惰性运算,即生成器不会在被调用之前就执行函数内部的代码。只有当外部程序使用next()方法或者其他迭代方法时,生成器才会逐步执行内部的代码,并返回相应的值。生成器的主要优点是节省内存,并且在处理大量数据时比普通列表更高效。
内置函数是Python提供的预定义函数,它们为程序员提供了便捷的操作方式。常见的内置函数包括print、len、max、min、range等。这些函数能够简化代码编写,提高程序的效率和可读性。例如,print函数用于输出文本,len函数用于获取对象的长度,range函数用于生成序列等。
以下是对装饰器、迭代器和生成器的详细解释:
示例:
import timedef wrapper(func): def inner(): start = time.time() func() end = time.time() print('执行效率为:', end - start) return inner return inner@wrapperdef func(): print('这是一个函数') time.sleep(0.3)func() - 迭代器迭代器是能够通过for循环遍历的对象。迭代器的核心方法是__iter__(),它返回一个迭代器对象。迭代器协议则包括__next__()和__stop__()方法。迭代器的优势在于它能够按需加载数据,节省内存。
- 生成器生成器是通过函数中包含yield关键字创建的特殊函数。生成器的特点是惰性运算,它不会在被调用之前就执行函数内部的代码。生成器可以用next()方法逐步获取生成的值。
- 生成器的高级用法生成器支持向函数中传递值,这可以通过send()方法实现。第一次调用生成器时,必须使用next()激活它。生成器的yield语句可以返回一个值,并且可以通过send()方法向生成器函数中传递参数。
- yield fromyield from用于在生成器中返回一个嵌套迭代结构的值。它允许生成器直接将嵌套迭代器的值逐一返回,无需显式地使用for循环。
迭代器和生成器的区别迭代器是可迭代的对象,而生成器是特殊的迭代器。生成器内部必须有yield关键字,它能够通过yield关键字控制迭代的过程。
内置函数内置函数是Python中预定义的函数,它们为程序员提供了便捷的操作方式。常用的内置函数包括:
- print:用于输出文本
- len:用于获取对象的长度
- max和min:用于获取最大值和最小值
- range:用于生成序列
- list、tuple、dict:用于创建列表、元组和字典
- filter:用于过滤数据
- map:用于映射函数
- sorted和sorted:用于排序数据
- chr、ord:用于转换字符和ASCII代码
- eval和exec:用于执行字符串代码
- 递归递归是函数调用自身的方式。递归在某些情况下非常有用,例如在处理树状结构或递归关系时。但递归也容易导致栈溢出,因此需要有一个停止条件。
- 二分查找二分查找是一种高效的查找算法,适用于有序数组。它通过不断缩小查找范围来找到目标值。
- 匿名函数和lambda表达式匿名函数是指没有名字的函数,可以通过lambda表达式来定义。lambda表达式简单易用,适合执行单一操作。
- 迭代器和生成器的优化在实际应用中,迭代器和生成器可以显著优化性能。生成器特别适合处理大量数据,因为它按需加载数据,节省内存。
- 输入处理生成器可以用来处理输入流。以下是一个监听文件输入的生成器示例:
- 内置函数的高级用法内置函数可以通过参数进行定制化操作。例如,可以使用key参数对数据进行排序。
- 追踪内置函数调用调用内置函数时,可以通过dir()函数查看函数的属性和方法。例如,可以查看print函数的所有属性:
- 递归的优化递归函数在处理深层嵌套时容易导致栈溢出。可以通过将递归转换为迭代来避免这个问题。
- 进阶需求在实际项目中,装饰器和生成器可以应用在多个场景中。以下是一些常见场景:
- 情况一:设计装饰器,确认是否生效
- 情况二:登陆,记录日志
- 情况三:处理文件输入
- 情况四:生成器函数
- 情况五:迭代器协议
- 情况六:生成器的高级用法
示例:
l = [1, 2, 3]ll = iter(l)for num in ll: print(num)
示例:
def generator_func(): for i in range(5): yield i for j in 'hello': yield jg = generator_func()for i in g: print(i)
示例:
def generator_func(): print('****') yield 1 print('^^^^') yield 2g = generator_func()ret = next(g)print(ret)g.send('alex')print(g.send('lxf')) 示例:
def generator_func(): yield from range(5) yield from 'hello'g = generator_func()for i in g: print(i)
示例:
def recursive_func(n): if n == 0: return print(n) recursive_func(n - 1)recursive_func(5)
示例:
def binary_search(l, num): print(l) if len(l) == 0: print('not has num') return mid_index = len(l) // 2 if num > l[mid_index]: return binary_search(l[mid_index + 1:], num) elif num < l[mid_index]: return binary_search(l[:mid_index], num) else: print('find it') return l[mid_index] l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]binary_search(l, 7) 示例:
add = lambda a, b: a + bprint(add(1, 2))
示例:
import sysfrom itertools import islicedef large_file_iter(): for line in sys.stdin: yield line.strip()iterator = iter(large_file_iter())for line in iterator: print(line)
def lister_file(): with open('userinfo') as f: while True: line = f.readline() if line.strip(): yield line.strip() time.sleep(0.3)g = lister_file()for i in g: print(i) 示例:
l = [[1, 2], [3, 4], [5, 6]]sorted_l = sorted(l, key=lambda x: x[0])print(sorted_l)
print(dir(print))
示例:
def fib_iterative(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b return aprint(fib_iterative(10))
通过实际项目的实践,熟悉这些概念的应用场景和使用方法,将有助于提升编程能力。
发表评论
最新留言
关于作者