Python 之 进阶 学习

2023-10-27

学习 Python 之 进阶学习

一切皆对象

1. 变量和函数皆对象

在python中, 所有的变量函数都是一个对象

print(type(1))
print(type(1.))
print(type(True))
print(type(None))

结果:

<class 'int'>
<class 'float'>
<class 'bool'>
<class 'NoneType'>

可以看出, 变量都是对象, 它们的类型都是class, 再看看函数

def f():
    pass

print(type(f))

结果:

<class 'function'>

从上面的例子可以看出, 实际上函数就是一个对象, 那么函数可以当某个函数的参数和返回值了

2. 模块和类皆对象

就连模块和类都是对象

import sys

print(type(sys))
class A:
    pass

print(type(A))

结果:

<class 'module'>
<class 'type'>

3. 对象的基本操作

(1). 可以赋值给变量
(2). 可以添加到集合中
(3). 可以作为函数参数
(4). 可以作为函数返回值返回

4. object, type, class之间的关系

(1). object类

object类是所有类都要继承的一个基础类(父类)

class People:
    pass
print(People.__bases__)

结果:

(<class 'object'>,)
(2).type类和type对象

type()函数查看变量类型, 但是type也是一个类, 还是一个对象

a = 1
print(type(a))
print(type(int))

结果:

<class 'int'>
<class 'type'>

因此, type类 生成 int类, int类 生成 1, 1 赋值给 a, 所以 a是int类的对象

所以, type类生成其他类

print(type.__bases__)
print(type(type))
print(type(object))
print(object.__bases__)

结果:

(<class 'object'>,)
<class 'type'>
<class 'type'>
()

可以看出, object类的父类是空

type类继承object类, type类又生成object类

type类生成type类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ug6hlh6Q-1654273663491)(学习图片/type与object的关系.png)]

闭包

一个函数中的变量由其外部环境变量所决定的整体, 即函数 + 环境变量

闭包的意义: 保存了函数, 和函数定义时的变量

def func1():
    a = 5
    def ax2(x):
        return a * x * 2

    return ax2

a 是环境变量, ax2()是函数, 它们构成了一个闭包

1. 查看闭包

(1). 查看闭包

只有闭包才拥有内置属性__closure__

def func1():
    a = 5
    def ax2(x):
        return a * x * 2

    return ax2

f = func1()
print(f.__closure__)

(<cell at 0x0000025E9917AF50: int object at 0x0000025E99010170>,)

(2). 查看环境变量
def func1():
    a = 5
    def ax2(x):
        return a * x * 2

    return ax2

f = func1()
print(f.__closure__[0].cell_contents)

5

2. 分析闭包

函数里定义变量后不是闭包

def fun1():
    a = 5
    def fun2():
        b = 10
        return b

    return fun2

f = fun1()
print(f.__closure__)

None

def fun1():
    a = 5
    def fun2():
        return a

    return fun2

f = fun1()
print(f.__closure__)

(<cell at 0x0000025E9917AF50: int object at 0x0000025E99010170>,)

3. 闭包的用处

问题: 实现函数, 每次返回结果, 要在加入上一次的结果

假设开始 x = 0, 函数名是 add()

第一次 add(5), x = 5

第二次 add(10), x = 15

第三次 add(40), x = 40

x的值是在上一次的结果上叠加

  • 不用闭包
x = 0

def add(v):
    global x
    x += v
    return x

print('第一次:' , add(1))
print('第二次:' , add(5))
print('第三次:' , add(6))
print('第四次:' , add(10))

结果

第一次: 1
第二次: 6
第三次: 12
第四次: 22
  • 使用闭包
x = 0

def start(x):
    def add(v):
        nonlocal x
        x += v
        return x

    return add

add = start(x)
print('第一次:' , add(1))
print('第二次:' , add(5))
print('第三次:' , add(6))
print('第四次:' , add(10))

使用nonlocal关键字

闭包的意义在于可以记录了上一次的值

Lambda 表达式

1. 匿名函数

没有函数名的函数

语法:

lambda parameter_list: expression

定义使用labmda关键字

expression只能是表达式

def add(x, y):
    return x + y


f = lambda x, y: x + y
print(f(1, 2))

2. 三元表达式

条件为真返回结果 if 条件 else 条件为假返回结果

x = 1
y = 6
print(x if x > y else y)

如果 x > y 返回 x 的值, 否则返回 y 的值

3. map类

map类接收两个参数, 一个是函数, 另一个是序列

map的使用方法是, 对序列中的每一个元素都进行前面函数的操作, 并把结果存放新的序列中, 最后返回

x = [1, 2, 3]

def square(x):
    return x * x

r = map(square, x)

print('结果: ', list(r))
print('x: ', x)

这个代码相当于使用for循环

x = [1, 2, 3]

def square(x):
    return x * x

# r = map(square, x)
r = []
for v in x:
    r.append(square(v))

print('结果: ', list(r))
print('x: ', x)

结果是一样的:

结果:  [1, 4, 9]
x:  [1, 2, 3]

4. map与lambda表达式结合使用

可以简化代码

x = [1, 2, 3]

r = map(lambda x: x + x, x)

print('结果: ', list(r))
print('x: ', x)

结果:

x = [1, 2, 3]

r = map(lambda x: x * x, x)

print('结果: ', list(r))
print('x: ', x)

使用多个序列, 需要注意, 后面传入的序列个数和lambda表达式参数个数一直

x = [1, 2, 3]
y = [10, 20, 30, 40]
# 传入x和y两个参数, lambda表示参数个数也是2
r = map(lambda x, y: x * y, x, y)

print('结果: ', list(r))
print('x: ', x)

结果:

结果:  [10, 40, 90]
x:  [1, 2, 3]

返回结果的长度是最小的序列长度

5. reduce函数

from functools import reduce

recude(函数, 序列, 初值)

from functools import reduce

def add(x, y):
    return x + y

x = [1, 2, 3]
r = reduce(add, x)
print(r)

结果

6

reduce()函数运算原理
  • 没有初值的情况

    第一次执行, 调用add(1, 2), r = add(1, 2)

    第二次执行, 调用add(r, 3), r = add(r, 3)

    此时, 序列已经执行到最后一个元素了, 返回执行的结果

    所以结果是: add(add(1, 2), 3)

  • 有初值的情况
    第一次执行, 调用add(初值, 2), r = add(初值, 2)

    第二次执行, 调用add(r, 2), r = add(r, 2)

    第三次执行, 调用add(r, 3), r = add(r, 3)

    此时, 序列已经执行到最后一个元素了, 返回执行的结果

    所以结果是: add(add(add(初值, 1), 2), 3)

from functools import reduce

def add(x, y):
    return x + y

x = ['1', '2', '3']
r = reduce(add, x, 'v')
print(r)

结果:

v123

6. filter函数

filter(函数, 序列)

例子: 保留x列表中值大于3的元素

x = [1, 2, 6, 5, 4, 3]

def fun(x):
    return True if x > 3 else False

r = filter(fun, x)

print(list(r))

装饰器

1. 引例

现在有三个函数, 在每个函数中都要输出函数调用的时间

import time

def practice():
    def func1():
        print(time.time())
        print('func1')

    def func2():
        print(time.time())
        print('func2')

    def func3():
        print(time.time())
        print('func3')

    return func1, func2, func3

printTime = practice()

for i in printTime:
    i()

结果:

1653194377.809377
func1
1653194377.809377
func2
1653194377.809377
func3

如果此时, 将打印时间改为打印函数名, 是不是需要对每一个函数进行修改?

修改是封闭的, 扩展是开放的, 修改不能解决根本

优化

import time

def practice():

    def printTime(func):
        print(time.time())
        func()

    def func1():
        print('func1')

    def func2():
        print('func2')

    def func3():
        print('func3')

    return func1, func2, func3, printTime


func1, func2, func3, printTime = practice()

printTime(func1)
printTime(func2)
printTime(func3)

结果:

1653194518.6538224
func1
1653194518.6538224
func2
1653194518.6538224
func3

为了更简便, 这就引入了装饰器

2. 装饰器

import time

# 定义装饰器
def decorator(func):
    def wrapper():
        print(time.time())
        func()

    return wrapper

def func1():
    print('func1')
    
# 使用装饰器
func1 = decorator(func1)
func1()

看上去, 这种使用跟printTime()这种方法没什么区别

3. 装饰器使用

使用@简化调用

使用方法: @装饰器名字

import time


def decorator(func):
    def wrapper():
        print(time.time())
        func()

    return wrapper

@decorator
def func1():
    print('func1')

func1()

结果

1653195433.3289523
func1

4. 对带有参数的函数定义装饰器

对于wrapper()函数使用可变参数

import time


def decorator(func):
    def wrapper(*parameters):
        print(time.time())
        func(*parameters)

    return wrapper

@decorator
def func1(x):
    print('func1', x)

@decorator
def func2(x, y):
    print('func1', x, y)    
    
func1(1)
func2('aaa', 'bbb')

结果:

1653196573.0688334
func1 1
1653196573.0688334
func1 aaa bbb

这种情况也有问题, 不兼容 **args参数

import time

def decorator(func):
    def wrapper(*parameters):
        print(time.time())
        func(*parameters)

    return wrapper

@decorator
def func1(**x):
    print('func1', x)

func1(a = 2, b = 3)

会报错

解决办法:

import time

def decorator(func):
    def wrapper(*parameters, **kwargs):
        print(time.time())
        func(*parameters, **kwargs)

    return wrapper

@decorator
def func1(**x):
    print('func1', x)


func1(a = 2, b = 3)

5. 带有参数的装饰器的理解

*parameters用于获取函数默认的传参顺序所获得的值

**kwargs用于获取可变参数列表的值

def decorator(func):
    def wrapper(*parameters, **kwargs):
        print(parameters)
        print(kwargs)
        func(*parameters, **kwargs)

    return wrapper

@decorator
def func1(p1, p2, **x):
    print('func1', p1, p2, x)


func1(1, 2, a = 2, b = 3)

结果:

(1, 2)
{'a': 2, 'b': 3}
func1 1 2 {'a': 2, 'b': 3}

6. 装饰器完整定义

def 装饰器名字(func):
    def wrapper(*parameters, **kwargs):
        所要执行的逻辑
        func(*parameters, **kwargs)

    return wrapper

使用

 @装饰器名称

7. 使用python装饰器保存内置变量的值

from functools import wraps

def 装饰器名字(func):
    @wraps(func)
    def wrapper(*parameters, **kwargs):
        所要执行的逻辑
        func(*parameters, **kwargs)

    return wrapper

8. 数据类装饰器 dataclass

用来简化构造函数赋值

原来的样子

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

使用修饰器

from dataclasses import dataclass

@dataclass
class Student:
    name: str
    age: int
    # def __init__(self, name, age):
    #     self.name = name
    #     self.age = age

    def showInfo(self):
        print(self.name, self.age)

student = Student('小米', 18)
student.showInfo()

看一下dataclass函数

def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False,
              unsafe_hash=False, frozen=False, match_args=True,
              kw_only=False, slots=False):
              ...

可以看出, 在@dataclass后面可以指定参数

init=True 表示默认产生构造函数

用字典映射代替switch case

C语言中的switch case语句

switch (表达式) {
    case 整型数值1: 语句 1;
    case 整型数值2: 语句 2;
    ......
    case 整型数值n: 语句 n;
    default: 语句 n+1;
}

python中使用字典

switcher = {1: 函数12: 函数2
    ......
    值n: 函数n
}

r = switcher.get(, default函数)()

例子: 输入1 ~ 7之间的数字, 输出对应的星期

def isMonday():
    return '星期一'

def isTuesday():
    return '星期二'

def isWednesday():
    return '星期三'

def isThursday():
    return '星期四'

def isFriday():
    return '星期五'

def isSaturday():
    return '星期一'

def isSunday():
    return '星期天'

def default():
    return '输入错误'

switcher = {
    1: isMonday,
    2: isTuesday,
    3: isWednesday,
    4: isThursday,
    5: isFriday,
    6: isSaturday,
    7: isSunday
}

v = input()
r = switcher.get(int(v), default)()
print(r)

列表推导式

列表推导式: 使用列表, 字典, 元组, 集合, 创建一个新的列表, 字典, 元组, 集合

(1). 简单使用

[ 表达式 i for in x ]

def add(x):
    return x + x

x = [1, 2, 3]

b = [add(i) for i in x if i == 2]

print(b)

结果:

[2, 4, 6]

(2). 带有条件的列表推导式

[ 表达式 i for in x if 表达式 ]

当i满足条件e()时, 执行f(), 将结果放入新的列表中

def add(x):
    return x + x

def condition(x):
    return x == 2

x = [1, 2, 3]

b = [add(i) for i in x if condition(i)]

print(b)

结果:

[4]

(3). 使用列表推导式创建元组

def add(x):
    return x + x

def condition(x):
    return x >= 2

x = [1, 2, 3, 4, 5]

b = (add(i) for i in x if condition(i))

print(b)

结果:

<generator object <genexpr> at 0x00000134B19F18C0>

此时结果不是元组, 而是一个generator, 遍历一下generator

def add(x):
    return x + x

def condition(x):
    return x >= 2

x = [1, 2, 3, 4, 5]

b = (add(i) for i in x if condition(i))

for i in b:
    print(i)

结果:

4
6
8
10

转换一下可以得到元组

def add(x):
    return x + x

def condition(x):
    return x >= 2

x = [1, 2, 3, 4, 5]

b = tuple((add(i) for i in x if condition(i)))

print(b)

结果:

(4, 6, 8, 10)

(4). 字典列表推导式

items()
students = {
    '张三': 18,
    '李四': 19,
    '王五': 21
}

s = [key for key, value in students.items()]

print(s)

结果:

['张三', '李四', '王五']

需要注意的是, 字典遍历需要使用items()函数

字典推导字典

将students字典中的key变成value, value变成key

students = {
    '张三': 18,
    '李四': 19,
    '王五': 21
}

s = {value: key for key, value in students.items()}

print(s)

结果:

{18: '张三', 19: '李四', 21: '王五'}

函数式编程

for i in range(start, end, step = 1):
    pass

代替

[pass for i in range(start, end, step = 1)]
list(
    map(lambda i: dosomething, [i for i in range(start, end, step = 1)])
)

迭代器

(1). 可迭代对象 和 迭代器

可迭代对象: 可以使用for-in循环遍历的对象

迭代器: 是一个类, 可以被for-in循环遍历

(2). 自定义迭代器

类实现两个函数, __iter__()__next__()

def __iter__(self):
    pass

def __next__(self):
    pass

例子:

class BookCollection:
    def __init__(self):
        self.data = ['1', '2', '3']
        self.cur = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.cur >= len(self.data):
            self.cur = 0
            raise StopIteration()
        r = self.data[self.cur]
        self.cur += 1
        return r


books = BookCollection()
[print(i) for i in books]

结果:

1
2
3

生成器

生成器是针对函数的, 保存一个算法

def generate(end):
    n = 0
    while n < end:
        n += 1
        yield n

print(generate(100))

使用列表推导式得到生成器

print(i for i in range(1, 9))

海象运算符 :=

可以使用在if中, 使得函数调用的值赋给一个变量, 同时进行条件判断操作, 省去了在外定义变量

a = "Python"

if l := len(a) > 5:
    print(l)

结果:

6

使用前:

a = "Python"
l = len(a)
if l > 5:
    print(l)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 之 进阶 学习 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • keil提示No Browse Information available in ‘..\OBJ\SPI‘解决方法

    1 No Browse Information available in OBJ SPI 解决方法 https blog csdn net frozennet article details 107213145
  • Maven入门详解与安装配置

    Maven Maven出现前的问题 假设你现在做了一个项目 项目中肯定要用到一些jar包 比如说mybatis log4j JUnit等 除了这些之外 你有可能用到你的同事开发的其他的东西 比如说别人做了一个财务模块或做了一个结算的模块 你
  • Gradle 入门到精通(三)

    前言 根据我们上一篇的介绍 我们知道了项目的结构以及构建的流程 根据上面的知识 我们知道了构建的规则实际就是我们写在build gradle的内容 gradle android插件读取这个文件的内容后 最后完成构建工作 在讲解实际内容前 我
  • 基于JSP的医院预约挂号管理系统

    项目背景 网络的广泛应用给生活带来了十分的便利 所以把医院预约挂号管理与现在网络相结合 利用java技术建设医院预约挂号系统 实现医院预约挂号的信息化 则对于进一步提高医院预约挂号管理发展 丰富医院预约挂号管理经验能起到不少的促进作用 医院
  • 通俗易懂解释知识图谱

    通俗易懂解释知识图谱 Knowledge Graph 1 前言 2 知识图谱定义 3 数据类型和存储方式 4 知识图谱的架构 4 1 逻辑架构 4 2 技术架构 5 信息抽取 5 1 实体抽取 Entity Extraction 5 2 关
  • linux日志筛选查找命令

    日志实时监控 tail f spring log 关键字实时监控 tail f spring log grep key 如果没有特殊字符 可以不用引号 如果关键字有引号使用单引号和双引号配合使用 输出匹配内容上下行 输出匹配行以及下面5行
  • python函数中文手册-Python参考手册(第4版)

    第一部分 Python语言 第1章 Python简介 2 1 1 运行Python 2 1 2 变量和算术表达式 3 1 3 条件语句 5 1 4 文件输入和输出 6 1 5 字符串 7 1 6 列表 8 1 7 元组 9 1 8 集合 1
  • 一文搞懂常见的git操作

    git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch a 查看所有的分支 git branch r 查看远程所有分支 git commit am nit 提交并且加注释
  • Vue中如何进行自定义动画与动画效果设计

    Vue中如何进行自定义动画与动画效果设计 在Vue中 动画效果是非常有用的 它可以使用户界面变得更加生动 有趣 从而提高用户体验 Vue提供了一套非常方便的动画系统 使得我们可以非常容易地实现动画效果 在本文中 我们将学习如何在Vue中进行
  • 【Qt教程】1.10 - Qt5模态与非模态对话框( QDialog)

    1 对话框简介 对话框简介 通常是一个顶层窗口 出现在程序最上层 用于实现短期任务或者简洁的用户交互 对话框分为模态对话框和非模态对话框 模态对话框 会阻塞同一应用程序中其他窗口的输入 非模态对话框 可以在显示的同时 也能对其他窗口进行操作
  • 下载csdn的文章

    下载csdn的文章 在文章界面点击开发者选项 到console界面 输入 function side remove comment title comment list comment bar comment form announce a
  • vue 角色权限控制页面,页面内的按钮。总结思路

    页面权限控制 动态路由 前端创建asyncRoutes 添加meta auth true auth 为false时不受权限控制 都会显示 后端返回有权限的menu tab button tab routes push resRoutes T
  • 复习之Linux系统中的用户管理

    1 用户及用户组的意义 在Linux中 用户 User 和用户组 Group 是管理系统权限和资源访问的重要概念 1 用户 用户是指系统中的一个身份标识 每个用户都有自己的用户名和密码 每个用户可以拥有自己的文件 进程和权限 通过用户名和密
  • 了解SpringBoot自动配置原理一

    一 自动配置原理入门 一 SpringBootApplication注解 此注解包含三个注解 SpringBootConfiguration EnableAutoConfiguration ComponentScan 一 SpringBoo
  • Ubuntu系统下多版本cuda切换

    Ubuntu系统下多版本cuda切换 操作步骤 参考链接 操作步骤 查看当前cuda软链接的指向 cd usr local stat cuda 删除旧的软链接 rm rf usr local cuda 根据需要创建新的软链接 ln s us
  • 将切片作为参数传入函数并使用append方法遇到的问题

    切片的内部结构 type SliceHeader struct Data uintptr Len int Cap int 由切片的结构定义可知 切片的结构由三个信息组成 指针Data 指向底层数组中切片指定的开始位置 长度Len 即切片的长
  • vscode是付费的吗_vscode免费吗

    vscode免费吗 Visual Studio Code 简称 VS Code VSC 是一款免费开源的现代化轻量级代码编辑器 支持语法高亮 智能代码补全 自定义热键 括号匹配 代码片段 代码对比 Diff GIT 等特性 并针对网页开发和
  • java自动化测试语言高级之数据结构

    java自动化测试语言高级之数据结构 文章目录 java自动化测试语言高级之数据结构 Java 数据结构 Java 数据结构 Java工具包提供了强大的数据结构 在Java中的数据结构主要包括以下几种接口和类 枚举 Enumeration
  • ELK(elastic search+logstash+kibana)日志收集系统简单搭建(版本6.5.3)

    现在基本上有一定规模负载的项目都会用分布式来部署项目 分布式带来的好处自然就是很直观的扩大了项目的负载能力 但是随之而来的弊端就是在运维部署以及维护时候的复杂度直线上升 一个典型的例子就是项目的日志收集变得困难重重 试想如果线上的一个业务出
  • Python 之 进阶 学习

    学习 Python 之 进阶学习 一切皆对象 1 变量和函数皆对象 2 模块和类皆对象 3 对象的基本操作 1 可以赋值给变量 2 可以添加到集合中 3 可以作为函数参数 4 可以作为函数返回值返回 4 object type class之