【Python】高级进阶(专版提升3)

Python

  • 1 程序结构
    • 1.1 模块 Module
      • 1.1.1 定义
      • 1.1.2 作用
      • 1.1.3 导入
        • 1.1.3.1 import
        • 1.1.3.2 from import
      • 1.1.4 模块变量
      • 1.1.5 加载过程
      • 1.1.6 分类
    • 1.2 包package
      • 1.2.1 定义
      • 1.2.2 作用
      • 1.2.3 导入
        • 1.1.3.1 import
        • 1.1.3.2 from import
  • 2 异常处理Error
    • 2.1 异常
    • 2.2 处理
  • 3 迭代
    • 3.1 可迭代对象iterable
  • 4 生成器generator
    • 4.1 生成器函数
    • 4.2 内置生成器
      • 4.2.1 枚举函数enumerate
      • 4.2.2 zip
    • 4.3 生成器表达式
  • 5 函数式编程
    • 5.1 函数作为参数
      • 5.1.1 lambda 表达式
      • 5.1.2 内置高阶函数
    • 5.2 函数作为返回值
      • 5.2.1 闭包
      • 5.2.2 函数装饰器decorator
  • 6. 文件操作
    • 6.1 文件管理
      • 6.1.1基础概念
      • 6.1.2 pathlib模块
        • 6.1.2.1创建路径
        • 6.1.2.2路径信息
        • 6.1.2.3搜索目录
        • 6.1.2.4新建路径
        • 6.1.2.5重命名
        • 6.1.2.6删除路径
    • 6.2 文件读写
      • 6.2.1文本文件
        • 6.2.1.1打开文件
        • 6.2.1.2读写文件
        • 6.2.1.3关闭文件
      • 6.2.2二进制文件
        • 6.2.2.1打开文件
        • 6.2.2.2读写文件
        • 6.2.1.3关闭文件

1 程序结构

1.1 模块 Module

1.1.1 定义

包含一系列数据、函数、类的文件,通常以.py结尾。

1.1.2 作用

让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰。
有利于多人合作开发。

1.1.3 导入

1.1.3.1 import

(1) 语法:
import 模块名
import 模块名 as 别名
(2) 作用:将模块整体导入到当前模块中
(3) 使用:模块名.成员

1.1.3.2 from import

(1) 语法:
from 模块名 import 成员名
from 模块名 import 成员名 as 别名
from 模块名 import *
(2) 作用:将模块内的成员导入到当前模块作用域中
(3) 使用:直接使用成员名

"""
	module01.py
"""
def func01():
	print("module01 - func01执行喽")

def func02():
	print("module01 - func02执行喽")

# 导入方式1:import 模块名
# 使用:模块名.成员
# 原理:创建变量名记录文件地址,使用时通过变量名访问文件中成员
# 备注:"我过去"
# 适用性:适合面向过程(全局变量、函数)
import module01

module01.func01()
# 导入方式2.1:from 文件名 import 成员
# 使用:直接使用成员
# 原理:将模块的成员加入到当前模块作用域中
# 备注:"你过来"
# 注意:命名冲突
# 适用性:适合面向对象(类)
from module01 import func01
def func01():
	print("demo01 - func01")

func01() # 调用的是自己的func01

# 导入方式2.2:from 文件名 import *
from module01 import *
func01()
func02()

1.1.4 模块变量

__name__变量:模块自身名字,可以判断是否为主模块。
当此模块作为主模块(第一个运行的模块)运行时,name绑定’main’,不是主模块,而是被其它模块
导入时,存储模块名。

1.1.5 加载过程

在模块导入时,模块的所有语句会执行。
如果一个模块已经导入,则再次导入时不会重新执行模块内的语句。

1.1.6 分类

(1) 内置模块(builtins),在解析器的内部可以直接使用。
(2) 标准库模块,安装Python时已安装且可直接使用。
(3) 第三方模块(通常为开源),需要自己安装。
(4) 用户自己编写的模块(可以作为其他人的第三方模块)

1.2 包package

1.2.1 定义

将模块以文件夹的形式进行分组管理。

1.2.2 作用

让一些相关的模块组织在一起,使逻辑结构更加清晰。

1.2.3 导入

1.1.3.1 import

(1) 语法:
import 路径.模块名
import 路径.模块名 as 别名
(2) 作用:将模块整体导入到当前模块中
(3) 使用:模块名.成员

1.1.3.2 from import

(1) 语法:
from 路径.模块名 import 成员名
from 路径.模块名 import 成员名 as 别名
from 路径.模块名 import *
(2) 作用:将模块内的成员导入到当前模块作用域中
(3) 使用:直接使用成员名
注意:路径从项目根目录开始计算

2 异常处理Error

2.1 异常

(1) 定义:运行时检测到的错误。
(2) 现象:当异常发生时,程序不会再向下执行,而转到函数的调用语句。
(3) 常见异常类型:
– 名称异常(NameError):变量未定义。
– 类型异常(TypeError):不同类型数据进行运算。
– 索引异常(IndexError):超出索引范围。
– 属性异常(AttributeError):对象没有对应名称的属性。
– 键异常(KeyError):没有对应名称的键。
– 异常基类Exception。

2.2 处理

(1) 语法:

try:
	可能触发异常的语句
except 错误类型1 [as 变量1]:
	处理语句1
except 错误类型2 [as 变量2]:
	处理语句2
except Exception [as 变量3]:
	不是以上错误类型的处理语句
finally:
	无论是否发生异常的语句

(2) 作用:将程序由异常状态转为正常流程。
(3) 说明:
as 子句是用于绑定错误对象的变量,可以省略
except子句可以有一个或多个,用来捕获某种类型的错误。
finally子句最多只能有一个,如果没有except子句,必须存在。
如果异常没有被捕获到,会向上层(调用处)继续传递,直到程序终止运行。

3 迭代

每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。例如:
循环获取容器中的元素。

3.1 可迭代对象iterable

(1) 定义:具有__iter__函数的对象,可以返回迭代器对象。
(2) 语法

# 创建:
class 可迭代对象名称:
	def __iter__(self):
		return 迭代器
# 使用:
	for 变量名 in 可迭代对象:
		语句

(3) 原理:

迭代器 = 可迭代对象.__iter__()
while True:
	try:
		print(迭代器.__next__())
	except StopIteration:
		break

(4) 演示:

message = "我是花果山水帘洞孙悟空"
# for item in message:
# print(item)
# 1. 获取迭代器对象
iterator = message.__iter__()
# 2. 获取下一个元素
while True:
	try:
		item = iterator.__next__()
		print(item)
		# 3. 如果停止迭代则跳出循环
	except StopIteration:
		break

3.2 迭代器对象iterator
(1) 定义:可以被next()函数调用并返回下一个值的对象。
(2) 语法

class 迭代器类名:
	def __init__(self, 聚合对象):
		self.聚合对象= 聚合对象
	def __next__(self):
		if 没有元素:
			raise StopIteration()
			return 聚合对象元素

(3) 说明:聚合对象通常是容器对象。
(4) 作用:使用者只需通过一种方式,便可简洁明了的获取聚合对象中各个元素,而又无需了解其内部
结构。
(5) 演示:

class StudentIterator:
	def __init__(self, data):
		self.__data = data
		self.__index = -1
	
	def __next__(self):
		if self.__index == len(self.__data) - 1:
			raise StopIteration()
		self.__index += 1
		return self.__data[self.__index]

class StudentController:
	def __init__(self):
		self.__students = []
	
	def add_student(self, stu):
		self.__students.append(stu)

	def __iter__(self):
		return StudentIterator(self.__students)

controller = StudentController()
controller.add_student("悟空")
controller.add_student("八戒")
controller.add_student("唐僧")
# for item in controller:
# print(item) #
iterator = controller.__iter__()
while True:
	try:
		item = iterator.__next__()
		print(item) #
	except StopIteration:
		break

4 生成器generator

(1) 定义:能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。
(2) 作用:在循环过程中,按照某种算法推算数据,不必创建容器存储完整的结果,从而节省内存空
间。数据量越大,优势越明显。以上作用也称之为延迟操作或惰性操作,通俗的讲就是在需要的时候才
计算结果,而不是一次构建出所有结果。

4.1 生成器函数

(1) 定义:含有yield语句的函数,返回值为生成器对象。
(2) 语法

# 创建:
def 函数名():yield 数据
	…
	
# 调用:
for 变量名 in 函数名():
	语句

(3) 说明:
– 调用生成器函数将返回一个生成器对象,不执行函数体。
– yield翻译为”产生”或”生成”
(4) 执行过程:
a. 调用生成器函数会自动创建迭代器对象。
b. 调用迭代器对象的next()方法时才执行生成器函数。
c. 每次执行到yield语句时返回数据,暂时离开。
d. 待下次调用next()方法时继续从离开处继续执行。
(5) 原理:生成迭代器对象的大致规则如下
a. 将yield关键字以前的代码放在next方法中。
b. 将yield关键字后面的数据作为next方法的返回值。
(6) 演示:

def my_range(stop):
	number = 0
	while number < stop:
		yield number
		number += 1
		
for number in my_range(5):
	print(number) # 0 1 2 3 4

4.2 内置生成器

4.2.1 枚举函数enumerate

(1) 语法:

for 变量 in enumerate(可迭代对象):
	语句
for 索引, 元素in enumerate(可迭代对象):
	语句

(2) 作用:遍历可迭代对象时,可以将索引与元素组合为一个元组。
(3) 演示:

list01 = [43, 43, 54, 56, 76]
# 从头到尾读 -- 读取数据
for item in list01:
	print(item)
# 非从头到尾读 -- 修改数据
for i in range(len(list01)):
	if list01[i] % 2 == 0:
		list01[i] += 1
for i, item in enumerate(list01): # -- 读写数据
	if item % 2 == 0:
		list01[i] += 1

4.2.2 zip

(1) 语法:

for item in zip(可迭代对象1, 可迭代对象2):
	语句

(2) 作用:将多个可迭代对象中对应的元素组合成一个个元组,生成的元组个数由最小的可迭代对象决
定。
(3) 演示:

list_name = ["悟空", "八戒", "沙僧"]
list_age = [22, 26, 25]
# for 变量 in zip(可迭代对象1,可迭代对象2)
for item in zip(list_name, list_age):
print(item)
# ('悟空', 22)
# ('八戒', 26)
# ('沙僧', 25)
# 应用:矩阵转置
map = [
[2, 0, 0, 2],
[4, 2, 0, 2],
[2, 4, 2, 4],
[0, 4, 0, 4]
]
# new_map = []
# for item in zip(map[0],map[1],map[2],map[3]):
# new_map.append(list(item))
# print(new_map)
# new_map = []
# for item in zip(*map):
# new_map.append(list(item))
new_map = [list(item) for item in zip(*map)]
print(new_map)
# [[2, 4, 2, 0], [0, 2, 4, 4], [0, 0, 2, 0], [2, 2, 4, 4]]

4.3 生成器表达式

(1) 定义:用推导式形式创建生成器对象。
(2) 语法:

变量 = (表达式 for 变量 in 可迭代对象 if 条件)

5 函数式编程

(1) 定义:用一系列函数解决问题。
– 函数可以赋值给变量,赋值后变量绑定函数。
– 允许将函数作为参数传入另一个函数。
– 允许函数返回一个函数。
(2) 高阶函数:将函数作为参数或返回值的函数。

5.1 函数作为参数

将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则。

list01 = [342, 4, 54, 56, 6776]
# 定义函数,在列表中查找第一个大于100的数
def get_number_gt_100():
	for number in list01:
		if number > 100:
			return number

# 定义函数,在列表中查找第一个偶数
def get_number_by_even():
	for number in list01:
		if number % 2 == 0:
			return number

# 参数:得到的是列表中的元素
# 返回值:对列表元素判断后的结果(True False)
def condition01(number):
	return number > 100

def condition02(number):
	return number % 2 == 0

# 通用函数
def find_single(condition): # 抽象
	for item in list01:
		# if number > 100:
		# if condition01(item):
		# if condition02(item):
		if condition(item):# 统一
			return item

# 变化点函数:查找小于10的数据
def condition03(number):
	return number < 10

print(find_single(condition03))

5.1.1 lambda 表达式

(1) 定义:是一种匿名方法
(2) 作用:
– 作为参数传递时语法简洁,优雅,代码可读性强。
– 随时创建和销毁,减少程序耦合度。
(3) 语法

# 定义:
变量 = lambda 形参: 方法体

# 调用:
变量(实参)

(4) 说明:
– 形参没有可以不填
– 方法体只能有一条语句,且不支持赋值语句。
(5) 演示:

from common.iterable_tools import IterableHelper
# 定义函数,在列表中查找所有大于100的数
# def condition01(number):
# return number > 100

# 定义函数,在列表中查找所有偶数
# def condition02(number):
# return number % 2 == 0

list01 = [342, 4, 54, 56, 6776]
for item in IterableHelper.find_all(list01,lambda number: number > 100):
	print(item)
for item in IterableHelper.find_all(list01,lambda number: number % 2 == 0):
	print(item)

5.1.2 内置高阶函数

(1) map(函数,可迭代对象):使用可迭代对象中的每个元素调用函数,将返回值作为新可迭代对象
元素;返回值为新可迭代对象。
(2) filter(函数,可迭代对象):根据条件筛选可迭代对象中的元素,返回值为新可迭代对象。
(3) sorted(可迭代对象,key = 函数,reverse = bool值):排序,返回值为排序结果。
(4) max(可迭代对象,key = 函数):根据函数获取可迭代对象的最大值。
(5) min(可迭代对象,key = 函数):根据函数获取可迭代对象的最小值。
(6) 演示:

class Employee:
	def __init__(self, eid, did, name, money):
		self.eid = eid # 员工编号
		self.did = did # 部门编号
		self.name = name
		self.money = money

# 员工列表
list_employees = [
	Employee(1001, 9002, "师父", 60000),
	Employee(1002, 9001, "孙悟空", 50000),
	Employee(1003, 9002, "猪八戒", 20000),
	Employee(1004, 9001, "沙僧", 30000),
	Employee(1005, 9001, "小白龙", 15000),
]

# 1. map 映射
# 需求:获取所有员工姓名
for item in map(lambda item: item.name, list_employees):
	print(item)
	
# 2. filter 过滤器
# 需求:查找所有部门是9002的员工
for item in filter(lambda item: item.did == 9002, list_employees):
	print(item.__dict__)

# 3. max min 最值
emp = max(list_employees, key=lambda emp: emp.money)
print(emp.__dict__)

# 4. sorted
# 升序排列
new_list = sorted(list_employees, key=lambda emp: emp.money)
print(new_list)

# 降序排列
new_list = sorted(list_employees, key=lambda emp: emp.money, reverse=True)
print(new_list)

5.2 函数作为返回值

逻辑连续,当内部函数被调用时,不脱离当前的逻辑。

5.2.1 闭包

(1) 三要素:
– 必须有一个内嵌函数。
– 内嵌函数必须引用外部函数中变量。
– 外部函数返回值必须是内嵌函数。
(2) 语法

# 定义:
def 外部函数名(参数):
	外部变量
	def 内部函数名(参数):
		使用外部变量
	return 内部函数名

# 调用:
变量 = 外部函数名(参数)
变量(参数)

(3) 定义:是由函数及其相关的引用环境组合而成的实体。
(4) 优点:内部函数可以使用外部变量。
(5) 缺点:外部变量一直存在于内存中,不会在调用结束后释放,占用内存。
(6) 作用:实现python装饰器。
(7) 演示:

def give_gife_money(money):
	print("获得", money, "元压岁钱")
	def child_buy(commodity, price):
		nonlocal money
		money -= price
		print("购买了", commodity, "花了", price, "元,还剩下", money)
	return child_buy

action = give_gife_money(500)
action("变形金刚", 200)
action("芭比娃娃", 300)

5.2.2 函数装饰器decorator

(1) 定义:在不改变原函数的调用以及内部代码情况下,为其添加新功能的函数。
(2) 语法

def 函数装饰器名称(func):
	def wrapper(*args, **kwargs):
		需要添加的新功能
		res = func(*args, **kwargs)
		return res
	return wrapper

@ 函数装饰器名称
def 原函数名称(参数):
函数体

原函数(参数)

(3) 本质:使用“@函数装饰器名称”修饰原函数,等同于创建与原函数名称相同的变量,关联内嵌函数;
故调用原函数时执行内嵌函数。
原函数名称 = 函数装饰器名称(原函数名称)

def func01():
	print("旧功能")

def new_func(func):
	def wrapper():
		print("新功能")
		func() # 执行旧功能
	return wrapper

# 新功能覆盖了旧功能
# func01 = new_func

# 调用一次外部函数(装饰器本质)
func01 = new_func(func01)
# 调用多次内部函数
func01()
func01()

(3) 装饰器链:
一个函数可以被多个装饰器修饰,执行顺序为从近到远。
练习1:不改变插入函数与删除函数代码,为其增加验证权限的功能

def verify_permissions():
	print("验证权限")

def insert():
	print("插入")

def delete():
	print("删除")

insert()
delete()

6. 文件操作

6.1 文件管理

6.1.1基础概念

(1)文件
定义:保存在持久化存储设备(硬盘、U盘、光盘…)上的一段数据。
例如:文本,图片,视频,音频等。
(2)路径
– 定义:对文件存储在计算机中位置的标识,除Window使用反斜杠"“以外,其他操作系统使用斜
杠”/“分隔。
– 当前路径:正在执行的Python文件所在目录。
– 绝对路径:从操作系统根目录开始,Window以盘符"C:”、“D:”,OS X或Linux以斜杠"/"开始。
– 相对路径:从当前目录开始。
在这里插入图片描述

6.1.2 pathlib模块

对os模块中与文件操作相关的封装,是基于面向对象的跨平台路径操作模块。
官方文档:https://docs.python.org/zh-cn/3/library/pathlib.html?highlight=pathlib

6.1.2.1创建路径

(1) 语法

# 导入路径类
from pathlib import Path

# 相对路径
对象名 = Path(相对路径)
# 当前工作目录的绝对路径
对象名 = Path.cwd()
# 绝对路径 + 相对路径
对象名 = Path.cwd().joinpath("目录1","目录2")
6.1.2.2路径信息
对象名.absolute() # 绝对路径(路径类型)
对象名.name # 带后缀的完整文件名(str类型)
对象名.stem # 文件名不带后缀(str类型)
对象名.suffix # 文件后缀(str类型)
对象名.parent # 上一级路径(路径类型)
对象名.parts # 分割路径(tuple类型)
对象名.exists() # 路径是否存在(bool类型)
对象名.is_file() # 是否文件(bool类型)
对象名.is_dir() # 是否目录(bool类型)
对象名.is_absolute() # 是否绝对路径(bool类型)
对象名.stat().st_ctime # 创建时间(时间戳)
对象名.stat().st_atime # 访问时间(时间戳)
对象名.stat().st_mtime # 修改的时间(时间戳)
对象名.stat().st_size # 文件大小(字节Bete)
6.1.2.3搜索目录

(1) 语法

# 注意:路径对象必须是目录,不能是文件
# 搜索当前目录所有路径(一层)
生成器 = 对象名.iterdir():
# 根据通配符搜索当前目录所有路径(一层),*表示任意多个字符
# 例如:*.py表示所有Python文件
生成器 = path.glob("通配符"):
# 根据通配符递归搜索当前目录所有路径(多层)
生成器 = 对象名.rglob("通配符")

(2) 示例

# (当前目录为month01)
# 打印每天名称为demo的文件
for item in Path.cwd().glob(r"*/demo*"):
	print(item)

# 打印所有后缀为.py的文件
list_file = Path.cwd().rglob(r"*.py"):
	print(item)
6.1.2.4新建路径
# 新建文件
对象名.touch()

# 新建目录
对象名.mkdir()
对象名.mkdir(exist_ok=True) # 忽略目录存在时的报错
6.1.2.5重命名

(1) 语法

对象名.rename(新路径对象)

(2) 示例:修改month01\day03\homework\exercise01.py文件名称或后缀

# 修改前:day03/homework/exercise01.py
old_file = Path("day03", "homework", "exercise01.py")
new_file_name = old_file.with_name("new_exercise.py")
# 修改后:day03/homework/new_exercise.py
old_file.rename(new_file_name)
6.1.2.6删除路径
对象名.unlink() # 删除文件(永久删除,回收站不存在)
对象名.rmdir() # 删除目录(目录必须为空)

6.2 文件读写

读 :即从文件中获取内容
写 :即修改文件中的内容
基本步骤:打开文件,读写文件,关闭文件
官方文档:https://docs.python.org/zh-cn/3/library/functions.html?highlight=open#open

6.2.1文本文件

打开后会自动解码为字符,如txt文件,py文件。

6.2.1.1打开文件

(1) 语法

对象名 = open(文件路径,"操作模式",encoding="编码方式")

(2) 操作模式
在这里插入图片描述

(3) 编码方式
Linux操作系统文本文件默认为"utf-8"
Windows操作系统文本文件默认为"gbk"

6.2.1.2读写文件

(1) 读取

# 读取文件中指定数量字符
字符串 = 对象名.read(字符数) # 省略字符数将读取至文件末尾
# 读取文件中的每行
forin 对象名:

(2) 写入

# 将字符串写入到文件
字符数 = 对象名.write(字符串)
6.2.1.3关闭文件

文件作为操作系统资源,打开后必须关闭,避免超出操作系统限制。
(1) close方法

对象名 = open(文件路径)
try:
	操作文件对象
finally:
	对象名.close()

(2) with操作
对try…finally语法的简化,当with代码块全部执行完后,无论是否产生异常,都会自动释放资源

with open(文件路径) as 对象名:
	通过对象名操作文件

6.2.2二进制文件

内部编码为二进制码,无法通过文字编码解析,如压缩包,音频,视频,图片等。

6.2.2.1打开文件

(1) 语法

对象名 = open(文件路径,"操作模式")

(2) 操作模式
在这里插入图片描述

6.2.2.2读写文件

(1) 读取

# 读取文件中指定数量字节
字节串 = 对象名.read(字节数) # 省略字节数将读取至文件末尾

(2) 写入

# 将字节串写入到文件
字节数 = 对象名.write(字节串)

(3) 字节串
以字节类型表达数据,处理二进程数据更方便。

6.2.1.3关闭文件

文件作为操作系统资源,打开后必须关闭,避免超出操作系统限制。
(1) close方法

对象名 = open(文件路径)
try:
	操作文件对象
finally:
	对象名.close()

(2) with操作
对try…finally语法的简化,当with代码块全部执行完后,无论是否产生异常,都会自动释放资源

with open(文件路径) as 对象名:
	通过对象名操作文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/552410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TinyEMU源码分析之访存处理

TinyEMU源码分析之访存处理 1 访存指令介绍2 指令译码3 地址转换3.1 VA与PA3.2 VA转PA 4 判断地址空间范围5 执行访存操作5.1 访问RAM内存5.2 访问非RAM&#xff08;设备&#xff09;内存 6 访存处理流程图 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其…

数据结构排序算法

排序也称排序算法(SortAlgorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 分类 内部排序【使用内存】 指将需要处理的所有数据都加载到内部存储器中进行排序插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 交换排序 冒泡排序快速…

两阶段提交进阶

两阶段提交之进阶 上一节我们讲了&#xff0c;两阶段提交逻辑上的表现&#xff0c;其实较为肤浅&#xff0c;并且偏向理论&#xff0c;可能大家都能看懂&#xff0c;但是如果放入实际的mysql应用中并联系事务和日志进行分析&#xff0c;又会怎么样呢&#xff1f; 这次就专门分…

Unity类银河恶魔城学习记录13-1 p142 Save system源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

软考133-上午题-【软件工程】-软件项目估算

一、COCOMO 估算模型 COCOMO 模型是一种精确的、易于使用的成本估算模型。 COCOMO 模型按其详细程度分为&#xff1a;基本 COCOMO 模型、中级 COCOMO 模型和详细 COCOMO 模型。 1&#xff09;基本 COCOMO 模型 基本 COCOMO 模型是一个静态单变量模型&#xff0c;用于对整个软…

内衣裤洗衣机如何选购?掌握这六个挑选技巧,轻松选购!

这两年内衣裤洗衣机可以称得上较火的小电器&#xff0c;小小的身躯却有大大的能力&#xff0c;一键可以同时启动洗、漂、脱三种全自动为一体化功能&#xff0c;在多功能和性能的提升上&#xff0c;还可以解放我们双手的同时将衣物给清洗干净&#xff0c;让越来越多小伙伴选择一…

node基础 第二篇

01 ffmpeg开源跨平台多媒体处理工具&#xff0c;处理音视频&#xff0c;剪辑&#xff0c;合并&#xff0c;转码等 FFmpeg 的主要功能和特性:1.格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式&#xff0c;支持几乎所有常见的音频和视频格式&#xff0c;包括 MP…

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么&#xff1f;2、nvm是什么&#xff1f; 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

docker-compose 安装MongoDB续创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里&#xff0c;我们创建了数据库&#xff0c;但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

c语言,单链表的实现----------有全代码!!!!

1.单链表的定义和结构 单链表是一种链式的数据结构&#xff0c;它用一组不连续的储存单元存反线性表中的数据元素。链表中的数据是以节点的形式来表示的&#xff0c;节点和节点之间相互连接 一般来说节点有两部分组成 1.数据域 &#xff1a;数据域用来存储各种类型的数据&…

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对疾病防控信息管理的提升&a…

windows 如何安装 perl ?

链接&#xff1a;https://strawberryperl.com/ 我们选择安装 “草莓 perl” 下载后根据引导安装就行了

node.jd版本降级/升级

第一步.先清空本地安装的node.js版本 按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 进入命令控制行窗口&#xff0c;输入where node&#xff0c;查看本地…

双指针的引入和深入思考(持续更新中)

目录 1.引入双指针 2.使用场景 3.例题引入 1.引入双指针 当我们需要维护某个区间性质的或者是求满足某些性质的区间的长度时&#xff0c;对于一个区间是由左右端点的&#xff0c;我们有简单的枚举左右端点的O()的时间的做法&#xff0c;当时在大多数题目中是不可行的&#…

DataX案例,MongoDB数据导入HDFS与MySQL

【尚硅谷】Alibaba开源数据同步工具DataX技术教程_哔哩哔哩_bilibili 目录 1、MongoDB 1.1、MongoDB介绍 1.2、MongoDB基本概念解析 1.3、MongoDB中的数据存储结构 1.4、MongoDB启动服务 1.5、MongoDB小案例 2、DataX导入导出案例 2.1、读取MongoDB的数据导入到HDFS 2…

论文笔记:Does Writing with Language Models Reduce Content Diversity?

iclr 2024 reviewer评分 566 1 intro 大模型正在迅速改变人们创造内容的方式 虽然基于LLM的写作助手有可能提高写作质量并增加作者的生产力&#xff0c;但它们也引入了算法单一文化——>论文旨在评估与LLM一起写作是否无意中降低了内容的多样性论文设计了一个控制实验&…

Kubernetes部署应用利器Helm详解

文章目录 一、helm概述&安装1.为什么需要Helm2.Helm介绍3.Helm架构4.部署Helm客户端5.Helm基本使用5.1 创建Chart示例 二、Helm 应用部署、升级1.创建项目&#xff08;chat所需目录、文件&#xff09;2.创建/拷贝项目的yaml文件到templates目录下3.使用Helm进行部署项目4.H…

第十五届蓝桥杯复盘python大学A组——试题B 召唤数学精灵

按照正常思路解决&#xff0c;由于累乘消耗大量时间&#xff0c;因此这不是一个明智的解决方案。 这段代码执行速度非常慢的原因在于它试图计算非常大的数的阶乘&#xff08;累乘&#xff09;&#xff0c;并且对于每一个i的值都执行这个计算。阶乘的增长是极其迅速的&#xff…

49.HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用 图片显示 Row() {Image($r(app.media.leaf)).height(100).width(100)Image($r(app.media.icon)).height(100).width(100) } 左侧导航 import prompt from ohos.prompt; import promptAction from ohos.promptAction; Entry C…

vue2知识点1 ———— (vue指令,vue的响应式基础)

vue2的知识点&#xff0c;更多前端知识在主页&#xff0c;还有其他知识会持续更新 Vue 指令 Vue指令是Vue.js中的一个重要概念&#xff0c;用于向DOM元素添加特定行为或功能。Vue指令以v-开头&#xff0c;例如v-bind、v-if、v-for等。 v-bind 动态绑定属性 用法&#xff1a…