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中的一种对象,它用于实现迭代(遍历)的机制,允许你逐个访问集合中的元素,而无需提前加载所有元素到内存中。迭代器提供了一种延迟获取数据的方式,这对于处理大量数据或需要逐步处理数据的情况非常有用。
迭代器需要实现两个方法:
__iter__()
:返回迭代器对象自身。通常该方法返回self
。
__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、列表推导式(用得最多的) 给你一个列表,求所有数据的绝对值 列表推导式跟if运算 打印50以内能被3整除的数的平方(filter)(if的使用) 找到1000以内开平方的结果是整数的数&am…...

【大数据】Flink 详解(二):核心篇 Ⅲ
Flink 详解(二):核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制? Flink 使用 轻量级分布式快照,设计检查点(checkpoint)实现可靠容错。 30、什么是 Checkpoin 检查点? Checkpoint …...

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

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

8.13黄金是否进入下行通道?下周开盘如何布局
近期有哪些消息面影响黄金走势?黄金多空该如何研判? 黄金消息面解析:周五(8月11日)现货黄金小幅收低,受累于美元走强和美国国债收益率上升,本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…...

Idea的基本使用带案例---详细易懂
一.idea是什么 有专业人士说,idea是天生适合做微软,当时我还想肯定是夸大其词了,但当你用起来的时候确实很爽,😊😊 ntelliJ IDEA是一种集成开发环境(IDE),由JetBrains开发…...

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

【STM32】利用CubeMX对FreeRTOS用按键控制任务
对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。 此次实验目标: 1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印 2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印 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卡耳机插座,实现播放MP3播放器! 看过很多STM32软解MP3的方案,即不通过类似VS1053之类的解码器芯片,直接用STM32和软件库解码MP3文件,通常使用了labmad或者Helix解码库实现,Helix相对labm…...
STM32 CAN 过滤器设置
做个笔记吧 ,免得以后忘记了 芯片是stm32F207 ,用cubeMX 6.80 版本生成 CAN 的使用总体包含4个部分 第一步:CAN初始化,配置波特率 (cubeMX 里面配置好后自动生成,不需要手动添加) MX_CAN1_Init(); 第二步&#…...

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

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理
Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类,自己整理的一些游戏开发可…...
学习Vue:插值表达式和指令
在 Vue.js 中,Vue 实例与数据绑定是构建动态交互界面的关键。在这篇文章中,我们将重点介绍 Vue 实例中两种实现数据绑定的方式:插值表达式和指令。这些机制允许您将数据无缝地渲染到界面上,实现实时的数据更新和展示。 插值表达式…...

echart 3d立体颜色渐变柱状图
如果可以实现记得点赞分享,谢谢老铁~ 1.需求描述 根据业务需求将不同的法律法规,展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色,这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…...
linux shell变量
linux shell变量 1、变量命名规则2、只读变量3、删除变量 1、变量命名规则 变量名不能加$命名只能使用英文字母、数字和下划线,首个字母不能以数字开头中间不能有空格。可以有下划线不能使用标点符号不能使用bash中的关键字 username"tom"引用 $userna…...

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

【Rust】Rust学习 第七章使用包、Crate和模块管理不断增长的项目
目前为止,我们编写的程序都在一个文件的一个模块中。伴随着项目的增长,你可以通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长,你可以将包中的部分代码提取出来&…...

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

Android Alarm闹钟API使用心得
前言 有什么办法可以在不打开App的时候,也能够触发一些操作呢?比如说发送通知,解决这个需求的办法有很多种选择,比如说官方推荐的WorkManager API,可以在后台执行一次性、耗时、定时的任务,但WorkManager是…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

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