Python中的一些高级函数和话题-1

与其他高级、面向对象的编程语言(如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开发人员,您必须了解这些概念。这些不仅会使你成为一名优秀的程序员和开发人员,而且还会提高代码的可读性,使其更快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值