与其他高级、面向对象的编程语言(如Java或C++)相比,学习Python很容易,但它有一些高级概念,在开发健壮、清晰、高度优化、高效和规范化的代码时,这些概念很有用。在代码中使用这些概念,您将能够减少代码中的bug,并提高其效率,从而使您成为经验丰富的Python程序员。因此,让我们逐一了解这些概念,并详细了解它们!
1.Map函数
Python有一个名为map()的内置函数,它允许我们处理一个可迭代文件中的所有元素,而无需显式使用循环构造。使用时,它返回一个map对象,该对象又是一个迭代器。这个map对象是通过将指定的函数应用于iterable中的每个项而获得的结果。
举例说明:
定义 – required_answer = map(function, iterable)
def square(a):
return a**2
map(square, [1,2,3,4,5]
或list(map(lamda x:x**2, [1,2,3,4,5]))
结果:
[1,4,9,16,25]
当然现在我们可以用 [x**2 for x in range(1,6)]这种简单的语法来替代
2. Lambda匿名函数
Python的lambda函数是小型匿名函数,因为它们没有名称,并且包含在一行代码中。关键字“def”用于定义Python中的函数,但lambda函数是由关键字“lambda”定义的。它们可以接受任意数量的参数,但表达式的数量只能是一个。对于简单的逻辑操作,它使代码简洁易读,并且在只需要使用一次函数时最好使用。
具体定义为
lamda arguments: expressions
如上map中的square方法
3. Decorators装饰器
装饰器是Python元编程的一部分,用于向现有代码添加附加功能,而不会在编译时更改原始结构。它更像是Python中可以调用并返回可调用的常规函数。它接受一个函数,通过添加功能来修改它,然后返回它。
代参数的装饰器典型的写法
@decorator
def func():
pass
实际上相当于 decorator(func),实际上将函数名传入
def decorator1(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@decorator1
def hest():
print('heeelo')
hest()
import functools
# 装饰器
def wrapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner
@wrapper
hest()
强大的修饰器:
@lru_cache
此装饰器可用于使用缓存加速函数的连续运行。当然,这应该在使用时记住一些关于缓存的注意事项,但在通用使用情况下,大多数时候这个装饰器是值得使用的。
我以前有个项目,作音频文件作为训练数据,由于dataloader加载的时候每次都需要进行librosa的频谱提取,这个速度是在是太慢了。这个lrc_catche可以大大提高数据的效率。
@jit
JIT 是即时编译(Just In Time)的缩写。通常每当我们在 Python 中运行一些代码时,发生的第一件事就是编译。这种编译会产生一些开销,因为类型被分配了内存,并存储为未分配但已命名的别名。使用即时编译,我们在执行时才进行编译。与@lru_cache 类似,可以非常轻松地调用此装饰器,并立即提高代码的性能。Numba 包提供了 jit 装饰器,它使运行更密集的软件变得更加容易,而不必进入 C
@count_calls
count_calls 装饰器可用于提供有关函数在软件中使用多少次的信息。
@dataclass
从python3.7开始,为了节省编写类的时间,@dataclass 装饰器来初始化变量,以前
class MyClass: def __init__(self, var_a, var_b): self.var_a = var_a self.var_b = var_b
现在dataclass 可以为简单的情况自动生成方法,例如,一个__init__接受这些参数并将其分配给自己,之前的小例子可以重写为:
@dataclass class MyClass: var_a: str var_b: str
@singleton
为了理解单例装饰器的用途,我们首先需要了解单例(singleton)是什么。从某种意义上说,单例是全局变量类型的一个版本。
4. 集合Collections
Python中的Collections是通用的内置容器,如集合、元组、字典和列表。Python集合是一个实现专用容器数据类型的模块。集合包括namedtuple(),它是一个用于创建具有命名字段的元组子类的函数;OrderedDict是一个dict子类,它记住由于Python dict没有排序而添加的顺序项;Counter用于计算可散列对象;ChainMap用于创建多个映射的单个视图,等等。
"""
常用方法
namedtuple() : 创建一个命名元组子类的工厂函数
deque : 高效增删改双向列表,类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
defaultdict : 当字典查询时,为key不存在提供一个默认值。
OrderedDict : 有序词典,就是记住了插入顺序
Counter : 计数功能
"""
import collections
point = collections.namedtuple('Points', ['x', 'y'])
p1 = point(2, 3)
p2 = point(4, 2)
print(p1) # Points(x=2, y=3)
print(p2) # Points(x=4, y=2)
print(isinstance(p1, point)) # 属Points类型
print(isinstance(p1, tuple)) # 也属于tuple
from collections import deque # 双端列队
q = deque(['a', 'b', 'c'], maxlen=10)
q.append('d')# 从右边添加一个元素
print(q) # deque(['a', 'b', 'c', 'd'], maxlen=10)
print(q.popleft()) # a
print(q) # deque(['b', 'c', 'd'], maxlen=10)
q.extend(['i', 'j'])
print(q) # deque(['b', 'c', 'd', 'i', 'j'], maxlen=10)
print(q.index('c')) # 下标
q.reverse()
print(q)# deque(['j', 'i', 'c', 'b'], maxlen=10)
q.appendleft('aa') # add to left
print(q) #deque(['aa', 'j', 'i', 'd', 'c', 'b'], maxlen=10)
默认字典
defaultdict就是默认字典
from collections import defaultdict
#比如统计一个字频的程序,假设文本没有标点,
result = defaultdict(int) #默认只要
with open('test.py') as f:
for line in f:
for word in line.split():
result[word] += 1 # 创建word result[word] = 0
for k, v in result.items():
print(k, v)
5. 生成器
Python中的生成器是一种特殊类型的函数,它不是返回单个值,而是返回一个迭代器对象,它是一系列值。它是一个创建自己的迭代器函数的实用程序。生成器函数中使用关键字yield,而不是return关键字,后者会暂停其执行。yield和return的区别在于return终止函数,但yield只暂停函数的执行,每次都返回函数的值。
def generator():
print("starting")
for i in range(10):
yield i
print("continue")
num = generator()
print(type(num)) # <class 'generator'>
for n in num:
print(n)
print(range(10))
num = generator()
print(next(num)) # 0
print(next(num)) # 1
print(next(num)) # 2
同样的,我们用简单的方式也可作生成器(i for i in range(10)) (当然range(10)本身就是生成器)
元组生成式可以作为生成器,那么列表生成器是吗?答案是否定的。
6。 正则表达式
Python正则表达式或RegEx是包含特定字符作为要匹配的模式的表达式。它用于检查一个字符串或一组字符串是否包含特定模式。它非常强大、优雅、简洁,而且速度快。要使用Python的正则表达式,需要导入re模块,其中包含有助于模式匹配的函数,如findall()、search()、split(), sub()等。
6.1 如何提取字符串
6.2 贪婪匹配和非贪婪匹配
6.3 正则中的变量
7. threading 线程, multiprocessing
线程是操作系统可以调度的最小单元或进程。Python包含Thread类,它有助于多线程编程。多线程主要用于在很大程度上加快计算速度,因为现在将有多个线程执行任务。要在Python中实现线程,您需要使用threading模块。
multiprocessing 多元的处理进程的模块(windows下进程开销比较大,不建议使用)
比如配合queue来实现一个生产者消费者的程序
这些是最高级的Python概念,要想成为一名有经验的Pythin开发人员,您必须了解这些概念。这些不仅会使你成为一名优秀的程序员和开发人员,而且还会提高代码的可读性,使其更快。