当前位置: 首页 > news >正文

Python 装饰器 - 推导式(列表推导式) - 迭代器 - 生成器 - 闭包

目录

推导式

1、列表推导式(用得最多的)

给你一个列表,求所有数据的绝对值

列表推导式跟if运算

打印50以内能被3整除的数的平方(filter)(if的使用)

找到1000以内开平方的结果是整数的数(if的使用)

打印50以内如果被2整除的数的平方,否则打印自己(map)(if和else的使用)

打印名字中包含g的数据(双重for循环)

将二维数组转一维数据(双重for循环)

二维转一维,将名字包含g的数据直接输出,不包含g的数据转大写输出

2、集合推导式(在列表推导式的基础上去重) => set

3、字典推导式 => dict

构建一个字典: {'a':1,"b":2,"c":3,"d":4........."z":26}

迭代器

可迭代对象: 实现了__iter__方法,并且该方法返回一个迭代器

可以使用dir查看是否实现了__iter__方法,即可判断是否为可迭代对象

迭代器

判断是否为迭代器,或者是可迭代对象

可迭代对象 和 迭代器的区别:

迭代器实现列表内数据的平方

map函数使用了惰性求值的特点(map就是迭代器)

实现一个迭代器(类似range函数的迭代器=>返回0到num的数据)

实现一个可以无限生成的斐波拉契数列的迭代器

生成器:

生成器表达式:(返回的数据 for 临时变量 in 可迭代对象)

生成器函数:如果一个函数中包含了yield关键字,它是一个生成器函数

使用生成器函数 --》 创建了一个生成器:g (g = func_g())

用生成器函数实现,传递给函数一下列表,返回列表中每个元素的平方

生成器yield 和 yield from返回数据的区别

闭包:

什么是闭包?

闭包形成的条件

闭包的特点

闭包函数

装饰器:

例子:希望获取每一个函数运行时候的耗时

用装饰器来实现给函数添加记录运行时间的功能(runtime装饰器)

实现加记日志的功能:如函数XXX被调用了(log装饰器)

一个函数可以使用多个装饰器(多重装饰器)

模块化拆分装饰器:

创建 utils.py 文件,将我们的runtime和log装饰器写入文件中:

然后我们在父文件中调用 utils.py 文件中的装饰器

装饰器可以装饰普通的函数、也可以用来装饰类

作业:


推导式

# 列表推导式(用得最多的)

# 字典推导式

# 集合推导式

1、列表推导式(用得最多的)

li1 = [1,2,3,4]
# [返回值 for 临时变量 in 可迭代对象]
result = [x*x for x in li1]
print(type(result), result)# map和列表推导式都可以做到
# map => map object
# 列表推导式 => list输出:
<class 'list'> [1, 4, 9, 16]

给你一个列表,求所有数据的绝对值

# 给你一个列表,求所有数据的绝对值
li2 = [1,2 ,-1, 4, 6, -4]
result = [abs(x) for x in li2 ]
print(result)输出:
[1, 2, 1, 4, 6, 4]

列表推导式跟if运算

打印50以内能被3整除的数的平方(filter)(if的使用)

result = [x**2 for x in range(1,50) if x%3 == 0]
print(result)

找到1000以内开平方的结果是整数的数(if的使用)

result = [x for x in range(1,1000) if x**0.5%1==0 ]
print(result)

打印50以内如果被2整除的数的平方,否则打印自己(map)(if和else的使用)

result = [x**2 if x%2 == 0 else x for x in range(1,50) ]
print(result)

打印名字中包含g的数据(双重for循环)

names = [['asdf', 'ag'],['abg', 'abc'],
]
result = [name for lst in names for name in lst if 'g' in name]
print(result)

将二维数组转一维数据(双重for循环)

li = [[1,2,3,4],[5,6,7,8]]
result = [x for lst in li for x in lst]
print(result)相当于:
# result = []
# for lst in li:
#     for x in lst:
#         result.append(x)

二维转一维,将名字包含g的数据直接输出,不包含g的数据转大写输出

names = [['asdf', 'ag'],['abg', 'abc'],
]
result = [name if 'g' in name else name.upper() for lst in names for name in lst]
print(result)与下面意思的一样:
result = []
for lst in names:for name in lst:if 'g' in name:result.append(name)else:result.append(name.upper())
print(result)输出:
['ASDF', 'ag', 'abg', 'ABC']

2、集合推导式(在列表推导式的基础上去重) => set

lst = [-1, 1, -4, 2, 4]
# 求数据的绝对值,去重
result = {abs(x) for x in lst}
print(result)# for 临时变量 in 可迭代数据

3、字典推导式 => dict

d1 = {"a":2, "b":1}
# 将key转化为大小
# {key:value for 临时数据 in 可迭代对象}
result = {key.upper():value for key,value in d1.items()}
print(result)输出:
{'A': 2, 'B': 1}

构建一个字典: {'a':1,"b":2,"c":3,"d":4........."z":26}

# 构建一个字典: {'a':1,"b":2,"c":3,"d":4........."z":26}
# ord => 字母转ASCII    chr(ord('a')+i)
# chr => ASCII转字母    chr(97) => 'a'result = {chr(97+i):i+1 for i in range(26)}
print(result)输出:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26}

迭代器

迭代器(Iterator)是Python中的一种对象,它用于实现迭代(遍历)的机制,允许你逐个访问集合中的元素,而无需提前加载所有元素到内存中。迭代器提供了一种延迟获取数据的方式,这对于处理大量数据或需要逐步处理数据的情况非常有用。

迭代器需要实现两个方法:

  1. __iter__():返回迭代器对象自身。通常该方法返回self

  2. __next__():返回集合中的下一个元素。如果没有元素可返回,则引发StopIteration异常,表示迭代已经结束。

迭代器的特点:

惰性求值:需要用到数据的时候,再去计算结果(不会一次性占用很多的内存空间和cpu,十分的高效)

可迭代对象: 实现了__iter__方法,并且该方法返回一个迭代器

可迭代对象(Iterable)是指可以被迭代(遍历)的对象。它们通常用于循环结构,比如for循环。可迭代对象可以包含多个元素,每次迭代都返回其中的一个元素,直到所有元素都被访问完为止。

可以使用dir查看是否实现了__iter__方法,即可判断是否为可迭代对象

print(dir(1))
print(dir(list))
# for i in 1:
#     pass
# 报错:'int' object is not iterable   表示 int 类型是不可迭代对象 # 常见的可迭代对象:
# set, tuple, dict, str, bool

迭代器

str1 = "abc"
# 迭代器
# 获得一个迭代器
# 迭代器实现了__iter__(返回自己)和__next__(返回下一个数据)方法
str1_iter = str1.__iter__()
print(type(str1_iter), str1_iter)
print(str1_iter.__next__())
print(str1_iter.__next__()) 
print(next(str1_iter))            # 跟str1_iter.__next__()效果一样,只是写法不一样
# 当没有数据了的时候,会引发StopIteration错误
# print(str1_iter.__next__())# 当使用for去循环的时候,会调用对象的__iter__方法获得一个迭代器
# 每次循环,都是获取迭代器的__next__方法
# 如果遇到StopIteration错误,循环结束
# 等同于:for i in str1:输出:
<class 'str_iterator'> <str_iterator object at 0x000002B1DFDA5DE0>
a
b
c报错:
Traceback (most recent call last):File "D:\衡山-开发\python\pythonProject_day01\test.py", line 11, in <module>print(str1_iter.__next__())
StopIteration

判断是否为迭代器,或者是可迭代对象

from collections.abc import Iterator,Iterable
print(isinstance(str1_iter, Iterator))#collections.abc模块的使用输出:
True / False

可迭代对象 和 迭代器的区别:

可迭代对象:print => 直接打印所有的数据

迭代器:print打印对象本身,无数据 => 对象.__next__ 或next(对象)

可迭代对象=> 存10w个数据 => 占用很多内存

迭代器  => 惰性求值(next调用的时候,才会去计算数据)(可用于数据量比较大的时候)

             => 不会一次占用很多的内存和CPU资源

迭代器实现了__iter__(返回自己)和__next__(返回下一个数据)方法

如果只实现了__iter__方法,那么它只能是可迭代对象

迭代器实现列表内数据的平方

map函数使用了惰性求值的特点(map就是迭代器)

li = [1,2,3,4,5]
result = map(lambda x:x*x,li)
print(type(result), dir(result))
# result => map => 迭代器
print(result.__next__())
print(next(result))

实现一个迭代器(类似range函数的迭代器=>返回0到num的数据)

class MyRange():def __init__(self,num):self._start = -1self.num = num# 返回它自己def __iter__(self):return self# 返回def __next__(self):self._start += 1if self._start < self.num:return self._startelse:raise StopIteration  #如果我们需要停止迭代器,直接raise StopIteration
for item in MyRange(10):print(item)

如果我们需要停止迭代器,直接raise StopIteration

实现一个可以无限生成的斐波拉契数列的迭代器

#0, 1,1,2,3,5,8,13....

class Fib(object):def __init__(self):self.cur = 0self.next = 1def __iter__(self):return selfdef __next__(self):self.cur,self.next = self.next,self.cur+self.nextreturn self.cur
for i in Fib():if i>=100:breakprint(i,end=' ')

生成器:

"生成器"(Generator)通常指的是一种能够逐步产生数据、内容或事件序列的程序或模型。

生成器通常是指一种特殊类型的函数,它可以逐步产生数据流,而不是一次性生成所有数据并将其存储在内存中。这在处理大量数据或需要逐步生成结果的情况下非常有用,因为它可以减少内存占用。在Python中,生成器函数使用关键字yield来逐步生成值。 

特殊的迭代器:不需要自己编写__iter__和__next__ 方法

生成器特点与迭代器一样。

数量大,不需要立刻计算出结果,而是需要的时候再计算。

生成器表达式:(返回的数据 for 临时变量 in 可迭代对象)

li1 = [1,2,3,4]
# (返回值 for 临时变量 in 可迭代对象)
result = (x*x for x in li1)
print(type(result), dir(result))
print(next(result))
print(next(result))
print(next(result))
print(next(result))

生成器函数:如果一个函数中包含了yield关键字,它是一个生成器函数

def func_g():print("start")yield 1print("No1")yield 2print("No2")yield 3

使用生成器函数 --》 创建了一个生成器:g (g = func_g())

迭代器\生成器 中能保存一些状态的。迭代器\生成器 中的数据只能取一次。

g = func_g()
print(g, type(g), dir(g))
result = next(g)   # 执行函数代码, 遇到yield 返回yield后面的数据,停止执行
print(result)
result = next(g)   # 接着之前的代码继续执行
print(result)
result = next(g)   # 接着之前的代码继续执行
print(result)输出:
<generator object func_g at 0x00000274E4845E70> <class 'generator'> ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']start
1
No1
2
No2
3

用生成器函数实现,传递给函数一下列表,返回列表中每个元素的平方

li1 = [1,2,3,4]
# func_g2(li1)
def func_g1(li):for item in li:yield item*item
g = func_g1(li1)
for i in g:print(i)输出:
1
4
9
16

生成器yield 和 yield from返回数据的区别

yield 返回的数据

yield from 迭代器

def func_g3():yield range(10)g3 = func_g3()
print(next(g3))def func_g4():yield from range(10)
g4 = func_g4()
print(next(g4))
print(next(g4))
print(next(g4))输出:
range(0, 10)
0
1
2

闭包:

什么是闭包?

闭包是在函数内部定义的函数,它可以访问其外部函数的变量,即使外部函数已经执行完毕并且其作用域不再存在。这种机制允许变量的状态在函数调用之间得以保留。

闭包形成的条件

# 1. 必须有内外函数(函数中嵌套函数)

# 2. 外部函数必须返回内部函数

# 3. 内部函数要使用外部函数的变量

闭包的特点

变量不会随着外部变量执行完成而释放,数据会被保存下来。(有状态的)

闭包函数

def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
result = closure(5)  # result 等于 15

在这个例子中,outer_function 返回了一个内部函数 inner_function,内部函数引用了外部函数的参数 x。即使 outer_function 执行完毕后,我们仍然可以通过调用 closure(5) 来使用内部函数,这是因为闭包捕获了 x 的值。

装饰器:

装饰器:一种设计模式。

       如果需要给函数或类添加一个功能,但不改变原来的调用方式,同时又不希望修改源代码或类的继承实现。

装饰器允许您在不修改原始函数代码的情况下,通过添加额外的行为来扩展或修改函数的行为。

例子:希望获取每一个函数运行时候的耗时

import time# 希望获取每一个函数运行时候的耗时
def func1():print("this is func1")time.sleep(1)def func2():print("this is func2")time.sleep(2)def func3():print("this is func3")time.sleep(3)start = time.time()
func1()
print("func1 cost:", time.time()-start)start = time.time()
func2()
print("func2 cost:", time.time()-start)start = time.time()
func3()
print("func3 cost:", time.time()-start)输出:
this is func1
func1 cost: 1.0075395107269287
this is func2
func2 cost: 2.010779619216919
this is func3
func3 cost: 3.002288579940796

以上缺点:存在重复代码

用装饰器来实现给函数添加记录运行时间的功能(runtime装饰器)

import time# 希望获取每一个函数运行时候的耗时
# 装饰器接收的是一个函数, 返回值也需要是一个函数(才能保证调用方式不变)
def rumtime(func):# func --> 被装饰的函数# 因为被装饰的函数可能带参数也可能不带参数,因此这里使用可变长参数# 目的是让代码更加灵活def inner(*args, **kwargs):start = time.time()result = func(*args, **kwargs)print(f"函数运行时间为:{time.time() - start}")return result# 返回值需要是一个函数return inner# 在被装饰的对象上方加@装饰器名
@rumtime
def func1():print("this is func1")time.sleep(1)
# 当使用@runtime装饰func1时,相当于执行了:
# func1 = runtime(func1)  => 内部runtime.inner函数
# 装饰器就相当于被装饰的函数func1()放到runtime()函数里面去了,运行完后,runtime装饰器会再返回一个函数放到func1()函数中去@rumtime
def func2():print("this is func2")time.sleep(2)
# func2 = runtime(func2)
# 新函数:记录运行时间,其中的函数功能 =>runtime.inner函数的功能@rumtime
def func3():print("this is func3")time.sleep(3)func1()
func2()
func3()输出:
this is func1
函数运行时间为:1.0070466995239258
this is func2
函数运行时间为:2.004884958267212
this is func3
函数运行时间为:3.0066428184509277

实现加记日志的功能:如函数XXX被调用了(log装饰器)

log  => 实现日志功能的装饰器

import time# 希望获取每一个函数运行时候的耗时
# 装饰器接收的是一个函数, 返回值也需要是一个函数(才能保证调用方式不变)
def rumtime(func):def inner(*args, **kwargs):start = time.time()result =func(*args, **kwargs)print(f"函数运行时间为:{time.time() - start}")return resultreturn innerdef log(func):def inner(*args, **kwargs):print(f"{func.__name__}函数被执行了...")result =func(*args, **kwargs)return resultreturn inner# 在被装饰的对象上方加@装饰器名
@rumtime
def func1():print("this is func1")time.sleep(1)
# 当使用@runtime装饰func1时,相当于执行了:
# func1 = runtime(func1)  => 内部runtime.inner函数@log
def func2():print("this is func2")time.sleep(2)#调用装饰器
@log
def func3():print("this is func3")time.sleep(3)func1()
func2()
func3()输出:
this is func1
函数运行时间为:1.0148968696594238
func2函数被执行了...
this is func2
func3函数被执行了...
this is func3

一个函数可以使用多个装饰器(多重装饰器)

实现的效果:

func3 =》 log(runtime(func3)) =》 log(runtime.inner)

因此当我们使用如下多个装饰器的时候log装饰器其实调用的函数是runtime内返回的inner函数,因此log装饰器上显示的函数名就是inner函数啦

# 双重装饰器
@log
@rumtime
def func3():print("this is func3")time.sleep(3)输出:
inner函数被执行了...
this is func3
函数运行时间为:3.0028884410858154

因此如果我们想要我们的log能调用到真正的func3函数,我们需要对runtime装饰器进行修改

import time
import functools# 希望获取每一个函数运行时候的耗时
# 装饰器接收的是一个函数, 返回值也需要是一个函数(才能保证调用方式不变)
def rumtime(func):# functools.wraps(func)装饰器的功能是将func的原数据复制到inner上,其中就包括了函数名@functools.wraps(func)def inner(*args, **kwargs):start = time.time()result =func(*args, **kwargs)print(f"函数运行时间为:{time.time() - start}")return resultreturn innerdef log(func):@functools.wraps(func)def inner(*args, **kwargs):print(f"{func.__name__}函数被执行了...")result =func(*args, **kwargs)return resultreturn inner# 在被装饰的对象上方加@装饰器名
@rumtime
def func1():print("this is func1")time.sleep(1)
# 当使用@runtime装饰func1时,相当于执行了:
# func1 = runtime(func1)  => 内部runtime.inner函数@log
def func2():print("this is func2")time.sleep(2)# 多重装饰器
@log
@rumtime
def func3():print("this is func3")time.sleep(3)func1()
func2()
func3()输出:
this is func1
函数运行时间为:1.0131046772003174
func2函数被执行了...
this is func2
func3函数被执行了...
this is func3
函数运行时间为:3.0059847831726074

如上所示,我们添加了functools包,并在runtime和log装饰器里面调用了它,如@functools.wraps(func),它能将func的原数据复制到inner上,其中就包括了函数名

模块化拆分装饰器:

创建 utils.py 文件,将我们的runtime和log装饰器写入文件中:

import time
import functools
# 装饰器接收的是一个函数,返回值也需要是一个函数(才能保证调用方式不变)
# 用闭包实现了一个装饰器
def runtime(func):# print("runtime-this is :",func)# func => 被装饰的函数# 因为被装饰的函数可能带参数也可能不带参数,因此这里使用可变长参数# 让代码更加灵活# functools.wraps:将func函数的元数据复制到inner (函数名)@functools.wraps(func)def inner(*args, **kwargs):start = time.time()result = func(*args, **kwargs)print(f"函数执行花了:{time.time()-start}s")return result# 返回值需要是一个函数return inner# import logging
from inspect import isfunction
def log(func):# print("log-this is :",func)# func => 被装饰的函数# 因为被装饰的函数可能带参数也可能不带参数,因此这里使用可变长参数# 让代码更加灵活@functools.wraps(func)def inner(*args, **kwargs):# logging.log()# isfunction可以用来判断func是否为函数,输出Ture或者Falseif isfunction(func):print(f"{func.__name__}函数被执行了...")else:print(f"{func.__name__}创建了一个实例...")result = func(*args, **kwargs)return result# 返回值需要是一个函数return inner

然后我们在父文件中调用 utils.py 文件中的装饰器

from utils import log, runtime

装饰器可以装饰普通的函数、也可以用来装饰类

@log
class A():@logdef count(self):pass# log装饰器内可以判断它调用的到底是类还是函数
a = A()
a.count()输出:
A函数被执行了...
count函数被执行了...

作业:

# 实现一个装饰器,login_required

# 如果需要调用被装饰的函数,你需要已经登录了

# @login_required

# def index():pass

# 1. 全局变量:user = None => 未登录:打印“请先登录再访问”,不调用index

#               not None =>  已经登录:调用index

# 2. 将用户数据保存到文件,从文件中读取用户信息。

相关文章:

Python 装饰器 - 推导式(列表推导式) - 迭代器 - 生成器 - 闭包

目录 推导式 1、列表推导式&#xff08;用得最多的&#xff09; 给你一个列表&#xff0c;求所有数据的绝对值 列表推导式跟if运算 打印50以内能被3整除的数的平方&#xff08;filter&#xff09;&#xff08;if的使用&#xff09; 找到1000以内开平方的结果是整数的数&am…...

【大数据】Flink 详解(二):核心篇 Ⅲ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制&#xff1f; Flink 使用 轻量级分布式快照&#xff0c;设计检查点&#xff08;checkpoint&#xff09;实现可靠容错。 30、什么是 Checkpoin 检查点&#xff1f; Checkpoint …...

Jmeter性能测试系列-性能测试需求分析

性能测试需求分析 性能测试需求分析与传统的功能测试需求有所不同&#xff0c;功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性&#xff0c;性能测试则需要从终端用户应用、系统架构设计、硬件配置等多个纬度分析系统可能存在性能瓶颈的业务。 性…...

Syncfusion Essential Studio JavaScrip Crack

Syncfusion Essential Studio JavaScrip Crack 数据透视表 添加了在将数据透视表导出到PDF文档时自定义列宽的支持。 签名 添加了对在特定位置绘制文本的支持。 Syncfusion Essential Studio for JavaScript在一个包中包含80多个高性能、轻量级、模块化和响应式UI组件。包括Jav…...

8.13黄金是否进入下行通道?下周开盘如何布局

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(8月11日)现货黄金小幅收低&#xff0c;受累于美元走强和美国国债收益率上升&#xff0c;本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…...

Idea的基本使用带案例---详细易懂

一.idea是什么 有专业人士说&#xff0c;idea是天生适合做微软&#xff0c;当时我还想肯定是夸大其词了&#xff0c;但当你用起来的时候确实很爽&#xff0c;&#x1f60a;&#x1f60a; ntelliJ IDEA是一种集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains开发…...

MySQL中的用户管理

系列文章目录 MySQL常见的几种约束 MySQL中的函数 MySQL中的事务 MySQL中的视图 MySQL中的索引 文章目录 系列文章目录前言一、用户管理1、用户管理入门2、用户管理操作及示例 二、权限管理1.权限管理语法2.权限操作示例 三、角色管理1、角色管理入门2、角色操作示例 总结…...

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作&#xff0c;最常用的就是创建、删除、暂停和恢复任务。 此次实验目标&#xff1a; 1.创建任务一&#xff1a;LED1每间隔1秒闪烁一次&#xff0c;并通过串口打印 2.创建任务二&#xff1a;LED2每间隔0.5秒闪烁一次&#xff0c;并通过串口打印 3.创建任…...

c# .net mvc的IHttpHandler奇妙之旅--图片文件请求安全过滤,图片防盗链

源码下载: c# .net mvc图片文件请求安全过滤,图片防盗链 https://download.csdn.net/download/cplvfx/88206428 在阅读该文章前,请先阅读该文章 c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全…...

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座&#xff0c;实现播放MP3播放器&#xff01; 看过很多STM32软解MP3的方案&#xff0c;即不通过类似VS1053之类的解码器芯片&#xff0c;直接用STM32和软件库解码MP3文件&#xff0c;通常使用了labmad或者Helix解码库实现&#xff0c;Helix相对labm…...

STM32 CAN 过滤器设置

做个笔记吧 &#xff0c;免得以后忘记了 芯片是stm32F207 &#xff0c;用cubeMX 6.80 版本生成 CAN 的使用总体包含4个部分 第一步&#xff1a;CAN初始化&#xff0c;配置波特率 (cubeMX 里面配置好后自动生成&#xff0c;不需要手动添加) MX_CAN1_Init(); 第二步&#…...

日常BUG—— maven编译报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 一个maven项目在由于在代码中书写了如下代码&#xff1a; public static ConcurrentMap<…...

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可…...

学习Vue:插值表达式和指令

在 Vue.js 中&#xff0c;Vue 实例与数据绑定是构建动态交互界面的关键。在这篇文章中&#xff0c;我们将重点介绍 Vue 实例中两种实现数据绑定的方式&#xff1a;插值表达式和指令。这些机制允许您将数据无缝地渲染到界面上&#xff0c;实现实时的数据更新和展示。 插值表达式…...

echart 3d立体颜色渐变柱状图

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 根据业务需求将不同的法律法规&#xff0c;展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色&#xff0c;这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…...

linux shell变量

linux shell变量 1、变量命名规则2、只读变量3、删除变量 1、变量命名规则 变量名不能加$命名只能使用英文字母、数字和下划线&#xff0c;首个字母不能以数字开头中间不能有空格。可以有下划线不能使用标点符号不能使用bash中的关键字 username"tom"引用 $userna…...

Linux 发行版 Debian 12.1 发布

在今年 6 月初&#xff0c;Debian 12“bookworm”发布&#xff0c;而日前 Debian 迎来了 12.1 版本&#xff0c;主要修复系统用户创建等多个安全问题。 Debian 是最古老的 GNU / Linux 发行版之一&#xff0c;也是许多其他基于 Linux 的操作系统的基础&#xff0c;包括 Ubuntu…...

【Rust】Rust学习 第七章使用包、Crate和模块管理不断增长的项目

目前为止&#xff0c;我们编写的程序都在一个文件的一个模块中。伴随着项目的增长&#xff0c;你可以通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长&#xff0c;你可以将包中的部分代码提取出来&…...

网站SSL安全证书是什么及其重要性

网站SSL安全证书具体来说是一个数字文件&#xff0c;是由受信任的数字证书颁发机构&#xff08;CA机构&#xff09;进行审核颁发的&#xff0c;其中包含CA发布的信息&#xff0c;该信息表明该网站已使用加密连接进行了安全保护。 网站SSL安全证书也被称为SSL证书、https证书和…...

Android Alarm闹钟API使用心得

前言 有什么办法可以在不打开App的时候&#xff0c;也能够触发一些操作呢&#xff1f;比如说发送通知&#xff0c;解决这个需求的办法有很多种选择&#xff0c;比如说官方推荐的WorkManager API&#xff0c;可以在后台执行一次性、耗时、定时的任务&#xff0c;但WorkManager是…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...