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

【高级语言程序设计】python函数式编程(一)

基础知识

Python函数式编程的主要内容包括以下几个方面:
(1)函数作为一等公民:在函数式编程中,函数被视为一等公民,可以像其他数据类型一样被传递、赋值以及作为返回值。
(2)不可变数据:函数式编程鼓励使用不可变数据,即创建后不能被修改的数据。这使得程序更容易理解和推理,并能减少错误的发生。
(3)纯函数:纯函数是指没有副作用并且对于给定的输入总是产生相同的输出的函数。纯函数不依赖于和修改外部状态,因此更容易进行测试和并发处理。
(4)高阶函数:高阶函数是指能够接受一个或多个函数作为参数,并/或者返回一个函数的函数。高阶函数可以用于构建复杂的逻辑和实现代码的重用。
(5)函数组合与柯里化:函数组合是指将多个函数组合成一个新的函数的过程。柯里化是指将一个接受多个参数的函数转化为一系列只接受一个参数的函数。
(6)递归:递归是函数式编程的常用技术之一,通过函数调用自身来解决问题。
在这里插入图片描述
可迭代是指能够被for循环遍历的对象(容器)。

可迭代对象是指实现了__iter__方法的对象,是可以被迭代的对象,例如列表、元组、集合、字典等。

迭代器是实现了无参数的__next__方法,该方法返回序列中的下一个元素;如果没有元素了则抛出StopIteration异常的对象。Python的迭代器还实现了__iter__方法,因此迭代器也可以迭代。

如何创建自己的迭代器?
要自定义一个迭代器,
需要定义一个类并实现__iter__()和__next__()方法。
其中,iter()方法返回迭代器对象本身,
而__next__()方法返回迭代器中的下一个元素。
在迭代器中,可以使用raise StopIteration语句来结束迭代。

如何判断一个对象是否可迭代

判断一个对象是否可迭代,可以使用collections.abc模块中的Iterable类。

具体代码如下:

from collections.abc import Iterableif isinstance(obj, Iterable):print('obj是可迭代的')
else:print('obj不是可迭代的')

惰性求值的主要思想是:只有在需要结果的时候,才进行计算,如果暂时不需要结果,就不进行计算,从而最小化计算机的工作,提高程序的效率

函数参数形式

在这里插入图片描述
2.不定长参数:元组(*args)和字典(**kwargs)

可变参数就是传入的参数个数是可变的。
如果一个函数不知道未来要接收多少个参数,可以使用一个元组来接受不定长参数。

def test(*args): # 当成元组的形式来接受参数,一般写成:*argsprint(args)  # 注意这里的形参不能带*号print(type(args)) 

每个参数都用自己的含义,但不是固定参数,可以借用字典的键值对特性来实现

def test(**kwargs): # 当成字典的形式接受参数,一般写成:**kwargs
print(kwargs)
print(type(kwargs))

if __name__ == "__main__":
test(a=3, b=5, c=7)
test(**{‘a’:3, ‘b’:5, ‘c’:7}) 

3.缺省参数、关键字参数
缺省参数,也称默认值参数,在定义函数的时候,给形参一个默认的值。不传递参数的时候用自己的默认值,传递参数的时候使用传递进去的实参。默认参数应是一个不可变对象

def test(num, str='https://algernon98.github.io/'): #str为缺省参数
print(str * num)if __name__ == "__main__":
test(num=5)  #str使用默认值
test(num=5, str='www') #str使用传递进去的实参![

关键字参数来指定形参和实参的关系,是一种函数调用时的形式,避免出现位置的错误。

def test(num, str):print(str * num)if __name__ == "__main__":
test(str='https://algernon98.github.io/', num=5)

4.各种参数并存问题
各种参数并存时,参数定义的顺序必须是:位置参数、默认参数、可变参数。

知识点

在这里插入图片描述

class MyIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current > self.end:raise StopIterationelse:self.current += 1return self.current - 1if __name__ == "__main__":my_iterator = MyIterator(1, 5)for i in my_iterator:print(i)
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/MyIterator.py
1
2
3
4
5进程已结束,退出代码0

如何判断一个对象是否可迭代
判断一个对象是否可迭代,可以使用collections.abc模块中的Iterable类。

具体代码如下:

from collections.abc import Iterableif isinstance(obj, Iterable):print('obj是可迭代的')
else:print('obj不是可迭代的')

装饰器

在这里插入图片描述

import datetimedef log(func):def printInfo(*arge, **kw):  # *不定长参数  **关键字参数print(' before call ' + func.__name__)  # 在调用func之前打印func(*arge)print('after call ' + func.__name__)  # 在调用func之后打印return printInfo@log  # 相当于执行了  now = log(now)
def now(astr):print(astr)if __name__ == "__main__":now(datetime.date.today())
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/MyIterator.pybefore call now
2023-10-07
after call now进程已结束,退出代码0

授权验证

在这里插入图片描述
授权验证:可以使用装饰器来验证用户的身份和权限,保证系统的安全性。

def requires_auth(f):

def decorated(*args, **kwargs):auth = request.authorizationif not auth or not check_auth(auth.username, auth.password):authenticate()return f(*args, **kwargs)
return decorated

执行函数f前需要认证。

重试机制

重试机制:可以使用装饰器来实现函数执行失败后重试的机制,提高程序的健壮性。
import time
def retry(max_tries=3, delay_seconds=1):

def decorator_retry(func):        def wrapper_retry(*args, **kwargs):tries = 0while tries < max_tries:try:return func(*args, **kwargs)except Exception as e:tries += 1if tries == max_tries: raise etime.sleep(delay_seconds)return wrapper_retry

return decorator_retry

@retry(max_tries=5, delay_seconds=2)
def call_dummy_api():
response = requests.get(“https://jsonplaceholder.typicode.com/todos/1”)
return response

带参数的装饰器

from functools import wraps​
def logit(logfile='out.log'):def logging_decorator(func):@wraps(func)def wrapped_function(*args, **kwargs):log_string = func.__name__ + " was called"print(log_string)# 打开logfile,并写入内容with open(logfile, 'a') as opened_file:# 现在将日志打到指定的logfileopened_file.write(log_string + '\n')return func(*args, **kwargs)return wrapped_function
return logging_decorator
​
@logit()
def myfunc1():Passmyfunc1()  # Output: myfunc1 was called
#现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串
@logit(logfile='func2.log')
def myfunc2():pass

函数

filter()

在这里插入图片描述

常用的函数式编程模块

Python中常用的函数式编程模块有:
functools、itertools和operator。

functools模块提供了一些高阶函数,如partial和reduce;
itertools模块提供了各种迭代器工具,如permutations和combinations;
operator模块提供了一些常见的运算符,如add和mul。

这些模块都可以帮助开发者更加方便地实现函数式编程的思想。

operator模块

它包含一组于Python操作符相对应的函数。这些函数在函数式风格的代码中通常很有用,因为它可以替代一些只包括单个操作的函数。

其中的一些函数有:

数学运算:add(),sub(),mul(),div(),floordiv(),abs(),…
逻辑运算:not_(),truth()。
位运算:and_(),or_(),invert()。
对比:eq(),ne(),lt(),le(),gt()和ge()。
对象标识:is_(),is_not()。

functools模块

functools模块包含一些高阶函数。作用:基于已有的函数创建新函数。
高阶函数将一个或多个函数作为输入,并返回一个新的函数。
其中最有用的就是functools.partial()函数。

对函数式风格的程序来说,有时要构建具有填充一些参数的现有函数的变体。比如函数f(a, b, c);你可能希望创建一个新的函数g(b, c),相当于f(1, b, c);这被称之为“部分功能应用程序”。

import functools

def add(a, b):
print(“当前结果值”, a+b)

add = functools.partial(add, 1)
add(2)

递归算法

如果一个算法调用自己来完成它的部分工作,就称这个算法为递归算法。
递归算法必须具有三个部分:
初始情况、递归部分和综合。
初始情况只处理可以直接解决的简单输入;
递归部分包含对算法的一次或多次递归,每次调用的参数在某种程度上比原始调用参数更加接近初始情况。
综合部分把一些小规模问题的解综合为原问题的解。利用递归解决问题的方法就是想办法把一个规模大的问题转换为一个本质相同但规模比较小的问题,
在这里插入图片描述

在这里插入图片描述

数列求和

def sum(ilist,n):if n==1:return  ilist[0]t= sum(ilist,n-1)return  ilist[n-1]+tlist=[1,2,3,4,5,6,7,8,9,10]
print(sum(list,1))
print(sum(list,5))
print(sum(list,10))
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/MyIterator.py
1
15
55进程已结束,退出代码0

计算阶乘

def  rfact( n):if n<=1:return 1   #初始情况,直接处理return n*rfact(n-1) #递归调用与综合print(rfact(1))
print(rfact(5))
print(rfact(10))
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/MyIterator.py
1
120
3628800进程已结束,退出代码0

汉诺塔

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用hanoi(int n,Pole start,Pole goal ,Pole temp)描述:利用柱子temp,把柱子start上的n个圆盘移到柱子goal上.
用move(start,goal)描述把柱子start上的1个最大的圆盘移到柱子goal上。则有

def hanoi(n, start, goal, temp):if n == 0: returnhanoi(n - 1, start, temp, goal)move(start, goal)hanoi(n - 1, temp, goal, start)def move(start, goal):print(start, '--->', goal)hanoi(5, 'start', 'goal', 'temp')
D:\coder\randomnumbers\venv\Scripts\python.exe D:/coder/randomnumbers/MyIterator.py
start ---> goal
start ---> temp
goal ---> temp
start ---> goal
temp ---> start
temp ---> goal
start ---> goal
start ---> temp
goal ---> temp
goal ---> start
temp ---> start
goal ---> temp
start ---> goal
start ---> temp
goal ---> temp
start ---> goal
temp ---> start
temp ---> goal
start ---> goal
temp ---> start
goal ---> temp
goal ---> start
temp ---> start
temp ---> goal
start ---> goal
start ---> temp
goal ---> temp
start ---> goal
temp ---> start
temp ---> goal
start ---> goal进程已结束,退出代码0

例题

猜数

def decorator(func):def wrapper_retry(*args, **kwargs):while True:result = func(*args, **kwargs)if result != 'continue':breakreturn resultreturn wrapper_retry@decorator
def call_dummy_api(n):x = input("请输入一个数:")if int(x) > n:print('big')return 'continue'elif int(x) < n:print('small')return 'continue'elif int(x) == n:print('ok')return 'yes'if __name__=="__main__":call_dummy_api(2)if __name__ == "__main__":
import  random
n=random.randint(30,40)
call_dummy_api(n)

筛选回文

筛选回文 找出在11到200 之间的回文

def is_palindrone(n):return str(n) == str(n)[::-1]  #[::-1]是倒切 从右往左print( list( filter( is_palindrone, range(11,200) ) ) )

使用python编写一个函数,函数参数为字符串str,函数返回字符串str中最长的回文子串 。
下面的代码找出了给定字符串的所有回文子串

def is_palindrone(s):return s == s[::-1]tstr='abcba'
strs=(tstr[pos:pos+length]   for length  in range(2,len(tstr)+1)for   pos  in  range(0,len(tstr)-length+1))print(list(filter(is_palindrone, strs)))

随机分形

在这里插入图片描述

import random
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.sans-serif"]=["SimHei"]      #设置显示中文字体
mpl.rcParams["axes.unicode_minus"]=False      #设置正常显示符号def randomFractal(leftX,leftY,rightX,rightY):STOP = 4        if (rightX - leftX) <= STOP:plt.plot([leftX, rightX], [leftY, rightY])else:midX = (leftX + rightX) / 2midY = (leftY + rightY) / 2delta = int(((random.random() - 0.5) * (rightX - leftX)))midY += delta;randomFractal(leftX, leftY, midX, midY)randomFractal(midX,  midY,  rightX, rightY)plt.figure(figsize=(8,4),dpi=300)                        #设置画布大小,图像分辨率
randomFractal(100,400,400,400)
plt.show() 

汉诺塔

用hanoi(int n,Pole start,Pole goal ,Pole temp)描述:利用柱子temp,把柱子start上的n个圆盘移到柱子goal上.
用move(start,goal)描述把柱子start上的1个最大的圆盘移到柱子goal上。则有

def  hanoi( n,start,goal ,temp):if  n==0: return;hanoi(n-1,start,temp,goal)move(start,goal)hanoi(n-1,temp,goal,start)def  move(start,goal):print(start,'--->',goal)hanoi( 5,'start','goal' ,'temp')

求斐波那契数列第n项

def fib( n)
{   if n==1||n==2: return 1 #初始条件k1=fib(n-1)             #递归调用k2=fib(n-2)             #递归调用return k1+k2            #组合
}

计算n的阶乘

def  rfact( n):if n<=1:return 1   #初始情况,直接处理return n*rfact(n-1) #递归调用与综合print(rfact(5))#以5的阶乘为例

农夫过河

利用python函数式编程,编写程序模拟农夫过河(3只羊和3只狮子过河,有1艘船只能容纳2只动物,当河岸上狮子数大于羊数,羊就会被吃掉,找到运输方法,让所有动物都过河。

from itertools import combinationsdef is_safe(state):# 检查当前状态是否安全left_bank = state['left']right_bank = state['right']if left_bank['lion'] > left_bank['sheep'] > 0 or right_bank['lion'] > right_bank['sheep'] > 0:return Falsereturn Truedef move(state, action):# 根据动作移动动物到对岸new_state = {'left': state['left'].copy(), 'right': state['right'].copy()}boat = state['boat']if boat == 'left':for animal in action:new_state['left'][animal] -= 1new_state['right'][animal] += 1new_state['boat'] = 'right'else:for animal in action:new_state['right'][animal] -= 1new_state['left'][animal] += 1new_state['boat'] = 'left'return new_statedef generate_actions(state):# 生成可行的动作actions = []bank = state['left'] if state['boat'] == 'left' else state['right']for num_animals in range(1, min(3, sum(bank.values())) + 1):for combination in combinations(bank.keys(), num_animals):actions.append(combination)return actionsdef solve(state):# 递归解决问题if not is_safe(state):return Noneif sum(state['right'].values()) == 6:return [state]actions = generate_actions(state)for action in actions:new_state = move(state, action)result = solve(new_state)if result:return [state] + resultreturn None# 初始状态:3只羊和3只狮子在左岸,船在左岸
initial_state = {'left': {'sheep': 3, 'lion': 3}, 'right': {'sheep': 0, 'lion': 0}, 'boat': 'left'}# 解决问题
solution = solve(initial_state)# 打印解决方案
if solution:for i, state in enumerate(solution):print(f"Step {i}: {state}")
else:print("No solution found.")

这个程序使用递归的方式来解决农夫过河问题。它定义了几个辅助函数来检查状态是否安全、移动动物到对岸、生成可行的动作,并使用这些函数来解决问题。最后,它打印出解决方案的每个步骤。

请注意,由于这个问题的状态空间很大,程序可能需要一些时间来找到解决方案。如果没有找到解决方案,它将打印"No solution found."。

改善:

from pythonds.graphs import Graph
from pythonds.basic import Queue
def solution():'''3只羚羊和3只狮子过河问题:1艘船只能容纳2只动物当河岸上狮子数大于羚羊数,羚羊就会被吃掉找到运输方法,让所有动物都过河'''# 定义合法的运输操作(i, j) , 例如(1, 0)表示运送羚羊1只,狮子0只opt = [(1, 0), (0, 1), (1, 1), (2, 0), (0, 2)]# 定义状态state(m, n, k), m表示羚羊数,n表示狮子数,k表示船在此岸还是彼岸# stateA 表示A岸(此岸)的状态;stateB 表示B岸(彼岸)的状态;# 初始状态stateA = (3, 3, 1)stateB = (0, 0, 0)# BFS搜索mygraph = Graph()myqueue = Queue()myqueue.enqueue((stateA, stateB))sequence = []  # 剪枝记录(最后发现,有效状态只有15种)sequence.append((stateA))while True:stateA, stateB = myqueue.dequeue()if stateA == (0, 0, 0):breakfor o in opt:# 一次从某岸到另一岸的运输if stateA[2] == 1:stateA_ = (stateA[0] - o[0], stateA[1] - o[1], stateA[2] - 1)stateB_ = (stateB[0] + o[0], stateB[1] + o[1], stateB[2] + 1)else:stateB_ = (stateB[0] - o[0], stateB[1] - o[1], stateB[2] - 1)stateA_ = (stateA[0] + o[0], stateA[1] + o[1], stateA[2] + 1)# 运输后if stateA_[0] and stateA_[0] < stateA_[1]:  # 此岸在有羊的情况下,如果狼大于羊,则吃掉continueelif stateB_[0] and stateB_[0] < stateB_[1]:  # 彼岸在有羊的情况下,如果狼大于羊,则吃掉continueelif stateA_[0] < 0 or stateA_[0] > 3 or stateA_[1] < 0 or stateA_[1] > 3:  # 边界continueelse:# 剪枝if stateA_ in sequence:continueelse:sequence.append(stateA_)myqueue.enqueue((stateA_, stateB_))mygraph.addEdge(stateA, stateA_, o)return mygraph, sequence
if __name__ == '__main__':g, sq = solution()# 建立父子关系for v_n in sq:v = g.getVertex(v_n)for nbr in v.getConnections():if nbr.getColor() == 'white':nbr.setPred(v)nbr.setColor('gray')v.setColor('black')target = g.getVertex(sq[-1])# 回溯,显示决策路径while target.getPred():predv = target.getPred()print(target.id, '<--', predv.getWeight(target), '--', predv.id)target = predv

输出:

(0, 0, 0) <-- (1, 1) -- (1, 1, 1)
(1, 1, 1) <-- (1, 0) -- (0, 1, 0)
(0, 1, 0) <-- (0, 2) -- (0, 3, 1)
(0, 3, 1) <-- (0, 1) -- (0, 2, 0)
(0, 2, 0) <-- (2, 0) -- (2, 2, 1)
(2, 2, 1) <-- (1, 1) -- (1, 1, 0)
(1, 1, 0) <-- (2, 0) -- (3, 1, 1)
(3, 1, 1) <-- (0, 1) -- (3, 0, 0)
(3, 0, 0) <-- (0, 2) -- (3, 2, 1)
(3, 2, 1) <-- (1, 0) -- (2, 2, 0)
(2, 2, 0) <-- (1, 1) -- (3, 3, 1)

在这里插入图片描述

随机生成中国人姓名

import randomdef generate_chinese_name():# 常见的姓氏surnames = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '杜', '阮', '蓝', '闵', '席', '季', '麻', '强', '贾', '路', '娄', '危']# 常见的名字names = ['伟', '芳', '娜', '秀英', '敏', '静', '丽', '强', '磊', '洋', '艳', '勇', '军', '杰', '娟', '涛', '明', '超', '秀兰', '霞', '平', '刚', '桂英', '英', '华', '民', '强', '燕', '平', '鹏', '飞', '慧', '红', '宇', '建华', '建国', '建军', '云', '亮', '志强', '志伟', '志刚', '志勇', '志明', '志平', '志杰', '志文', '志国', '志强', '志伟', '志刚', '志勇', '志明', '志平', '志杰', '志文', '志国', '志强', '志伟', '志刚', '志勇', '志明', '志平', '志杰', '志文', '志国', '志强', '志伟', '志刚', '志勇', '志明', '志平', '志杰', '志文', '志国']surname = random.choice(surnames)name = random.choice(names)return surname + name# 生成一个随机的中国人名字
chinese_name = generate_chinese_name()
print(chinese_name)

这个生成函数使用了常见的姓氏和名字列表,然后通过random.choice()函数随机选择一个姓氏和一个名字进行组合。最后,它返回生成的中国人名字。

相关文章:

【高级语言程序设计】python函数式编程(一)

基础知识 Python函数式编程的主要内容包括以下几个方面&#xff1a; (1)函数作为一等公民&#xff1a;在函数式编程中&#xff0c;函数被视为一等公民&#xff0c;可以像其他数据类型一样被传递、赋值以及作为返回值。 (2)不可变数据&#xff1a;函数式编程鼓励使用不可变数据…...

使用python查找指定文件夹下所有xml文件中带有指定字符的xml文件

文件夹目录如下&#xff08;需要递归删除文件夹下的.DS_Store文件&#xff09;&#xff1a; labels文件夹下面是xml文件&#xff1a; import os import os.pathpath "name/labels" files os.listdir(path) # 得到文件夹下所有文件名称 s []for xmlFile in files:…...

flutter实现透明appbar(一)

前言 在项目中如何实现透明的appbar&#xff0c;方式一&#xff1a; 使用stack和positioned定位功能把appbar定位到页面的最上面&#xff0c; 实现 实现 Widget build(BuildContext context) {return Scaffold(body: Stack(children: [_homePage(), _appBar()],),);}_appbar…...

(四)正点原子STM32MP135移植——u-boot移植

一、概述 u-boot概述就不概述了&#xff0c;u-boot、kernel、dtb三件套&#xff0c;dddd 经过国庆艰苦奋战&#xff0c;已经成功把所有功能移植好了 二、编译官方代码 进入u-boot的目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf u-boot-stm32mp-v2022.10-stm32mp-r1-r0.…...

[计算机入门] 应用软件(办公类)

3.19 应用软件(办公类) 3.19.1 Microsoft office办公软件套件 Microsoft Office 是一套广泛使用的办公软件套件&#xff0c;由Microsoft公司开发和发布。它包含了多个应用程序&#xff0c;用于处理各种办公任务。以下是Office常见的几个应用程序&#xff1a; Microsoft Word…...

基于安卓android微信小程序音乐播放器

运行环境 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 项目介绍 音乐播放器小程序的设计主要是对系统所要实现的功能进行详细考虑&#xff0c;确定所要…...

Java的指针、引用与C++的指针、引用的对比

笔者前两天在参加菜鸟面试的时候被面试官问到了这个问题&#xff0c;由于只在本科程序设计课上学过C&#xff0c;已经好久没有开发实际项目&#xff0c;所以对C相关的指针以及引用的记忆较为模糊&#xff0c;在此进行一定的知识汇总与梳理。 我们以面试中出现的问题为例来进行整…...

串级/级联控制知识点整理

串级控制系统是改善控制质量的有效方法之一&#xff0c;在过程控制中得到了广泛的应用。所谓串级控制&#xff0c;就是采用两个控制器串联工作&#xff0c;外环控制器的输出作为内环控制器的设定值&#xff0c;由内环控制器的输出去操纵控制阀&#xff0c;从而对外环被控量具有…...

数据产品读书笔记——认识数据产品经理

&#x1f33b;大家可能听说的更多是产品经理这个角色&#xff0c;对数据产品经理可能或多或少了解一些&#xff0c;但又不能准确的描述数据产品经理的主要职能和与其他产品的不同&#xff0c;因此通过读一些书来对数据产品经理有一个准确且全面的认知。 目录 1. 数据的产品分类…...

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建虚拟机

文章目录 一、虚拟机二、关于消息的API发布消息直接交换机 DIRECT 转发规则扇出交换机 FANOUT 转发规则主题交换机 TOPIC 转发规则匹配规则Router类 订阅消息消费者队列如何给订阅的消费者发送消息自动发送消息至订阅者 应答消息 三、代码编写 一、虚拟机 接下来要创建虚拟机,…...

GIT版本控制--前言

欢迎来到《GIT版本控制》专栏&#xff01;在当今软件开发和协作的世界中&#xff0c;版本控制是不可或缺的工具之一。无论您是一名初学者&#xff0c;一位经验丰富的开发者&#xff0c;还是一个项目团队的成员&#xff0c;都有可能会受益于对GIT的深入了解。 GIT是一个强大的分…...

由于 MAC 地址的问题,导致网络不通的原因和分析

由于 MAC 地址的问题&#xff0c;导致网络不通的原因和分析 将现象及原因分析发给大家&#xff0c;供大家参考&#xff0c;以后有类似问题时有个解决问题的参考开发板网络不通&#xff0c;也抓不到包&#xff0c;折腾了好久&#xff0c;将电脑和开发板用网线直连&#xff0c;结…...

游戏开发中的设计模式

单例模式 实例化单一对象&#xff0c;懒加载 //单例模式 class GameManagerSingleton {private constructor(){}private static instance:GameManagerSingleton;public static Instance(){if(!GameManagerSingleton.instance){this.instance new GameManagerSingleton();}re…...

React核心原理与实际开发

学习目标 React是啥&#xff1f; 官方定义&#xff1a;将前端请求获取到的数据渲染为HTML视图的JavaScript库。 一、React入门 1、React项目创建 直接创建react&#xff0c;使用初始化会创建package.json npm init -y再安装 2、React基本使用 使用纯JS创建ReactDOM&#…...

Springboot+vue的企业OA管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的企业OA管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业OA管理系统&#xff0c;采用M&#xff08;m…...

3、字符设备驱动框架和开发步骤

一、Linux内核对文件的分类 Linux的文件种类 1、-&#xff1a;普通文件2、d&#xff1a;目录文件3、p&#xff1a;管道文件4、s&#xff1a;本地socket文件5、l&#xff1a;链接文件6、c&#xff1a;字符设备7、b&#xff1a;块设备 Linux内核按驱动程序实现模型框架的不同&…...

[MySQL]基础篇

文章目录 1. MySQL基本使用1.1 MySQL的启动和登录1.1.1 MySQL的启动1.1.2 MySQL的客户端连接 1.2 数据模型 2. SQL2.1 SQL类型2.1.1 数值类型2.1.2 字符串类型2.1.3 日期类型 2.2 DDL2.2.1 数据库操作2.2.2 表操作 - 查询2.2.3 表操作 - 创建表2.2.4 表操作 - 修改 2.3 DML2.3.…...

Meta Semantic Template for Evaluation of Large Language Models

本文是LLM系列文章&#xff0c;针对《Meta Semantic Template for Evaluation of Large Language Models》的翻译。 大型语言模型评估的元语义模板 摘要1 引言2 相关工作3 方法4 实验5 结论 摘要 大型语言模型(llm)是否真正理解语言的语义&#xff0c;或者只是记住训练数据?…...

Git相关知识(1)

目录 1.初识Git 1.基础知识 2.centos中下载 2.基本操作 1.创建本地仓库 2.配置本地仓库 3.版本库、工作区、暂存区 4.添加文件 5.add和commit对git文件的作用 6.修改文件 7.版本回退 8.撤销修改 9.删除文件 3.分支操作 1.HEAD与分支 2.创建分支 3.删除分支 …...

pytorch中nn.DataParallel多次使用

pytorch中nn.DataParallel多次使用 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader# 定义模型 class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc nn.Linear(10, 1)def forwa…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...