测试萌新三天速通python基础(二)列表,字符串,元组,字典,遍历,容器,集合,函数

news2024/11/28 2:45:23

python基础

    • 字符串
    • 下标(索引)
    • 切片
    • 字符串的替换 replace()
    • 字符串拆分 split()
    • 字符串的连接 join
    • 列表 list
    • 列表的增删改查
    • 列表的反转 reverse()
    • 排序
    • 列表嵌套
    • 元组 tuple
  • 排序 升序
  • 降序
    • 交换变量
    • 字典 dict
    • 查询
    • 遍历
    • 容器
    • 集合
    • 函数
    • 参数
    • 函数的嵌套调⽤
    • 函数的返回值
    • 模块导⼊的⽅法
    • ____name___ 变量
    • 可变类型与不可变类型
    • 局部变量和全局变量
    • 函数有多个返回值
    • 传参方式
    • 多值参数(可变参数/不定长参数)
    • 匿名函数
    • 案例

字符串

数据序列 , 容器 字符串 str, 列表 list,元组 tuple, 字典 dict
了解 集合 set
使用引号(单引号, 双引号, 三引号)引起来的内容,就是字符串

数据序列 , 容器 字符串 str, 列表 list,元组 tuple, 字典 dict
了解 集合 set
使用引号(单引号, 双引号, 三引号)引起来的内容,就是字符串

1. 使用单引号
str1 = 'hello'
2. 使用双引号定义
str2 = "hello"
3. 使用 三引号 定义
str3 = """hello"""
str4 = '''hello'''
print(type(str1), type(str2), type(str3), type(str4))
  1. 定义字符串 I’m 小明, 字符串本身包含引号

4.1 如果字符串本身包含单引号,定义的时候不能使用 单引号,

4.2 如果字符串本身包含双引号,定义的时候不能使用 双引号,

str5 = “I’m 小明”
print(str5) # I’m 小明

  1. 转义字符 \n \t ’ "
str6 = 'I\'m 小明'
print(str6) # I'm 小明
6. I\'m 小明 \\ --> \
str7 = 'I\\\'m 小明'
print(str7) # I\'m 小明

7. 原生字符串 在字符串的前边 加上 r"", 字符串中的 \ 就不会进行转义

str8 = r'I\'m 小明'
print(str8) # I\'m 小明

str7 = r'I\\\'m 小明'
print(str7) # I\\\'m 小明

下标(索引)

1, 下标(索引), 是数据在容器(字符串, 列表, 元组)中的位置, 编号
2, 一般来说,使用的是正数下标, 从 0 开始
3, 作用: 可以通过下标来获取具体位置的数据. 使用的语法为容器[下标]
4, Python 中是支持负数下标, -1 表示最后一个位置的数据

在这里插入图片描述

str1 = ‘abcdefg’

需求: 打印输出字符串中的 a 字符

print(str1[0])
print(str1[-7])

需求: 打印输出字符串中 最后一个字符(-1)

print(str1[-1])

需求: 打印输出 下标为 3 的位置的字符

print(str1[3])

切片

1, 使用切片操作, 可以一次性获取容器中的多个数据(多个数据之间存在一定的规律,数据的下标是 等差数列(相邻的两个数字之间的差值是一样的))
2, 语法 容器[start🔚step]
2.1 start 表示开始位置的下标
2.2 end 表示结束位置的下标,但是 end 所对应的下标位置的数据是不能取到的
2.3 step 步长,表示的意思就是相邻两个坐标的差值
start, start+step, start+step*2, …,end(取不到)

my_str = 'abcdefg'
# 需求1 : 打印字符串中 abc 字符 start 0, end 3, step 1
print(my_str[0:3:1])  # abc
# 1.1 如果步长是 1, 可以省略不写
print(my_str[0:3])  # abc
# 1.2 如果 start 开始位置的下标为 0, 可以不写,但是冒号不能少
print(my_str[:3])  # abc
# 需求 2: 打印字符串中的 efg , start 4, end 7, step 1
print(my_str[4: 7])  # efg
# 2.1 如果取到最后一个字符, end  可以不写,但是冒号不能少
print(my_str[4:])  # efg
# 需求 3: 打印字符串中的 aceg , start 0, end 7(最后), 步长 2
print(my_str[::2])  # aceg

字符串查找方法 find()

字符串.find(sub_str) # 在字符串中 查找是否存在 sub_str 这样的字符串
返回值(这行代码执行的结果):
1, 如果存在sub_str, 返回 第一次出现 sub_str 位置的下标
2, 如果不存在sub_str, 返回 -1

# 1. 现有字符串数据: '黑马程序员'
# 2. 请设计程序, 实现判断"黑马"和"白马"是否存在于数据中
# 3. 要求如果数据存在, 则输出数据所在位置
my_str = '黑马程序员'
# sub_str = '黑马'
sub_str = '白马'
result = my_str.find(sub_str)
if result == -1:
    print(f'{sub_str}不存在')
else:
    print(f'{sub_str}存在, 下标位置为:', result)

字符串的替换 replace()

字符串.replace(old, new, count) # 将字符串中的 old 字符串 替换为 new 字符串

  • old 原字符串,被替换的字符串
  • new 新字符串,要替换为的字符串
  • count 一般不写,表示全部替换, 可以指定替换的次数
  • 返回: 会返回一个替换后的完整的字符串
  • 注意: 原字符串不会改变的
my_str = 'good good study'
# 需求, 将 good 变为 GOOD
my_str1 = my_str.replace('good', 'GOOD')
print('my_str :', my_str)
print('my_str1:', my_str1)
# 将第一个 good 替换为 Good
my_str2 = my_str.replace('good', 'Good', 1)
print('my_str2:', my_str2)
# 将第二个 good  替换为 Good
# 先整体替换为 Good, 再将替换后的 第一个Good 替换为 good
my_str3 = my_str.replace('good', 'Good').replace('Good', 'good', 1)
print('my_str3:', my_str3)

字符串拆分 split()

字符串.split(sep) # 将字符串按照指定的字符串 sep 进行分隔

  • sep , 按照 sep 分隔, 可以不写, 默认按照空白字符(空格 \t \n)分隔
  • 返回: 列表,列表中的每个数据就是分隔后的字符串
str1 = 'hello Python\tand itcast and\nitheima'
# 1. 默认 按照空白字符分隔
list1 = str1.split()
print(list1)  # ['hello', 'Python', 'and', 'itcast', 'and', 'itheima']
# 2. 按照 空格分隔
list2 = str1.split(' ')
print(list2)  # ['hello', 'Python\tand', 'itcast', 'and\nitheima']
# 3. 按照 and  分隔
list3 = str1.split('and')
print(list3)  # ['hello Python\t', ' itcast ', '\nitheima']

字符串的连接 join

字符串.join(容器) # 容器一般是列表 , 将字符串插入到列表相邻的两个数据之间,组成新的字符串
注意点: 列表中的数据 必须都是字符串才可以

list1 = ['hello', 'Python', 'and', 'itcast', 'and', 'itheima']
# 将 列表中数据使用 空格 组成新的字符串
str1 = ' '.join(list1)
print(str1)  # hello Python and itcast and itheima
# 使用 逗号 连接
str2 = ','.join(list1)
print(str2)  # hello,Python,and,itcast,and,itheima
# 使用 _*_ 连接
str3 = '_*_'.join(list1)
print(str3)  # hello_*_Python_*_and_*_itcast_*_and_*_itheima

列表 list

1, 列表,list, 使用 []
2, 列表可以存放任意多个数据
3, 列表中可以存放任意类型的数据
4, 列表中数据之间 使用 逗号隔开

# 方式1, 使用类实例化的方式
# 1.1 定义空列表  变量 = list()
list1 = list()
print(type(list1), list1)  # <class 'list'> []
# 1.2 定义非空列表 , 也称为 类型转换  list(可迭代类型)  可迭代类型,能够使用 for 循环 就是 可迭代类型(比如 容器)
# 将容器中的 每个数据 都作为列表中一个数据进行保存
list2 = list('abcd')
print(list2)  # ['a', 'b', 'c', 'd']
# 方式2, 直接使用 [] 进行定义(使用较多)
# 2.1 定义空列表
list3 = []
print(list3)
# 2.2 定义非空列表
list4 = [1, 3.14, 'hello', False]
print(list4)
# 获取 列表中 第一个数据
print(list4[0])  # 1
# 获取列表中最后一个数据
print(list4[-1])  # False
# 获取中间两个数据即 3.14 和 'hello' (1 和 2)
print(list4[1: 3])  # [3.14, 'hello']

列表的增删改查

list1 = ['hello', 2, 3, 2, 3, 4]
# 查找 2 出现的下标
num = list1.index(2)
print(num)
# 统计数据 2 出现的次数
num1 = list1.count(2)
print(num1)
# 统计数据 20 出现的次数
num2 = list1.count(20)
print(num2)  # 0

增和删

# 定义空列表
list1 = []
print(list1)
# 添加数据 张三
list1.append('张三')
print(list1)
# 添加李四
list1.append('李四')
print(list1)
list1.append('王五')
list1.append('赵六')
print(list1)
# 删除最后一个数据
list1.pop()
print(list1)
# 删除第二个数据
name = list1.pop(1)
print('删除的对象为:', name)
print(list1)

修改数据

列表的排序

想要修改列表中的数据, 直接是所有下标即可 列表[下标] = 新数据

my_list = [1, 2]
my_list[0] = 10
print(my_list)
my_list[-1] = 200
print(my_list)

列表的反转 reverse()

字符串 反转 字符串[::-1]

列表 反转

  1. 列表[::-1] 得到一个新的列表, 原列表不会改动
  2. 列表.reverse() 直接修改原列表的数据
my_list = ['a', 'b', 'c', 'd', 'e']
# 1. 切片
my_list1 = my_list[::-1]
print('my_list :', my_list)
print('my_list1:', my_list1)
# 2. reverse
my_list.reverse()
print('my_list :', my_list)

排序

列表.sort() # 升序, 从小到大, 直接在原列表中进行排序
列表.sort(reverse=True) # 降序, 从大到下, 直接在原列表中进行排序

my_list = [1, 4, 7, 2, 5, 8, 3, 6, 9]
# 排序 升序
my_list.sort()
print(my_list)
# 降序
my_list.sort(reverse=True)
print(my_list)

列表嵌套

student_list = [["张三", "18", "功能测试"], ["李四", "20", "自动化测试"], ["王五", "21", "自动化测试"]]
# 张三
print(student_list[0][0])
# 李四
print(student_list[1][0])
# 张三 的信息添加一个 性别 男 ---> 向张三所在的列表 添加数据
student_list[0].append('男')
print(student_list)
# 删除 性别
student_list[0].pop()
print(student_list)
# 打印 所有人员的年龄
for info in student_list:  # info 是 列表
    print(info[1])

元组 tuple

my_list = [1, 4, 7, 2, 5, 8, 3, 6, 9]

排序 升序

my_list.sort()
print(my_list)

降序

my_list.sort(reverse=True)
print(my_list)
列表的嵌套 就是指 列表中数据都是列表.
student_list = [[“张三”, “18”, “功能测试”], [“李四”, “20”, “自动化测试”], [“王五”, “21”, “自动化测
试”]]

# 张三
print(student_list[0][0])
# 李四
print(student_list[1][0])
# 张三 的信息添加一个 性别 男 ---> 向张三所在的列表 添加数据
student_list[0].append('男')
print(student_list)
# 删除 性别
student_list[0].pop()
print(student_list)
# 打印 所有人员的年龄
for info in student_list: # info 是 列表
 print(info[1])

1, 元组 tuple, 使用的 ()
2, 元组和列表非常相似, 都可以存储多个数据, 都可以存储任意类型的数据
3, 区别就是 元组中的数据不能修改,列表中可以修改
4, 因为元组中的数据不能修改,所以只能 查询方法, 如 index, count ,支持下标和切片
5, 元组, 主要用于传参和返回值

交换变量

1, 在定义元组的时候, 小括号可以省略不写
2, 组包(pack), 将多个数据值组成元组的过程 a = 1, 2 # a = (1, 2)
3, 拆包(解包 unpack), 将容器中多个数据 分别给到多个变量, 需要保证容器中元素的个数和变量 的个数保持一致

a, b = b, a
print(a, b)
x, y, z = 'abc'
print(y) # b

字典 dict

1, 字典 dict, 使用 {} 表示
2, 字典是由键(key)值(value)对组成的, key: value
3, 一个键值对是一组数据, 多个键值对之间使用 逗号隔开
4, 在一个字典中, 字典的键 是不能重复的
5, 字典中的键 主要使用 字符串类型, 可以是数字
6, 字典中没有下标

# 1, 类实例化的方式
my_dict1 = dict()
print(type(my_dict1), my_dict1)  # <class 'dict'> {}
# 2, 直接使用 {}  定义
# 2.1 定义空字典
my_dict2 = {}
print(my_dict2)
# 2.2 定义非空字典, 姓名, 年龄, 身高, 性别
my_dict = {"name": "小明", "age": 18, "height": 1.78, "isMen": True}
print(my_dict)
# 将年龄改为 20
my_dict['age'] = 20
print(my_dict)
# 添加 体重 weight
my_dict['weight'] = 65
print(my_dict)
my_dict.pop('weight')
print(my_dict)
my_dict.pop('height')
print(my_dict)

增加和修改

字典[‘键’] = 值

1, 键 存在, 修改

2, 键 不存在, 添加

删除 字典的删除是根据字典的键 删除键值对 字典.pop(‘键’)

查询

方法一: 字典[‘键’] # 键 不存在,会报错

方法 二 字典.get(键) # 键不存在,返回 None

my_dict = {'name': '小明', 'age': 20}
# 获取 name 值
print(my_dict['name'])
print(my_dict.get('name'))
# 获取 性别 sex
# print(my_dict['sex'])   # 会报错, 因为 键不存在
print(my_dict.get('sex'))

遍历

1.遍历字典的键

for 变量 in 字典:
print(变量)

for 变量 in 字典.keys(): # 字典.keys() 可以获取字典所有的键
print(变量)

2.遍历字典的值

for 变量 in 字典.values(): # 字典.values() 可以获取字典中是所有的值
print(变量)

3.遍历字典的键和值

变量1 就是 键, 变量2 就是值

for 变量1, 变量2 in 字典.items(): # 字典.items() 获取的是字典的键值对
print(变量1, 变量2)

my_dict = {'name': '小明', 'age': 18, 'sex': '男'}
for k in my_dict:
    print(k)
print('*' * 30)
for k in my_dict.keys():
    print(k)
print('-' * 30)
for v in my_dict.values():
    print(v)
print('_*_' * 30)
for k, v in my_dict.items():
    print(k, v)

容器

in 操作符
in 是 Python 中的关键字.
数据 in 容器 可以⽤来判断 容器中是否包含这个数据, 如果包含返回 True,如果不包含返回 False
对于字典来说,判断的是 字典中是否包含这个键

集合

集合 set, {数据, 数据, …}

1, 集合中的数据是不能重复的, 即没有重复数据
2, 应⽤, 对列表进⾏去重操作 就是类型转换 , 可以将 列表转换为 集合, 然后再将集合转换为列表

# 遍历原列表
# for i in my_list:
# # 判断数据是否存在新列表
# if i in new_list:
# # 存在 什么都不操作
# pass
# else:
# # 不存在, 添加到新列表

函数

函数: 将多⾏代码(可以实现⼀个特定的功能)放在⼀块,并给它起⼀个名字. 在需要使⽤多⾏代码的时候, 可以使⽤名字代替.
定义函数的好处: 减少代码冗余(重复的代码不需要多次书写),提⾼编程效率

定义,就是给多⾏代码起名字的过程函数的定义需要使⽤ 关键字 def, 单词 define

定义函数的⼩技巧

1, 先不使⽤函数,将多⾏代码写完
2, 在多⾏代码的上⽅使⽤ def 起名字
3, 使⽤ tab 键, 将多⾏代码进⾏缩进

def login():
    print('1. 输入用户名')
    print('2. 输入密码')
    print('3. 输入验证码')
    print('4. 点击登录')
login()

参数

参数: 在函数定义的时候,在括号中写⼊变量,这个变量就称为是函数的参数. 形式参数(形参)
在函数调⽤的时候,可以给定义时候的形参传递具体的数据值,供其使⽤. 实际参数(实参)

def sun_2_num(a, b):  # a, b  形参
    c = a + b
    print(c)
sun_2_num(10, 20)   # 10, 20 实参 10 给 a,  20 给 b

函数的嵌套调⽤

def test01():
    print(1)
    print('func01')
    print(2)
# 2. 定义名为test02的函数,打印当前函数的名称,并 调用test01函数
def test02():
    print('func2')
    test01()
    print(4)

函数的返回值

1.在⼀个函数中,想要返回⼀个数据(想要有返回值), 需要使⽤ return 关键字

2.为什么返回值? 在函数中可能通过各种代码,得到的数据结果,想要在函数外部使⽤,就需要使⽤返回值
3, 如果函数有返回值, ⼀般在调⽤的时候 会使⽤变量来接收(保存) 返回值, 以便后续使⽤

4.return 关键字的作⽤, 将⼀个数据值返回到调⽤的地⽅

5.函数遇到 return 会结束函数的执⾏ return 关键字只能⽤在函数中
6, 如果⼀个函数 没有写 return,可以认为 返回值

def get_max(a, b):
    if a > b:
        return a
    else:
        return b
    print('我会执行吗, 不会执行')

模块导⼊的⽅法

1.import 模块名 # 模块名 就是代码⽂件名 ,不要 .py

2.from 模块名 import 功能名 # 导⼊指定的功 # 可以使⽤快捷键 Alt 回⻋

_name 变量

1, 导⼊模块的时候, 会执⾏模块中的代码
2, 作⽤: 如果在导⼊模块的时候, 模块中的部分代码不想被执⾏, 可以使⽤ name 来解决
3, name 变量,是 Python 解释器内置的变量(变量的值是⾃动维护的), 每个代码⽂件中,都有这个变量
3.1 在模块中 直接右键运⾏代码⽂件, name 变量的值是 ‘main
3.2 如果是被导⼊运⾏代码⽂件, name 变量的值 是 模块名(⽂件名)

class HouseItem:
    """家具类"""
    def __init__(self, name, area):
        self.name = name   # 名字
        self.area = area   # 占地面积
    def __str__(self):
        return f"{self.name} 占地面积 {self.area} 平米"
class House:
    """房子类"""
    def __init__(self, h_type, area):
        self.h_type = h_type    # 户型
        self.total_area = area  # 总面积
        self.free_area = area   # 剩余面积和总面积一样
        self.item_list = []     # 刚开始没有家具
    def __str__(self):
        return f"户型:{self.h_type}、总面积:{self.total_area} 平米、剩余面积:{self.free_area}平米、家具名称列表:{self.item_list}"
    def add_item(self, item):  # 1. 房子对象(self)   2. 家具对象(传参)
        """添加家具, item 家具对象"""
        # 1. 先判断房子的剩余面积和家具的占地面积的关系
        if self.free_area > item.area:  # 对象.属性  获取属性值
            print(f'添加家具: {item.name}')
            self.item_list.append(item.name)
            # 修改剩余面积
            self.free_area -= item.area
        else:
            print(f"房子剩余面积不足,换个大房子吧.....")
if __name__ == '__main__':
    # 创建家具对象
    bed = HouseItem('席梦思', 4)
    chest = HouseItem('衣柜', 2)
    table = HouseItem('餐桌', 1.5)
    print(bed)
    print(chest)
    print(table)
    # 创建房子
    house = House('三室一厅', 100)
    print(house)
    house.add_item(bed)
    print(house)
    house.add_item(chest)
    print(house)
    house.add_item(table)
    print(house)

可变类型与不可变类型

根据内存中的数据是否允许修改,将数据类型分为可变类型与不可变类型
简单理解: 不使用等号,能不能修改数据值
可变类型: 可以修改

  • 列表(list) list.append()
  • 字典(dict ) dict.pop()
  • 集合(set)
    不可变类型: 不允许修改
  • 数字类型(int , float , bool)
  • 字符串(str)
  • 元组(tuple)
my_tuple = (1, 2, [10, 20])  # 元组中 存储的 1 的地址, 2 的地址, 列表的地址
print(my_tuple, id(my_tuple), id(my_tuple[-1]), id(my_tuple[-1][-1]))
my_tuple[-1][-1] = 30  # 修改的列表中最后一个位置的引用
print(my_tuple, id(my_tuple), id(my_tuple[-1]), id(my_tuple[-1][-1]))

局部变量和全局变量

def func1():    num = 10  # 局部变量    print(num)

函数有多个返回值

def calc(a, b):
    """返回两个数的和及差"""
    return a + b, a - b
result = calc(10, 20)
print(result)

传参方式

def show_info(name, age):
    print(f"name:{name}, age: {age}")
# 位置传参
show_info('小明', 18)
# 关键字传参
show_info(age=18, name='张三')
# 混合使用
show_info('李四', age=17)
函数定义的时候, 给形参一个默认的数据值,这个参数就是缺省参数(默认参数)
def show_info(name, age=18, sex='保密'):
    print(name, age, sex)
# 调用
show_info('张三', 18, '男')

多值参数(可变参数/不定长参数)

1.在函数定义的时候,不确定在调用的时候,实参有多少个,此时可以使用 多值参数
2, 在普通的参数前边加上一个 *, 这个参数就变为 多值参数
3, 这个参数可以接收任意多个位置传参的数据, 类型 元组
4, 这个形参一般写作 args(arguments), 即 *args

在这里插入图片描述

匿名函数

匿名函数: 使用 lambda 关键字 定义的表达式,称为匿名函数

lambda 参数, 参数: 一行代码 # 只能实现简单的功能,只能写一行代码

匿名函数 一般不直接调用, 作为函数的参数使用的

user_list = [
    {'name': '张三', 'age': 22, 'title': '测试工程师'},
    {'name': '李四', 'age': 24, 'title': '开发工程师'},
    {'name': '王五', 'age': 21, 'title': '测试工程师'}]
# user_list.sort()   # 只能对数字,字符串排序
# 根据字典的 age 键 排序
# 想要对列表中的字典排序,需要 key 形参来指定根据字典中的什么键排序
# key 这个参数需要传递一个函数,使用匿名函数
# 列表.sort(key=lambda x: x['键'])
def func(x):
    return x['age']
user_list.sort(key=lambda x: x['age'])
# user_list.sort(key=func)
print(user_list)

案例

在这里插入图片描述

# 定义一个列表, 保存所有学生信息
# stu_list = []
stu_list = [{'name': 'aa', 'age': '11'}, {'name': 'bb', 'age': '22'}, {'name': 'cc', 'age': '33'}]
def make_student():
    """录入单个学生信息"""
    name = input('请输入姓名:')
    age = input('请输入年龄:')
    # 将学生信息存入字典
    stu_dict = {"name": name, "age": age}
    # 返回单个学生信息
    return stu_dict
def show_stu_info():
    """展示学生信息"""
    print('---------学生列表信息-----------')
    j = 1  # 初始序号
    for stu_dict in stu_list:  # stu_dict 字典
        print(f"{j}\t\t{stu_dict.get('name')}\t\t{stu_dict.get('age')}")
        j += 1  # 修改序号
    print('-------------------------------')
def get_student_counts():
    """获取学生的数量"""
    return len(stu_list)
def search_student():
    """查询学生的信息"""
    name = input('请输入要查询的学生姓名:')
    for stu_dict in stu_list:
        if name == stu_dict.get('name'):
            # 找到了这个学生
            print(f'姓名:{name}, 年龄: {stu_dict.get("age")}')
            # 终止
            return  # 结束函数的执行
    # 写在循环的外边
    print(f'对不起, 名字叫 [{name}]的学生不存在')
if __name__ == '__main__':
    # 录入三个学生信息
    # for i in range(3):
    #     stu = make_student()
    #     # 需要将单个学生添加到列表
    #     stu_list.append(stu)
    #
    # print(stu_list)
    # 展示学生信息
    show_stu_info()
    # 获取学生数量
    print('学生总数为: ', get_student_counts())
    search_student()
    print('-------------------------------')
def get_student_counts():
    """获取学生的数量"""
    return len(stu_list)
def search_student():
    """查询学生的信息"""
    name = input('请输入要查询的学生姓名:')
    for stu_dict in stu_list:
        if name == stu_dict.get('name'):
            # 找到了这个学生
            print(f'姓名:{name}, 年龄: {stu_dict.get("age")}')
            # 终止
            return  # 结束函数的执行
    # 写在循环的外边
    print(f'对不起, 名字叫 [{name}]的学生不存在')
if __name__ == '__main__':
    # 录入三个学生信息
    # for i in range(3):
    #     stu = make_student()
    #     # 需要将单个学生添加到列表
    #     stu_list.append(stu)
    #
    # print(stu_list)
    # 展示学生信息
    show_stu_info()
    # 获取学生数量
    print('学生总数为: ', get_student_counts())
    search_student()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重发布和路由策略实验(课堂练习)

需求&#xff1a; 将1.1.1.0/24网段&#xff08;不在OSPF中&#xff09;重发布到网络中&#xff0c;不允许出现次优路径&#xff0c;实现全网可达。 需求分析&#xff1a; 1、在R1上重发布1.1.1.0/24网段&#xff0c;但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下&#xff1a; CUDA&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive cudnn&#xff1a;https://developer.nvidia.com/rdp/cudnn-archive 版本&#xff1a;CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA&#xff08;Compute Unified De…

【superset】基于MySQL的BI数据分析可视化实战案例(已更新)

1.熟悉、梳理、总结下superset可视化分析实战案例知识体系,一直想探索有效可用的可视化分析方案,大多收费或不好用,这里,借此机会总结、更新下。 2.复杂度高,遇到并解决的问题较多,尝试了很多次。 3.欢迎批评指正,跪谢一键三连! 基于MySQL的BI数据分析可视化实战案例文…

免费剪辑的素材资源网站,超高清、可商用、不限速、无版权,迅速有效的解决您的视频剪辑难题!

在数字媒体时代&#xff0c;高质量的剪辑素材已成为视频制作的核心资源。下面为您推荐的优质视频剪辑素材网站&#xff0c;都提供超高清、无限速、无版权、可商用的素材&#xff0c;这些网站将大大提升您的视频制作效率和质量 01. 蛙学府 实用性&#xff1a;★★★★☆ 丰富性&…

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件&#xff08;java目录&#xff09; 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…

百度云防护如何开启CC攻击防护

百度云防护的最重要的功能是可以CC攻击防护&#xff0c;针对CC攻击&#xff0c;百度云防护有被动的CC攻击拦截规则&#xff0c;也有主动自定义访问策略拦截。 今天百度云来教大家如何开启百度云防护的CC攻击防御功能。 1.进入防护模板功能-创建模板 2.开启CC攻击防御功能&…

Windows单机部署RocketMQ5.X并与SpringBoot集成

RocketMQ 5.X下载 《RocketMQ 5.X下载》 下载后&#xff0c;解压缩 修改初始内存 修改runserver.cmd&#xff08;Linux则为runserver.sh&#xff09; 将下面的-Xms2g -Xmx2g -Xmn1g调小 if %JAVA_MAJOR_VERSION% lss 17 (set "JAVA_OPT%JAVA_OPT% -server -Xms2g -X…

Apache反代理Tomcat项目,分离应用服务器和WEB服务器

项目的原理是使用单独的机器做应用服务器&#xff0c;再用单独的机器做WEB服务器&#xff0c;从网络需要访问我们的应用的话&#xff0c;就会先经过我们的WEB服务器&#xff0c;再到达应用程序&#xff0c;这样子的好处是我们可以保护应用程序的机器位置&#xff0c;同时还可以…

长安汽车:基于云器 Lakehouse 的车联网大数据平台建设

近年来随着智能汽车行业的迅速发展&#xff0c;数据也在呈爆炸式增长。长安大数据平台承接了长安在生产上大部分流量应用及日常生产业务应用。本文将分享长安汽车在车联网场景下大数据平台建设面临的一些挑战和具体落地的实践。 主要内容如下&#xff1a; 1. 背景介绍 2. 长…

渲染农场多少钱一个小时?

​很多第一次准备使用渲染农场的小伙伴不知道渲染农场多少钱一个小时&#xff0c;今天就给大家介绍一下渲染农场多少钱一小时。 现在渲染农场基本都有CPU渲染和GPU渲染&#xff0c;各渲染农场的服务器配置不同&#xff0c;收费也各不相同&#xff0c;不过都是按渲染时长收费&…

C语言学习(八)typedef 虚拟内存 malloc/free

目录 一、typedef 类型重定义&#xff08;一&#xff09;使用&#xff08;二&#xff09;define和typedef的区别1. 编译处理的阶段不同2. 功能不同 二、虚拟内存&#xff08;一&#xff09;虚拟内存分布&#xff08;二&#xff09;内存分布1. 静态分配2. 动态分配 三、malloc/f…

如何使用canvas在图片上进行标注,以下代码不起作用,着实被坑到了(文末附完整代码)

今天发现一个有意思的问题&#xff1a; 如何使用canvas在图片上进行如下的标注&#xff0c;以下代码不起作用,如何修改 原始代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&quo…

理解进程的基本概念

1. 什么是进程 进程&#xff0c;即执行中的程序 进程 程序执行 在计算机中&#xff0c;每一个运行的exe程序&#xff0c;就是一个进程 2.为什么会有进程 早期&#xff0c;操作系统只有一个程序&#xff0c;这样效率是很低的。为了提高CPU的利用率&#xff0c;人们将多个程…

时间复杂度的简单讲解

小伙伴们大家好&#xff0c;我们又见面了&#xff0c;这次我们直接进入正题 时间复杂度的概念 时间复杂度的定义&#xff1a;在计算机科学中&#xff0c; 算法的时间复杂度是一个函数 &#xff0c;它定量描述了该算法的运行时间。一 个算法执行所耗费的时间&#xff0c;从理论…

Hadoop-未授权访问-内置配合命令执行RCE

一、Hadoop常见端口及配置文件 Hadoop中有多种端口&#xff0c;这些端口用于不同的服务和通信。以下是Hadoop中常见的端口以及它们的用途&#xff1a; NameNode Web界面端口 (默认: 9870)NameNode 对客户端服务端口 (默认: 8020)Secondary NameNode Web界面端口 (默认: 9868)…

每日OJ题_贪心算法四⑤_力扣354. 俄罗斯套娃信封问题

目录 力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xff09; 解析代码2_重写排序贪心二分 力扣354. 俄罗斯套娃信封问题 354. 俄罗斯套娃信封问题 难度 困难 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0…

物联网杀虫灯—新型的环保杀虫设备

型号推荐&#xff1a;云境天合TH-FD2S】物联网杀虫灯是一种新型环保杀虫设备&#xff0c;其中风吸式太阳能杀虫灯作为其一种特殊类型&#xff0c;展现了独特的工作原理和优势。 风吸式太阳能杀虫灯以太阳能电池板为电源&#xff0c;白天储存电源&#xff0c;晚上为杀虫灯提供电…

资产公物仓管理系统|实现国有资产智能化管理

1、项目背景 资产公物仓管理系统&#xff08;智仓库DW-S201&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 项目设计原则 方案对公物仓资…

Java 守护线程 ( Daemon Thread )详解

在Java中&#xff0c;线程分为两类&#xff1a;用户线程(User Thread)和守护线程(Daemon Thread)。守护线程是后台线程&#xff0c;主要服务于用户线程&#xff0c;当所有的用户线程结束时&#xff0c;守护线程也会自动结束&#xff0c;JVM会随之退出。守护线程的一个典型例子是…