python基础实战6-python字符串

news2024/11/24 12:57:35

1字符串的表达方式

字符串是 Python 中最常用的数据类型。我们可以使用引号 ( ' 或 " ) 来创建字符串。

字符串表达方式

a = " I ' m Tom" #一对双引号

b =’Tom said:" I am Tom" ' #一对单引号

c = ‘Tom said: " I\'m Tom" ' #转义字符

d = ' ' ' Tom said: "I'm Tom " ' ' ' # 三个单引号

e = " " " Tom said:"I'm Tom" " " "# 三个双引号

总结:

  • 双引号或者单引号中的数据,就是字符串
  • 如果使用一对引号来定义字符串,当出现符号冲突时,可以使用转义字符
  • 使用三个单引号、双引号定义的字符串可以包裹任意文本

1.1 转义字符

在Python中具有特殊含义的字符,以 \ 开头

转义字符描述
\(在行尾时)续行符
\\代表一个反斜线字符\
\'单引号,用来显示一个单引号
\''双引号,用来显示一个双引号
\a响铃
\b退格(Backspace)
\e转义
\000
\n换行,将当前位置移到下一行开头
\v纵向制表符
\t横向制表符,用来表示一个制表符
\r回车,将当前位置移到本行开头
\f换页
\oyy八进制数,yy代表的字符,例如:\o12代表换行
\xyy十六进制数,yy代表的字符,例如:\x0a代表换行
\other其它的字符以普通格式输出

2 字符串的运算

在python中,字符串可以使用以下运算符:

+

*

in 

not in

is

is not

==

!=

可以使用*运算符来实现字符串的拼接,可以使用*运算符来重复一个字符串的内容,可以使用in和not in来判断一个字符串是否包含另外一个字符串,我们也可以用[]和[:]运算符从字符串取出某个字符或某些字符。

2.1 使用+和*运算符实现字符串的拼接和重复操作。

s1 = 'hello' + ' ' +'world'
print(s1) #结果 hello world

s2 = '!' * 3
print(s2)#结果 !!!

s1 += s2   #s1 = s1 + s2
print(s1) # 结果:hello world!!!

s1 *= 2  #s1 = s1 * 2
print(s1) #结果:hello world!!!hello world!!!

2.2 比较运算,比较两个字符串的相等性或大小

字符串在计算机内存中也是以二进制形式存在的

字符串的比较其实比的的是:每个字符对应的编码的大小

例如A的编码是65,而a的编码是97,所有'A' < 'a'的结果相当于就是65 < 97的结果,结果为True。

'boy' < 'bad',因为第一个字符都是'b' 比不出大小,所以实际比较的是第二个字符的大小。因为'o' < 'a'的结果是False,所以'boy' < 'bad'的结果也是False。

如果不清楚两个字符对应的编码是多少,可以使用ord函数来获得。

例如ord('A')的值是65,而ord('黄')的值是40644

s1 = 'how are you'
s2 = 'I am fine'
print(s1 == s2) # false
print(s1 > s2) #True

print(s2 == 'I am fine') #True
print(s2 == 'i am fine') # False
print(s2 != 'i am fine') # True

s3 = '黄一'
print(ord('黄'),ord('一')) # 40644 19968
s4 = '李三五'
print(ord('李'),ord('三'),ord('五')) #26446 19977 20116
print(s3 > s4,s3 <= s4) #True False

注意:字符串的比较运算比较的是字符串的内容,python中还有一个is运算符(身份运算符),如果用is来比较两个字符串,它比较的是两个变量对应的字符串是否在内存中相同的位置(内存地址),简单的说就是两个变量是否对应内存中的同一个字符串。

s1 = 'hello world'
s2 = 'hello world1'
s3 = s2
#比较字符串的内容
print(s1 == s2,s2 == s3) #False True
#比较字符串的内存地址
print(s1 is s2,s2 is s3) # False True

总结:s1 == s2比较的是字符串里面的内容,只要内容相同结果就是True,不同就是False;而s1 is s2则比较的是内存地址,两者内存是不一样的所以False。

 2.3 成员运算

用in 和not in判断一个字符串中是否存在另外一个字符或字符串

in 和not in运算通常称为成员运算,会产生布尔值True或False

s1 = 'hello world'
print('he' in s1) # True
s2 = 'sensitive'
print(s2 in s1) #False

2.4 获取字符串长度

 获取字符串长度使用内置函数len

s = 'hello, world'
print(len(s))  # 12
print(len('sensitive')) # 9

3 字符串的下标和切片

3.1 下标/索引

“下标”又叫“索引”,就是编号,就好比学校里,每个学生的学号,通过这个学号就能找到相应的学生的基本信息。

如果有字符串:name = ’abcdef‘,在内存中的实际存储如下:

如果想取出部分字符,那么可以通过下标的方法。(在计算机中,下标从0开始)

name = 'abcdef'

print(name[0])
print(name[1])
print(name[2])

运行结果:

 以name = 'abcdef'为例,要把e取出来,该怎么取?

 从上图可以看出,e对应的索引是4

print(name[4]) #取字母e

取name = 'abcdef' 最后一个字母?

print(name[5]) # f
print(name[-1]) # f

 字符串索引机制:

1、 0~len(name) -1

2、-len(name) ~ -1

3.2 字符串切片 

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。

切片的语法:[起始:结束:步长],也可以简化使用[起始:步长]

注意:选取的区间从“起始”位开始,到“结束”位的前一位结束(不包含结束位本身),步长表示选取间隔。

#索引是通过下标取某一个元素
#切片是通过下标取某一段元素

#格式:字符串变量[start:end]
#字符串变量[start : end : step] 默认是从左向右一个一个取元素
#step: 
#    1.步长
#    2.方向    step为正数时,从左向右取数
               step为负数时,从右向左取数

s = 'Hello world'
print(s)

print(s[4]) # o字符串里的第4个元素

print(s[3:7]) # lo w 包含下标3,不含下标7

print(s[:]) # Hello world取出所有元素(没有起始和结束位之分),默认步长为1

print(s[1:]) # ello world从下标为1开始,取出 后面所有的元素(没有结束位)

print(s[:4])  # Hell 从起始位置开始,取到 下标为4的前一个元素(不包括结束位本身)

print(s[:-1]) # Hello worl 从起始位置开始,取到 倒数第一个元素(不包括结束位本身)

print(s[-4:-1]) # orl 从倒数第4个元素开始,取到 倒数第1个元素(不包括结束位本身)

print(s[1:5:2]) # el 从下标为1开始,取到下标为5的前一个元素,步长为2(不包括结束位本身)

print(s[7:2:-1]) # ow ol 从下标为7的元素开始(包含下标为7的元素),倒着取到下标为2的元素(不包括下标为2的元素)

# python 字符串快速逆置w
print(s[::-1])  # dlrow olleH 从后向前,按步长为1进行取值

4 字符串的常见操作

字符串的常见操作包括

获取长度len
查找内容find,index,rfind,rindex
判断startswith,endswith,isalpha,isdigit,isalnum,isspace
计算出现次数count
替换内容replace
切割字符串split,rsplit,splitlines,partition,rpartition
修改大小写capitalize,title,upper,lower
空格处理ljust,rjust,center,lstrip,rstrip,strip
字符串拼接join

注意:在python中,字符串是不可变的!所有的字符串相关方法,都不会改变原有的字符串,都是返回一个结果,在这个新的返回值里,保留了执行后的结果!

4.1 len函数

len函数可以获取字符串的长度。

mystr = '你最近过得好嘛!我过的超级好丫!!!'
print(len(mystr)) # 获取字符串的长度为18

4.2 查找

4.2.1 find

find:从左向右查找,只要遇到一个符合要求的则返回位置,如果没有找到任何符合要求的则返回 -1

#取出e564de54s4e5496sed4f98e46as4f648.gif
path = 'https://www.baidu.com/img/dong_e564de54s4e5496sed4f98e46as4f648.gif'
i = path.find('_')
print(i) #打印下划线所在的位置
image_name = path[i+1:]
print(image_name)


i = path. Find('#')
print(i)

运行结果:

4.2.2 rfind

rfind从右向左查找,只要遇到一个符合要求的则返回位置,如果没有找到任何符合要求的则返回-1

#rfind 
#快速取出.gif
path = 'https://www.baidu.com/img/dong_e564de54s4e5496sed4f98e46as4f648.gif'
i = path.rfind('.')
zhui = path[i:]
print(zhui)

4.2.3 count

count:统计指定字符的个数

'''
查找字符串中有几'.'
'''
path = 'https://www.baidu.com/img/dong_e564de54s4e5496sed4f98e46as4f648.gif'
n = path. Count('.')
print(n)

4.2.4 index

index与find的区别:index也表示查找,但是如果找不到会报错

path = 'https://www.baidu.com/img/dong_e564de54s4e5496sed4f98e46as4f648.gif'
i = path. Index('#')
print(i)

运行结果

 4.2.5 rindex

类似于index(),不过是从右边开始。如果找不到则会报错

4.3 判断

可以通过字符串的startswith、endswith来判断字符串是否以某个字符串开头和结尾;

还可以用is开头的方法判断字符串的特征,这些方法都返回布尔值。

1.startswith():判断字符串是否以指定的字符串开头,返回布尔值结果

2.endswith():判断字符串是否以指定的字符串结尾,返回布尔值结果

3.isdigit():判断字符串是否由数字构成,返回布尔值结果

4.isalpha():判断字符串是否以字母构成,返回布尔值结果

5.isalnum():判断字符串是否以数字和字母构成,返回布尔值结果

6.isspace():判断字符串里是否只包含空格,返回布尔值结果

7.isupper():判断是否全部都是大写字母,返回布尔值结果

8.islower():判断是否全部都是小写字母,返回布尔值结果

s1 = 'hello world!'
#startswith方法检查字符串是否以指定的字符串开头返回布尔值
print(s1.startswith('He')) #False
print(s1.startswith('hel')) #True

#endswith方法检查字符串是否以指定的字符串结尾返回布尔值
print(s1.endswith('!'))

s2 = 'abc123456'

#isdigit方法检查字符串是否由数字构成返回布尔值
print(s2.isdigit()) #False

#isalpha方法检查字符串是否以字母构成返回布尔值
print(s2.isalpha()) #False

#isalnum方法检查字符串是否以数字和字母构成返回布尔值
print(s2.isalnum()) # True

#isspace方法判断字符串里是否只包含空格

s3 = ''
print(s3.isspace()) #False s3是一个空字符串

s4 = '  '
print(s4.isspace()) #True 只有空格

s5 = '  d'
print(s5.isspace()) # False 除了空格还有其他内容


#isupper方法判断字符串是否全部都是大写字母
s6 = 'HELII'
result = s6.isupper() # 判断是否全部都是大写字母
print(result) #True


#islower判断是否全部都是小写字母
s7 = 'hello'
r = s7.islower()
print(r)  #True

模拟文件上传


'''
模拟文件上传,键盘输入上传文件的名称(abc.jpg),判断文件名(abc)是否大于6位以上,扩展名是否:jpg,gif,png格式
如果不是则提示上传失败,如果名字不满足条件,而扩展名满足条件则随机生成一个6位数组成的文件名,打印成功上传xxxxx.png
判断名字
'''
import random

file = input('输入图片文件全称:')
#判断扩展名
if file.endswith('jpg') or file.endswith('gif') or file.endswith('png'):
    #判断文件的名字
    i = file.rfind('.')
    name = file[:i]
    #len(name)
    if len(name)<6:
        #重新构建名字,产生字母和数字的组合名称
        filename = ''
        s = 'shSAHFWEOGHOAAEFAaoehagagh324564faljfeaeawehfiaghsajfioe123456789'
        for a in range(6):
            index = random.randint(0,len(s)-1) # 随机产生下标
            filename += s[index]  #获取下标匹配的字母
        #filename 文件名 和后缀进行拼接
        file = filename + file[i:]
        #完整的文件全称名字
    print('成功上传%s文件' %file)
else:
    print('文件格式错误,上传失败!')

 运行结果

 

简单登录验证

需求:

admin123  15811119999 200325
用户名或者手机号码登录 + 密码:

用户名:全部小写,首字母不能是数字,长度必须6位以上
手机号码:纯数字 长度11位
密码必须是6位数字

以上条件符合则进入下层验证:
判断用户名+密码 是否是正确的,正确则成功,否则登录失败
flag = True
while flag:
    name = input('用户名/手机号码:')
    #判断
    if (name.islower() and not name[0].isdigit() and len(name) >= 6) or (name.isdigit() and len(name) == 11):
        # 继续输入密码,密码输入错误允许多次输入
        while True:
            password = input('密码:')
            #判断是否是6位数字
            if len(password) == 6 and password.isdigit():
                #验证name + 密码,正确性
                if (name == 'admin123' or name == '15811119999') and password=='200325':
                    print('用户登录成功!')
                    flag = False
                    break
                else:
                    print('用户名或者密码有误!')
                    break
            else:
                print('密码必须是6位数字')
    else:
        print('用户名或手机号码格式错误!')

4.4 替换

替换内容replace(old,new,count) 默认全部替换,也可以通过count指定次数

s = '王五你好,张三李四可以进去吗?张三李四可以进去吗?'
result = s.replace('张三李四','****',1)
result2 = s.replace('张三李四','****')
print(result)
print(result2)

运行结果

 4.5 切割

4.5.1 split

以指定字符串为分隔符切片,如果 maxsplit有指定值,则仅分隔 maxsplit+1 个子字符串。返回的结果是一个列表。

mystr = '今天天气好晴朗,处处好风光呀好风光'
result = mystr.split() # 没有指定分隔符,默认使用空格,换行等空白字符进行分隔
print(result) #['今天天气好晴朗,处处好风光呀好风光'] 没有空白字符,所以,字符串未被分隔

result = mystr.split('好')  # 以 '好' 为分隔符
print(result) # ['今天天气', '晴朗,处处','风光呀,'风光']

result = mystr.split("好",2) # 以 '好' 为分隔符,最多切割成3份
print(result) # ['今天天气', '晴朗,处处', '风光呀好风光']

 4.5.2 rsplit

用法和splti基本一致,只不过是从右往左分隔

mystr = '今天天气好晴朗,处处好风光呀好风光'
print(mystr.rsplit('好',1))  #['今天天气好晴朗,处处好风光呀', '风光']

4.5.3 splitlines

按照行分隔,返回一个包含各行作为元素的列表。

mystr = 'hello \nworld'
print(mystr.splitlines())

4.5.4 partition

把mystr以str分割成三部分,str前,str和str后,三部分组成一个元组

mystr = '今天天气好晴朗,处处好风光呀好风光'
print(mystr.partition('好'))  # ('今天天气', '好', '晴朗,处处好风光呀好风光')

4.5.5 rpartition

类似于 partition()函数,不过是从右边开始.

mystr = '今天天气好晴朗,处处好风光呀好风光'
print(mystr.rpartition('好'))   # ('今天天气好晴朗,处处好风光呀', '好', '风光')

4.6 修改大小写

修改大小写的功能只对英文有效,主要包括,首字母大写capitalize,每个单词的首字母大写title,全小写lower,全大写upper。

4.6.1 capitalize

第一个单词的首字母大写

mystr = 'hello world'
print(mystr.capitalize()) # Hello world

4.6.2 title

每个单词的首字母大写

mystr = 'hello world'
print(mystr.title()) # Hello World

4.6.3 lower

所有都变成小写

mystr = 'hElLo WorLD'
print(mystr.lower()) # hello world

4.6.4 upper

所有都变成大写

mystr = 'hello world'
print(mystr.upper())  #HELLO WORLD

4.7 空格处理

4.7.1 ljust

返回指定长度的字符串,并在右侧使用空白字符补全(左对齐)

str = 'hello'
print(str.ljust(10))  # hello     在右边补了五个空格

4.7.2 rjust

返回指定长度的字符串,并在左侧使用空白字符补全(右对齐)

str = 'hello'
print(str.rjust(10))  #      hello在左边补了五个空格

4.7.3 center

返回指定长度的字符串,并在两端使用空白字符串补全(居中对齐)

str = 'hello'
print(str.center(10))  #  hello   两端加空格,让内容居中

4.7.4  strip

strip删除两端的空白字符 

s = '   helloworld@qq.com   \t\r\n'
#strip方法获得字符串修剪左右两侧空格之后的字符串
print(s.strip()) # helloworld@qq.com

4.7.5 lstrip

lstrip删除左边的空白字符

s = '   he    llo   '
print(s.lstrip())#he    llo

4.7.6 rstrip

rstrip删除右边的空白字符 

s = '   he    llo   '
print(s.rstrip()) #   he    llo

4.8 拼接

 字符串拼接 mystr .join(iterable)

把参数进行遍历,取出参数里的每一项,然后再在后面加上mystr

mystr = 'a'
print(mystr.join('hxmdq'))  #haxamadaq  把hxmd一个个取出,并在后面添加字符a. 最后的 q 保留,没有加 a
print(mystr.join(['hi','hello','good']))  #hiahelloagood

作用:可以把列表或者元组快速的转变成为字符串,并且以指定的字符分隔

txt = '_'
print(txt.join(['hi','hello','good'])) #hi_hello_good
print(txt.join(('good','hi','hello'))) #good_hi_hello

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

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

相关文章

python库,科学计算与数据可视化基础,知识笔记(numpy+matplotlib)

文章目录 1、numpyndarray对象&#xff0c;数组指定形状创建&#xff08;要会&#xff09;数组的索引&#xff0c;切片与遍历&#xff08;要会&#xff09;数组的相加&#xff0c;转置&#xff0c;展开&#xff08;要会&#xff09;数组元素增删改查&#xff08;最好会&#xf…

当CRM遇见ChatGPT,AI如何帮销售打造“最强大脑”

导读&#xff1a;这一轮AI浪潮将对CRM企业带来哪些新机遇&#xff1f; ChatGPT诞生至今不过100多天&#xff0c;但它已经对很多行业产生了巨大影响。 企业直面市场的一线战场——销售、营销、客服等领域也是如此。以ChatGPT为代表的人工智能技术热潮正在改变着传统营销、销售的…

MySQL--group by--聚合函数--内置函数--0415 22

目录 1.聚合函数 1.1 count 1.2 sum 1.3 avg 1.4 max 和 min 2. group by 2.1 group by 的条件筛选——having 2.2 总结 3.日期函数 4.字符串函数 concat replace substring 以首字母大写&#xff0c;其余字母小写的方式显示员工的姓名 5.数学函数 format rand()…

C plus plus ——【继承与派生】

系列文章目录 C plud plus ——【面向对象编程】 C plus plus ——【继承与派生】 文章目录 系列文章目录前言一、继承1.1 类的继承1.2 继承后可访问性1.3 构造函数访问顺序1.4 子类隐藏父类的成员函数 二、重载运算符2.1重载运算符的必要性2.2重载运算的形式与规则2.3 转换运…

数字信号处理学习1

基本上算是没怎么学过数字信号处理这门课&#xff0c;因为本科的时候&#xff0c;专业方向用不上&#xff0c;现在没法子了&#xff0c;专业使然&#xff0c;只能自己自学了&#xff0c;但是我又不知道该从何学起&#xff0c;就买了一本现代数字信号处理&#xff0c;结果发现人…

数据结构/队列实现栈

前言 在学习数据结构的过程当中&#xff0c;我们会学到栈和队列&#xff0c;在本篇文章中&#xff0c;重点讲解的是队列实现栈&#xff0c;在上篇文章中已经简单介绍过栈和队列的使用说明&#xff0c;以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客…

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己 主要是吴恩达的网课&#xff0c;还有部分github的prompt-engineering-for-developers项目&#xff0c;以及部分自己的经验。 一、常用使用技巧 prompt最好是英文的&#xff0c;如果是中文的prompt&am…

Day961.老城区前端改造 -遗留系统现代化实战

老城区前端改造 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于老城区前端改造的内容。 什么是“改造老城区”。改造老城区模式 是指对遗留系统内部的模块进行治理&#xff0c;让模块内部结构合理、模块之间职责清晰的一系列模式。 也就是说&#xff0c;在遗留系统…

【Redis】聊一下Redis基础架构

我们知道学习一个技术&#xff0c;最好的方式就是从全局观出发&#xff0c;然后针对不同的点进行拆分&#xff0c;一个个破解。既可以将学到的和已有的知识联系起来&#xff0c;又可以有一定的深度和目的性。 Redis基础架构 对于一个中间件来说&#xff0c;一个是使用层面&…

GO数组切片-线性数据结构

数据结构 类型 什么是类型 &#xff1f; 内存中的二进制数据本身没有什么区别&#xff0c;就是一串0或1的组合。 内存中有一个字节内容是0x63&#xff0c;他究竟是深恶 字符串?字符&#xff1f;还是整数&#xff1f; 本来0x63表示数字 但是文字必须编码成为0和1的组合 才能记…

【C++】红黑树源码剖析

目录 概述 算法 调整策略 源码 RBTree.h test.cpp 概述 红黑树&#xff0c;是一种二叉搜索树&#xff0c;每一个节点上有一个存储位表示节点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一…

ChatGPT、文心一言、New Bing到底哪个更AI?

Hello 各位小伙伴&#xff0c;要说今年最火爆的 IP 有哪些&#xff0c;那一定少不了人工智能&#xff08;AI&#xff09;&#xff0c;市面上已经相继出现了我们熟知的 ChatGPT&#xff08;OpenAI&#xff09;、ChatGPT 国外镜像网站、文心一言&#xff08;百度&#xff09;、Ne…

MySQL --- DDL图形化工具表结构操作

一. 图形化工具 1. 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句&#xff0c;在我们编写这些SQL时&#xff0c;都是在命令行当中完成的。大家在练习的时候应该也感受到了&#xff0c;在命令行当中来敲这些SQL语句很不方便&#xff0c;主要的原因有以下 3 点&#xff1a;…

redis的介绍和安装

文章目录 一、redis的介绍和安装1.1 初识redis1.1.1 redis是什么&#xff1f;1.1.2 redis能做什么&#xff1f; 1.2 redis的安装配置 一、redis的介绍和安装 1.1 初识redis 1.1.1 redis是什么&#xff1f; Redis是一个开源的内存数据存储系统&#xff0c;也可以被用作数据库、…

阿里云服务器vCPU和CPU有区别吗?

阿里云服务器vCPU是什么&#xff1f;vCPU和CPU有什么区别&#xff1f;CPU是指云服务器的中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

探索三维世界【3】:Three.js 的 Geometry 几何体 与 Material 材质

探索三维世界【3】&#xff1a;Three.js 的 Material 材质 1、Geometry几何体2、Material 材质3、创建平面与材质4、多平面渲染 1、Geometry几何体 Three.js中的几何体Geometry是构成3D模型的基本单元之一&#xff0c;它定义了一个物体的形状和大小。Geometry包含了物体的顶点…

RK3568平台开发系列讲解(网络篇)网络包的接收过程

🚀返回专栏总目录 文章目录 一、内核接收网络包过程二、用户态读取网络包过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来梳理下网络包的接收过程。 一、内核接收网络包过程 硬件网卡接收到网络包之后,通过 DMA 技术,将网络包放入 Ring Buffer;…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

HTTP 缓存新鲜度 max-age

新鲜度 理论上来讲&#xff0c;当一个资源被缓存存储后&#xff0c;该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本&#xff0c;所以缓存会定期地将一些副本删除&#xff0c;这个过程叫做缓存驱逐。另一方面&#xff0c;当服务器上面的资源进行了更…

使用ControlNet控制Stable-Diffusion出图人物的姿势

概述 在Stable-Diffusion&#xff08;以下简称SD&#xff09;出图中&#xff0c;我们往往需要对出图人物的姿势进行控制&#xff0c;这里我使用一个比较简单上手的方法&#xff0c;通过ControlNet可以很方便地对画面风格&#xff0c;人物姿势进行控制&#xff0c;从而生成更加…