四.python核心语法2

news2024/10/22 9:38:51

目录

1.元组(tuple)

1.1. 创建元组和删除元组

1.2. 删除元组

1.3. 访问元组元素

1.4. 元组元素的修改

       1) 重新赋值法

       2) 类型转换法

1.5. 总结

2.字典{dictionary}

2.1. 创建

2.2. 字典元素的访问

2.3. 是否存在

2.4. 添加元素

2.5. 删除元素

2.6. 修改元素

2.7.常用函数

2.8.混合字典

3.集合{set}

3.1. 创建集合

3.2. 清空集合

3.3. 添加元素

3.4. 删除元素

3.5.集合运算

4.字符串(string)

4.1.基本操作

4.2.常用方法

4.3.测试方法

4.4.修改方法

4.3. 搜索方法

4.4. 替代方法

4.5.格式化字符串

练习


1.元组(tuple)

元组是一种不可改变的序列,它里面的内容是不可以被改变的。元组属于序列,它和列表相似,最主要的区别就是元组创建之后就不能再对里面的元素进行增删操作。

元组的一般形式为:

1

(1,2,3,4,5,6)

它与列表结构的区别在于它使用小括号‘()’,里面每个元素之间用‘,’隔开,在元组中同样可以存放整数、字符串、列表等类型的内容。

1.1. 创建元组和删除元组

创建可以采用多种方式。

       1) 创建空元组

创建空元组和列表方式一样,语法格式为:

1

my_tuple = ()

下面看个例子:

1

2

3

my_tuple = ()#创建空元组

print(my_tuple)#输出

print('数据类型',type(my_tuple))#看一下它的类型

输出结果:

1

2

()

数据类型 <class 'tuple'>

       2) 直接赋值创建元组

赋值创建元组的方式也相对简单,大家学过列表之后学习后面的都很方便,一定要好好掌握列表中的相关内容。

直接赋值的语法格式:

1

my_tuple = (value1,value2,value3,value4,value5)

my_tuple为列表名,value1~value5位元组中的各个元素,可以是整数、字符串或者列表,看下面的例子:

1

2

my_tuple = ('www.dotcpp.com','123456',[1,2,3,4,5,6])#创建元组并直接进行赋值

print(my_tuple)#输出

输出结果:

1

('www.dotcpp.com''123456', [12345])

       3) 使用range()函数创建 

使用range()函数我们可以创建具有一定数据规模的元组。看下面例子:

1

2

my_tuple = tuple(range(1,100,3))#range(1,100,3)创建了一个1-100之间步长为3的序列,最后使用tuple()强制转换为元组类型

print(my_tuple)#输出

输出为:

1

2

(1471013161922252831343740434649525558,  61, 646770737679828588919497)

1.2. 删除元组

删除元组的方式和列表相同,使用del语句直接进行删除,语法形式为:

1

del my_tuple

如下例:

1

2

3

4

5

6

>>> my_tuple = tuple(range(1,100,3))#range(1,100,3)创建了一个1-100之间步长为3的序列,最后使用tuple()强制转换为元组类型

>>> del my_tuple#删除元祖

>>> print(my_tuple)#这时候再输出就会报错

Traceback (most recent call last):

  File "<stdin>", line 1in <module>

NameError: name 'my_tuple' is not defined

1.3. 访问元组元素

我们在访问元组元素的时候同样是根据索引位置去找到所要访问的元素。

我们先创建一个元组 my_tuple = (‘a’,’b’,’c’,’d’)

然后看一下代码:

1

2

my_tuple = ('a','b','c','d')

print(my_tuple[0],my_tuple[1],my_tuple[2],my_tuple[3])

输出结果:

1

a b c d

看一下对应表格:

元组abc
索引012

1.4. 元组元素的修改

因为元组是不可变的数列,所以我们不可以对其元素进行修改,如果采用列表形式直接通过索引值进行修改的话会出现错误信息。

1

2

3

4

5

>>> my_tuple = (1,2,3,4,5,6)

>>> my_tuple[2= 6

Traceback (most recent call last):

  File "<stdin>", line 1in <module>

TypeError: 'tuple' object does not support item assignment

所以我们如果要修改元组中的元素就要采用其他的方法。通常会采用两种方式,一种是重新赋值法,一种是类型转换法。

       1) 重新赋值法

1

2

3

4

>>> mytuple = (11,22,33,44,55,66,77)

>>> mytuple = (1,2,3)

>>> mytuple

(123)

这样的覆盖方式可以很简单的修改了元组中的元素,当然这种方式的使用范围受到限制,因此我们在大多数情况下可以采用第二种。

       2) 类型转换法

如果要对元组的第一百元素进行修改,那么采用上面方式就显得十分麻烦,因此可以采用类型转换,先把元组转换成其他数据类型,例如转换为列表,一般情况下我们 都是转成列表进行操作。

看下面例子:

1

2

3

4

5

6

7

8

my_tuple = (1,2,3,4,5,6)#先创建一个元组

my_tuple = list(my_tuple)#把元组转换为列表形式

print(my_tuple,type(my_tuple))#输出看一下现在的数据和类型

my_tuple.insert(3,'插入新元素')#在列表类型下进行元素的插入或更改或删除

my_tuple[3=['元素的更改']

my_tuple.pop()#元素的删除,pop()自动删除最后一项,也就是对应的6

my_tuple = tuple(my_tuple)#最后转换为元组形式

print(my_tuple,type(my_tuple))#打印

输出结果:

1

2

[123456] <class 'list'>

(123, ['元素的更改'], 45) <class 'tuple'>

1.5. 总结

元组相对于列表缺少了一些功能,但元组也有它的独特之处,首先元组的性能是比较高的,处理元组的速率要快于列表,其次是它非常安全,当数据规模较大的时候,使用元组能保障你的数据不会被修改,确保了安全性,在存储方面是一个很好的选择。


2.字典{dictionary}

字典和列表和元组不同,字典中存储的是一组数据,也就是说字典中的每个数据都包含了两个部分,大家可以这么理解,字典中存放了一个学生名字,每个学生的名字前面都对应了一个学号,我们可以把学号理解为‘键’,姓名理解为‘值’。

下面介绍几点字典的特性:

1) 字典是没有顺序的,是任意对象的无序集合

2) 字典的键是唯一的,不能多次出现,多次出现时取最后一个值。

3) 键是不可变的。

4) 字典中的元素可增删。

5) 因为没有顺序,所以不存在索引。

2.1. 创建

通过学生姓名那个例子,已经提到过字典每个元素包含2个部分,他们分别是‘’和‘’,键和值之间用‘:’隔开,两个元素之间用‘,’隔开。

它的语法形式为:

1

my_dict = {‘key’ : ‘value’,’key1’ = ‘value1’....}

其中my_dict 为我们要创建的字典,key为键,value为键对应的值,他们可以是任何数类型。

创建空字典的方式为:

1

2

3

4

5

>>> my_dict = {}#直接进行创建

>>> my_dict

{}

>>> type(my_dict)#看一下它的类型

<class 'dict'>

我们来创建一个字典,字典里有5个学号分别为1001,1002,1003,1004,1005,每个学号对应的名字为‘李华’,‘张三’,‘小雪’,‘小张’,‘小明’。

1

2

3

>>> my_dict = {1001:'李华',1002:'张三',1003:'小雪',1004:'小张',1005:'小明'}

>>> my_dict#交互模式下输人名字是直接访问输出

{1001'李华'1002'张三'1003'小雪'1004'小张'1005'小明'}

字典的形式大致就是这样,每个元素对应两个部分,前面的为‘键’,后面的为‘值’。

要注意键是不可以修改的,而值是可以变的,因此键要取不可变类型的数据。

2.2. 字典元素的访问

在字典中访问元素一般是通过访问其键的形式来获取它对应的值。

我们继续使用上面创建的字典,我们进行访问其值:

1

2

3

4

5

6

7

8

9

>>> my_dict = {1001:'李华',1002:'张三',1003:'小雪',1004:'小张',1005:'小明'}

>>> my_dict[1001]#访问键为1001的值

'李华'

>>> my_dict[1005]#访问键为1005的值

'小明'

>>> my_dict[1006]#访问键为1006的值,此时字典里没有1006,故报错。

Traceback (most recent call last):

  File "<stdin>", line 1in <module>

KeyError: 1006

2.3. 是否存在

在上面我们了解到当我们访问一个不存在的键的时候会出现错误,我们可以采用一种判断来判别字典中是否存在对应的键。

判断是否存再我们使用的是innot in

使用in:

1

2

3

4

>>> my_dict = {1001:'李华',1002:'张三',1003:'小雪',1004:'小张',1005:'小明'}

>>> if 1001 in my_dict:#如果my_dict中存在1001这个键就执行下面语句

       print(my_dict[1001])

>>> 李华

使用not in:

1

2

3

4

>>> my_dict = {1001:'李华',1002:'张三',1003:'小雪',1004:'小张',1005:'小明'}

>>> if 1006 not in my_dict:#如果my_dict中吧存在1006这个键就执行下语句

       print('不存在1006这个键')

>>> 不存在1006这个键

简单的使用in和not in 可以确保我们在访问的时候减少错误的发生,需要注意在in和not in操作的时候,字符串的比较需要区分大小写。

2.4. 添加元素

因为字典是可变的,所以我们可以进行增加删除和修改等操作。对应的语法形式分别为:

1

2

3

4

5

my_dict[‘newkey’] = ‘newvalue’

>>> my_dict = {1001:'李华',1002:'张三',1003:'小雪',1004:'小张',1005:'小明'}

>>> my_dict [1006= '小李'#增加键1006,对应值‘小李’

>>> my_dict{1001'李华'1002'张三'1003'小雪'1004'小张'1005'小明'1006

'小李'}

增加元素就是直接通过键值对进行添加。

2.5. 删除元素

删除元素我们还是通过del语句进行删除,删除的是一整对元素,即包括键和值。

语法格式:

1

del my_list[’key’]

1

2

3

4

5

>>> my_dict{1001'李华'1002'张三'1003'小雪'1004'小张'1005'小明'1006

'小李'}

>>> del my_dict[1001]#删除键为1001的一组元素

>>> del my_dict[1002]#删除键为1002的一组元素

>>> my_dict{1003'小雪'1004'小张'1005'小明'1006'小李'}

2.6. 修改元素

修改元素就等于是直接覆盖了现有元素,它的形式和添加元素的格式类似,

格式为:

1

2

3

4

5

6

my_dict[‘key’] = ‘newvalue’

>>> my_dict

{1003'小雪'1004'小张'1005'小明'1006'小李'}

>>> my_dict[1003= '小天'#把键1003的值修改为‘小天’

>>> my_dict

{1003'小天'1004'小张'1005'小明'1006'小李'}

2.7.常用函数

  在使用字典的过程中,除了基础操作我们还需要学会一些方法的使用。方法见下表:

方法功能
clear清空字典内容
get获取指定键对应值
items返回包含对象中所有变量及其值的2元组的列表
keys返回对象中所有键的元组形式
values返回对象中所有值的元组形式
pop如果键在字典中,则移除它并返回其值,否则返回默认值。如果未给定默认值且键不在字典中,则会引发键错误。

1. clear()方法

使用clear()方法会清空字典中的所有元素。

使用方法为:

1

2

3

4

my_dict.clear()

>>> my_dict{1003'小天'1004'小张'1005'小明'1006'小李'}

>>> my_dict.clear()#使用clear()方法进行清空操作

>>> my_dict{}

2. get()方法

我们在获取键对应的值的时候,使用get()方法可以避免因未找到相应目标而引发异常的情况。

使用方法为:

1

my.dict.get(key,default)

Key为我们要查询的键,default为未找到时的默认返回值,我们可以进行自定义。

1

2

3

4

5

6

7

>>> my_dict = {1001:'小张',1002:'小华'}

>>> my_dict.get(1001)#找到key1001对应值

'小张'

>>> my_dict.get(1002)#找到key1002对应值

'小华'

>>> my_dict.get(1003,'not found')#找到key1003对应值,如果找不到就输出'not found'

'not found'

3. items()方法

items()方法返回字典中成对的键和值,返回的是一种名叫字典视图的特殊序列,其中每个元素都是一个元组。

使用方法:        

1

my_dict.items()

具体使用:

1

2

3

4

>>> my_dict

{1001'小张'1002'小华'}

>>> my_dict.items()

dict_items([(1001'小张'), (1002'小华')])

items方法访问的是整组整组的元素,我们在循环操作的时候会进一步使用这种方法。

4. keys()方法

它的使用方式和items使用方法类似,keys返回字典中的键。

使用方法:

1

my_dict.keys()

具体使用:

1

2

3

4

>>> my_dict

{1001'小张'1002'小华'}

>>> my_dict.keys()

dict_keys([10011002])

5. values()方法

vlaues()返回字典中的所有值。

使用方法:

1

my_dict.keys()

具体使用:

1

2

3

4

>>> my_dict

{1001'小张'1002'小华'}

>>> my_dict.values()

dict_values(['小张''小华'])

6. pop()方法

pop()方法会删除指定的键,并返回其值,如果没有找到相应键可输出默认值。

使用方法:

1

my_dict.pop(key,default)

Key为我们要删除的键,当没有找到该键的时候会输出default,default可自定义,当没有default时返回的是None。

具体方法:

1

2

3

4

5

6

7

>>> my_dict = {1001:'小华',1002:'小张',1003:'小美'}

>>> my_dict.pop(1001)#删除键为1001的这一项

'小华'

>>> my_dict#此时字典里已经没有键为1001这一项

{1002'小张'1003'小美'}

>>> my_dict.pop(1004,'no found')#删除键为1004这一项,如果找不到返回'no found'

'no found'

这些方法在我们进行字典操作的时候使用着非常方便,尤其是在遍历字典的时候,我们会根据不同的需求去使用不同的方法。

2.8.混合字典

2.8.1. 混合字典

所谓混合字典,即字典中存储的数据是各种类型混合在一起的,键需要取不可变的数据类型,但是值是可以取任意类型的对象。

我们先来看一个混合字典:

1

my_dcit = {'小明':['身高:170cm','体重:65kg'],'小李':'爱学习,爱运动','小华':('居住地:苏州','出生地:上海')}

这个字典的值由列表,字符串和元组构成,我们可以通过上一节的方法来访问这个混合字典。看下面一段代码

1

2

3

4

5

6

7

8

9

10

my_dcit = {'小明':['身高:170cm','体重:65kg'],'小李':'爱学习,爱运动','小华':('居住地:苏州','出生地:上海')}

print('访问key=‘小明’->',my_dcit['小明'])

print('访问key=‘小华’->',my_dcit['小李'])

print('访问key=‘小华’->',my_dcit['小华'])

print('itmes()方法:',my_dcit.items())     #整体访问

print('keys()方法:',my_dcit.keys())     #只访问了所有key

print('values()方法:',my_dcit.values())     #只访问了value

print('get()方法:',my_dcit.get('小明'))     #get方法来访问指定键

my_dcit.pop('小明')     #此步骤为pop()方法,会删除键=‘小明’的成对元素

print('pop()方法后的my_dict:',my_dcit)     #查看一下删除后的字典

看一下输出结果:

1

2

3

4

5

6

7

8

9

10

访问key=‘小明’-> ['身高:170cm''体重:65kg']

访问key=‘小华’-> 爱学习,爱运动

访问key=‘小华’-> ('居住地:苏州''出生地:上海')

itmes()方法: dict_items([('小明', ['身高:170cm''体重:65kg']), ('小李''爱学习,爱运动'), ('小华'

('居住地:苏州''出生地:上海'))])

keys()方法: dict_keys(['小明''小李''小华'])

values()方法: dict_values([['身高:170cm''体重:65kg'], '爱学习,爱运动', ('居住地:苏州''出生地:上海'

)])

get()方法: ['身高:170cm''体重:65kg']

pop()方法后的my_dict: {'小李''爱学习,爱运动''小华': ('居住地:苏州''出生地:上海')}

2.8.2. 遍历字典

我们在使用字典的经常要进行字典的遍历,通常会使用for循环去遍历字典所有的键。

我们看一下一般情况下的遍历访问:

1

2

3

4

5

6

>>> my_dict ={1001:'小明',1002:'小华',1003:'小张'}

>>> for in my_dict:

        print(i, my_dict[i])#输出key及key对应的值

1001 小明

1002 小华

1003 小张

我们在获取对象的时候也会使用items()方法来获取成对的元素。

1

2

3

4

5

6

>>> my_dict ={1001:'小明',1002:'小华',1003:'小张'}

>>> for in my_dict.items():

        print(i)

(1001'小明')

(1002'小华')

(1003'小张')

这种方式的访问是对面字典的一对数据,输出结果是以元组的形式输出,同时还可以通过循环的遍历直接获取每一次遍历的键和值。

1

2

3

4

5

6

>>> my_dict ={1001:'小明',1002:'小华',1003:'小张'}

>>> for i,j in my_dict.items():

   print('对应键:',i,'对应值:',j)

对应键: 1001 对应值: 小明

对应键: 1002 对应值: 小华

对应键: 1003 对应值: 小张

关于字典的遍历最后通过习题练习一下。

2.8.3. 字典推导式

前面学习过列表推导式,元组推导式和列表推导式类似没有过多的介绍,因为字典相对来说比较特殊,在这里讲解一下字典推导式。

我们先看一个简单的使用方式。

1

2

3

>>> my_dict = {i:'dotcpp' for in range(1,5)}

>>> my_dict

{1'dotcpp'2'dotcpp'3'dotcpp'4'dotcpp'}

在这里我们来看一下字典推导式的结构,第一部分等同于每一个i的值对象都用‘dotcpp’来赋值,我们也可以先定义一个列表,把列表中的值赋予它。

1

2

3

4

>>> my_list = [10,20,30,40,50]

>>> my_dict = {i:my_list[i] for in range(1,5)}

>>> my_dict

{120230340450}

看下图:

python dictionary

在使用字典推导式的时候主要键与值的相匹配问题,在后面我们学习过函数之后可以使用zip()函数能够更方便的进行字典的组合,在这里就不做过多的介绍。

2.8.4. 习题

要求用户输入总资产,例如: 3000,然后显示购物车列表,计算购物车商品总金额,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。购物车列表如下:carts=[{"name":"床","price":1999,”num”:1},{"name":"枕头","price":10, ” num”:2},{"name":"被子","price":20, ”num”:1}]。

题解在最后。

1

2

3

4

5

6

7

8

9

10

11

12

13

carts=[

{"name":"床","price":1999,”num”:1},

{"name":"枕头","price":10, ”num”:2},

{"name":"被子","price":20, ”num”:1}

]。

= int(input())

sum = 0

for in range(len(carts)):

    sum = carts[i]['price'* carts[i]['num'+ sum

if m >= sum:

    print('购买成功')

else:

    print('账户余额不足')


3.集合{set}

我们在学习数学的时候学过集合这个概念,在Python中同样存在一种名叫集合的数据类型,它也是用来保存不重复的元素,简单的说,集合就是包含了一些唯一存在的元素。

元素有以下几个特性:

1) 无序性,集合中保存的元素是没有顺序的。

2) 多样性,集合中可以保存多种数据类型的元素。

3) 唯一性,集合中的元素都是唯一存在的,不会重复出现。

3.1. 创建集合

在创建集合的时候有2种方式,一种是直接使用集合的特征符号‘{}’来创建,一种是使用set()函数强制类型转换来创建。

       1) 直接创建

首先我们要知道集合和字典的区别,集合是由‘{}’括起来的结构,每个元素之间用‘,’隔开,

集合和字典都是用大括号括起来,但是集合之间不使用冒号。

集合的结构为:

1

my_set = {元素1,元素2,元素3}

my_set为要创建的集合名,括号内的为集合中的元素。

1

2

3

>>> my_set = {1,2,3,4,5,6}

>>> my_set

{123456}

       2) 使用set()函数强制类型转换创建

使用set()可以直接创建一个空集合,也可以将其他类型的结构直接转换为集合。

1

my_set = set(iteration)

my_set为要创建的集合名,set()函数为强制类型转换,iteration是一个可迭代对象,它可以是元组、列表或range对象。

1

2

3

4

5

6

7

8

9

10

11

12

>>> m = set('12345')#强制转换字符串

>>> n = set([1,2,3,4,5])#强制转换列表

>>> k = set(range(1,6))#强制转换range()对象

>>> i = set((1,2,3,4,5))#强制转换元组

>>> m

{'4''3''5''1''2'}

>>> n

{12345}

>>> k

{12345}

>>> i

{12345}

3.2. 清空集合

在学习增添和删除元素之前我们可以回忆一下del()方法,del()方法可以直接删除整个集合,语法格式为:

1

del my_set

3.3. 添加元素

集合是可变序列,因此我们可以对其中的元素进行增删操作。

添加元素使用add()方法,语法格式如下:

1

my_set.add(x)

my_set为集合名,x为要插入的元素。

1

2

3

4

5

>>> my_set#插入前

{123456}

>>> my_set.add('插入一个新元素x')

>>> my_set#插入后

{123456'插入一个新元素x'}

3.4. 删除元素

删除元素可以使用集合的pop()方法或者remove()方法去删除一个元素,也可以使用clear()方法去清空集合。

需要注意的是remove()方法是移除指定元素,而pop()方法是直接删除集合中的第一个元素并输出,clear()方法直接清空了集合中的所有元素。

看下面实例:

1

2

3

4

5

6

7

8

>>> my_set{123456'插入一个新元素x'}

>>> my_set.pop()#会删除并输出第一个元素1

>>> my_set{23456'插入一个新元素x'}

>>> my_set.remove(6)#直接指定删除6

>>> my_set{2345'插入一个新元素x'}

>>> my_set.clear()#清空集合

>>> my_set#打印结果显示为一个空集合

set()

集合的使用方法有很多,我们在做题的过程中,如果要删除列表中的重复元素,采用set()方法强制类型转换可以很方便的删除多余的元素,下一章我们学习一下集合的交集、并集和差集。

3.5.集合运算

我们在遇到一些问题的时候,使用集合的交集、并集和差集能够更便捷的帮助我们去解决问题,看下面一个例子。

某学校有两个班级,班级A需要学习数学、语文、英语、物理、化学和生物,班级B需要学习数学、语文、英语、政治、地理和历史。

我们可以直接看出A班级和B班级的交集为数学、语文和英语,并集为数学、语文、英语、物理、化学、生物、政治、地理、历史,A和B的差集为物理、化学和生物。

那么怎么使用Python去完成这些运算?

我们先在这里定义两个集合,

1

2

= {'数学','语文','英语','物理','化学','生物'}

= {'数学','语文','英语','政治','地理','历史'}

1. 交集

我们使用集合求交集的时候可以采用两种方式,一种是使用‘&’运算符进行操作,一种是使用intersection()方法来实现。

我们通过这两种方法来分别求集合A和B的交集。

方法1——使用‘&’运算符:

1

2

3

4

>>> A = {'数学','语文','英语','物理','化学','生物'}

>>> B = {'数学','语文','英语','政治','地理','历史'}

>>> A & B

{'英语''语文''数学'}

方法2——使用intersection()方法:

1

2

3

4

>>> A = {'数学','语文','英语','物理','化学','生物'}

>>> B = {'数学','语文','英语','政治','地理','历史'}

>>> A.intersection(B)

{'英语''语文''数学'}

因为是求交集,因此A和B的位置调换依然不影响结果。

2. 并集

使用集合求并集的方式同样也是两种方式,一种是使用‘|’运算符进行操作,一种是使用union()方法来实现。

方法1——使用‘|’运算符

1

2

3

4

>>> A = {'数学','语文','英语','物理','化学','生物'}

>>> B = {'数学','语文','英语','政治','地理','历史'}

>>> A | B

{'英语''物理''语文''政治''化学''数学''生物''地理''历史'}

方法2——使用union()方法

1

2

3

4

>>> A = {'数学','语文','英语','物理','化学','生物'}

>>> B = {'数学','语文','英语','政治','地理','历史'}

>>> A.union(B)

{'英语''物理''语文''政治''化学''数学''生物''地理''历史'}

求并集的时候同样不需要注意A和B的位置关系。

3. 差集

使用集合求差集的方式同样也是两种方式,一种是使用‘-’运算符进行操作,一种是使用difference()方法来实现。

方法1——使用‘-’运算符

1

2

3

4

5

6

>>> A = {'数学','语文','英语','物理','化学','生物'}

>>> B = {'数学','语文','英语','政治','地理','历史'}

>>> A - B

{'物理''生物''化学'}

>>> B - A

{'政治''历史''地理'}

方法2——使用difference()方法

1

2

3

4

5

6

>>> A = {'数学','语文','英语','物理','化学','生物'}

>>> B = {'数学','语文','英语','政治','地理','历史'}

>>> A.difference(B)

{'物理''生物''化学'}

>>> B.difference(A)

{'政治''历史''地理'}

在方法2中注意A和B的位置不同的时候是有区别的,如果是A使用difference()方法,那么是输出A中有而B中没有的元素,如果是B使用difference()方法,那么是输出B中有而A中没有的元素。


4.字符串(string)

在我们学习使用Python的过程中,经常要使用到字符串去处理很多问题,尤其是在处理一些算法题的格式转换的时候,字符串的操作方法有很多,接下来的几节就来仔细介绍一下字符串的使用方法。

4.1.基本操作

1. 原始字符串

在前面的字符串学习中简单的提到过字符串的转义符,我们经常会在代码中穿插一些转义符去实现一些代码的换行回车等,我们在数据分析的时候经常要用到原始字符串方法,在这里我们介绍一下原始字符串。

我们看下面几行代码:

1

2

3

4

5

>>> print('www.dotcpp.com\n','学习乐园')

www.dotcpp.com

 学习乐园

>>> print(r'www.dotcpp.com\n','学习乐园')

www.dotcpp.com\n 学习乐园

第一行代码中的‘\n’在输出的时候被实现,因此实现了换行操作。

第二行代码输出的字符串前有‘r’,因此在输出的时候只会输出原始字符串,无论字符串中包含什么转义符,都不会被实现。

2. 访问字符串

我们在学习的过程中会遇到访问字符串中每个字符的问题,因此我们需要使用循环来访问字符串中的每个字符,我们通常使用for循环索引来访问。

使用for循环来访问字符串的格式为:

1

for in my_str

我们来看个例子:

1

2

3

4

5

>>> my_str = 'www.dotcpp.com'

>>> for in my_str:

...     print(i,end=' ')

...

w w w . d o t c p p . c o m

我们通过循环的方式访问了字符串中的每一个元素。

字符串同样采用了索引的方式,因此我们在访问字符串的字符的时候同样可以采用索引的方式来访问。

看下面代码:

1

2

3

4

5

>>> my_str = 'www.dotcpp.com'

>>> for in range(len(my_str)):

...     print(my_str[i],end=' ')

...

w w w . d o t c p p . c o m

我们在前面介绍过range(len())这个结构,在这里再次解释一下,range()是一个对象,而len()是求长度,len(my_str)求出了字符串的长度,然后range(len(my_str))的对象就是0到字符串的最大长度减1。

i为我们每次获取的值,从0依次取到字符串长度的最大值减1,然后通过索引值输出my_str[i],从而获取到了每个元素。

我们可以随意索取几个元素:

1

2

3

4

5

6

7

8

9

10

>>> my_str

'www.dotcpp.com'

>>> my_str[5]#索引值为5的字符

'o'

>>> my_str[0]#索引值为0的字符,也就是第一个字符

'w'

>>> my_str[len(my_str)-1]#索引值为最后一位的字符

'm'

>>> my_str[-1]#这种方式也是访问最后一个字符

'm'

在使用字符串的时候合理的使用len()函数能够优化我们的代码。

3. 字符串连接

字符串自带连接方法,在连接的时候我们可以使用‘+’直接连接或追加一个字符串到另一个字符串的末尾。

看下面的例子:

1

2

3

4

5

>>> my_str

'www.dotcpp.com'

>>> his_str = '人生苦短,我用Python'

>>> my_str + his_str

'www.dotcpp.com人生苦短,我用Python'

通过‘+’可以直接进行字符串的连接,连接之后生成的是一个新的字符串,原字符串并没有发生改变。

4. 字符串切片

我们在前面列表的使用过程中多次使用到切片,字符串同样可以使用切片表达式来获取字符串中的部分字符,同时我们可以通过切片的方式直接进行字符串的逆置。

看下面的例子:

1

2

3

4

5

6

7

8

9

10

11

12

>>> my_str                   

'www.dotcpp.com'

>>> my_str[0:2]#通过切片访问0-1

'ww'

>>> my_str[3:6]#3-5

'.do'

>>> my_str[7:10]#7-9

'cpp'

>>> my_str[::2]#步长为2的访问整个字符串

'wwdtp.o'

>>> my_str[::-1]#逆置字符串

'moc.ppctod.www'

下一节学习几种字符串中常用的方法。

4.2.常用方法

在使用字符串的时候通过使用一些方法能够更方便我们进行字符串的操作,我们来挑选一些常用的方法来进行讲解,其中基础方法包含count()方法、find()方法和index()方法,然后我们分为测试方法、修改方法和搜索替换方法三个角度去介绍相关函数。

1. count()方法

我们通常使用count()方法来统计字符串中的某个元素在字符串中出现的次数,如果不存在返回0,如果存在则返回存在的次数,语法格式如下:

1

my_str.count(x)

my_str为我们要检索的字符串名,x为我们要统计的字符。

看下面的例子:

1

2

3

4

5

6

7

8

9

10

>>> my_str

'www.dotcpp.com'

>>> my_str.count('w')

3

>>> my_str.count('.')

2

>>> my_str.count('p')

2

>>> my_str.count('*')

0

返回的数字即该字符在字符串中出现的次数,因为‘*’不存在,所以返回值为0。

2. find()方法

find方法来检索字符串中是否包含指定元素,如果包含该元素则返回该元素第一次出现的索引位置,如果不存在该字符则返回-1,它的语法结构为:

1

my_str.find(x)

my_str为要检索的字符串名,x为我们要寻找的元素。

看下面的例子:

1

2

3

4

5

6

7

8

9

10

>>> my_str

'www.dotcpp.com'

>>> my_str.find('w')#寻找字符w

0

>>> my_str.find('p')#寻找字符p

8

>>> my_str.find('m')#寻找字符m

13

>>> my_str.find('*')#寻找字符*,因为*不存在因而返回-1

-1

我们同样可以采用关键字in来查询指定字符是否存在于指定字符串中,如果字符串中存在指定字符则返回True,如果不存在则返回False。

看下面例子:

1

2

3

4

5

6

7

8

9

10

>>> my_str

'www.dotcpp.com'

>>> 'p' in my_str

True

>>> 'w' in my_str

True

>>> '.' in my_str

True

>>> '*' in my_str

False

但是这种方式只能知道我们要访问的元素是否存在,而不能获取到它存在的位置,大家在学习过程中可以自主选择方法去求解。

3. index()方法

index()方法和find()方法类似,index()方法在检索到指定字符的时候也会返回该字符第一次出现的索引位置,但是如果检索不到就会抛出异常,它的语法格式为:

1

my_str.index(x)

my_str为要检索的字符串名,x为要寻找的元素。

看下面的例子:

1

2

3

4

5

6

7

8

9

>>> my_str = 'www.dotcpp.com'

>>> my_str.index('w')

0

>>> my_str.index('o')

5

>>> my_str.index('*')

Traceback (most recent call last):

  File "<stdin>", line 1in <module>

ValueError: substring not found

找到存在的元素后会返回其在字符串中的索引位置,最后一个‘*’因为没找到而报错。

4. 标准格式

上面三种方法为他们的省略格式,在标准文档中,他们的格式分别为:

1

2

3

my_str.count(x[,start[,end]])

my_str.find(x[,start[,end]])

my_str.index(x[,start[,end]])

在上面讲解的时候我们没有提到括号中的内容,因为在Python文档中‘‘[]’’表示可以省略部分,因此这一部分是可以省略不写的,但是我们在使用的时候,还是可以使用的,start为索引的起始位置,end为索引的结束位置,但是不包含end。

我们来通过例子讲解一下标准格式:

1

2

3

4

5

6

7

>>> my_str = 'www.dotcpp.com'

>>> my_str.index('o',6,13)#在6-12之间寻找o

12

>>> my_str.count('w',0,5)#统计w在0-4之间存在的次数

3

>>> my_str.find('c',3,9)#在3-8之间寻找7

7

标准格式的使用看似比较复杂,但是使用起来却十分方便的。

4.3.测试方法

字符串中会包含多种类型的数据,像整数、大小写字母、符号和转义字符。我们要判断字符串中是否包含相应数据类型的字符,就需要借助测试方法。

常用的测试方法有isalnum()、isalpha()、isdigit ()、islower()、isupper()、isspace()。

下面我们一一进行学习。

1. isalnum()方法

isalnum()方法用来判断字符串中是否只包含字母或数字,并且长度要大于0,满足的话就返回True,否则返回False。

我们来看个例子:

1

2

3

4

>>> my_str

'www.dotcpp.com'

>>> my_str.isalnum()#判断是否只包含字母和数字

False

因为my_str中不仅仅包含字母和数字,因此返回Flase,再看一个例子:

1

2

3

>>> s = 'dotcpp123456'

>>> s.isalnum()

True

s字符串中只包含字母和数字,因此返回True。

2. isalpha()方法

isalpha()方法用来判断字符串中是否只包含字母,并且长度大于0,满足的话就返回True,否则返回False。

我们来看个例子:

1

2

3

4

>>> my_str

'www.dotcpp.com'

>>> my_str.isalpha()#判断是否只包含字母

False

因为my_str中不仅仅包含字母,因此返回Flase,再看一个例子:

1

2

3

>>> s = 'dotcpp'

>>> s.isalpha()

True

s字符串中只包含字母,因此返回True。

3. isdigit()方法

isdigit()方法用来判断字符串中是否只包含数字,并且长度大于0,满足的话就返回True,否则返回False。

1

2

3

4

>>> my_string

'99+1=100'

>>> my_str.isdigit()#判断是否只包含数字

False

因为my_string中不仅仅包含数字,因此返回Flase,再看一个例子:

1

2

3

>>> s = '1234567'

>>> s.isdigit()

True

4. islower()方法和isupper()方法

这两种方法分别用来判断字符串中是否只包含小写字母和大写字母,使用方法和上面几种方法一致,我们来举例看一下:

1

2

3

4

5

6

7

8

9

10

11

>>> s = 'ABCabc'#字符串s包含大写字母和小写字母

>>> s.islower()

False

>>> s.isupper()

False

>>> s = 'abc'#s字符串只包含小写字母

>>> s.islower()

True

>>> s = 'ABC'#s字符串只包含大写字母

>>> s.isupper()

True

5. isspace()方法

isspace()方法用于判断字符串是否只包含空白字符(空格、换行(\n)和制表符(\t)),并且长度大于0,满足条件返回True,否则返回False。

看下面的例子:

1

2

3

4

5

6

7

8

9

>>> my_str = ' \n \t '#其中包含五个字符,三个空格,一个换行,一个制表符

>>> len(my_str)#看一下长度

5

>>> my_str

' \n \t '

>>> print(my_str)

>>> my_str.isspace()#判断是否为空白字符

True

打印结果可以看出my_str属于一个空白字符串,判断正确。

6. 总结

这几个方法的使用比较类似,都是在测试通过之后返回True,而错误则返回False,我们通常会使用if语句结合使用,当if语句成立之后,即判断字符串中所包含内容成立之后再执行相关语句,如果判断为False则执行另外语句。大家可以在下面自己使用if语句去练习使用一下上面的几种方法。

4.4.修改方法

使用字符串的过程中或多或少我们要将字符串中的内容进行修改,虽然字符串是不可改变的,但是我们可以使用方法来返回修改后的副本。

下面我们将介绍几种常用的字符串修改方法,分别是lower()、upper()、lstrip()、rstrip ()、strip()。

1. lower()方法和upper()方法

这两种方法和上一节的测试方法类似,前者是返回一个副本,副本中把字符串中所有字符转换为了小写字符,而后者是返回一个副本,副本中把字符串中所有字符转换为了大写字符。

看下面的例子:

1

2

3

4

5

6

7

>>> my_str = 'ABCabc'#包含大小写字母的字符串

>>> my_str.upper()#将字符串全部大写

'ABCABC'

>>> my_str.lower()#将字符串全部小写

'abcabc'

>>> my_str#再看一下原始字符串有没有改变

'ABCabc'

一定要注意的就是返回的是副本,使用了方法,但是原始字符串是没有改变的,如果我们要获取副本,可以另取名,也可以直接覆盖。

1

2

3

4

>>> my_str = my_str.upper()#直接覆盖

my_str

>>> my_str

'ABCABC'

2. lstrip()方法、rstrip ()方法和strip()方法

这三种方法的原理类型,他们都是用于处理字符串中的空白字符。

1) lstrip()方法会返回一个副本,副本中的字符串删除所有前导的空白字符。

2) rstrip()方法会返回一个副本,副本中的字符串删除所有后导的空白字符

3) strip()方法会返回一个副本,副本中的字符串删除所有前导和后导的空白字符。

我们先定义一个字符串my_str =‘\n\twww.dotcpp.com\t\n’,然后看下图:

python字符串1

在图中前导为字符串字符串前面的空白字符,后导同理,前导对应的就是lstrip()方法,后导对应rstrip()方法,而strip()对应的是两种方法的结合。

我们来看一下代码:

1

2

3

4

5

6

7

>>> my_str = ' \n\t www.dotcpp.com \t\n  '

>>> my_str.rstrip()#返回删除后导空白字符的副本

' \n\t  

>>> my_str.lstrip()#返回删除前导空白字符的副本

'www.dotcpp.com \t\n  '

>>> my_str.strip()#返回删除前导后导空白字符的副本

'www.dotcpp.com'

综合代码和上图来理解一下这个例子,通俗的讲,前导返回的副本删除了前面部分,后导返回的副本删除了后面部分,而strip()方法返回的副本把前导后导一并删除。

4.3. 搜索方法

我们在写程序的时候有时候需要搜索字符串中的元素,除了前面讲过的find()方法和index()方法,我们有时候还需要用到endswith()方法和startswith()方法。

       1) endswith()方法

它的语法格式为:

1

my_str.endswith(substring)

my_str为字符串名,substring参数是一个字符串,如果在该字符串的结尾为substing,那么返回True,反之返回False。

       2) startswith()方法

它的语法格式为:

1

my_str.startswith(substring)

my_str为字符串名,substring参数是一个字符串,如果在该字符串的开头为substing,那么返回True,反之返回False。

举个例子:

1

2

3

4

5

>>> my_str = 'www.dotcpp.com' 

>>> my_str.endswith('.com')

True

>>> my_str.startswith('www.')

True

4.4. 替代方法

replace()方法返回一个副本,副本中将我们需要替代的字符替换掉,它的语法格式为:

1

my_str.replace(old,new)

my_str为字符串名,old为要替换掉的字符,new为替换上的字符。

举个例子:

1

2

3

>>> my_str = 'www.dotcpp.com'

>>> my_str.replace('w','m')

'mmm.dotcpp.com'

这种方法替换的时候仍然是返回的副本,它会替换掉所有需要替换的字符,保持原字符串是不改变的。

4.5.格式化字符串

在学习字符串的过程中,我们在前面讲了很多使用方法,实际在使用的过程中,我们经常会需要将字符串格式化,通过格式化输出我们需要的结果。

格式化字符串就是在先创建一个空间,然后再这个空间留几个位置,然后根据需求填入相应的内容,这里留出的位置相当于占位符,格式化字符串有两种方式。一种是使用%操作符,一种是使用format()方法。

1. %操作符

%操作符在我们格式化字符串的时候十分方便,它的语法结构如下:

1

 %[+][-][0][.m]格式化字符’%iteration

1) iteration为我们要填入的内容,第一个%后面为我们要选择的格式。

2) [+]为右对齐‘+’为我们可以填入的参数,数字大小代表对齐宽度。

3) [-]为左对齐‘-’为我们可以填入的参数,数字大小代表对齐宽度。

4) [.m]中的m为可选精度,表示保留小数点后几位小数。

5) 格式化字符为我们需要选定的格式,它的常用类型为字符串%s、十进制整数%d、单字符%c、浮点数%f、十六进制数%x、八进制数%o、字符%%。

关于%操作符的理解可能比较抽象,我们通过例子来了解一下它。我们比较常用的就是输出一个浮点数,小数点后保留2位小数,代码如下:

1

2

>>> my_str =66666.66666

>>> print('保留2位小数格式为:%.2f'%my_str)保留2位小数格式为:66666.67

保留小数的时候会自动进行四舍五入操作,在使用的时候主要注意它的形式,我们可以选择一个或多个组合在一起来格式化字符串,上面是我们使用了一种格式化操作,格式化部分为‘%.2f’,然后再字符串的最后用%连接相应字符串即直接等同于相应内容。

我们再介绍一下对齐方式的使用:

1

2

3

4

5

6

7

8

9

>>> for in range(5):

...     print('%-5d'%i,end=' ')#左对齐方式

...     print('%5d'%i)#右对齐方式

...

0         0

1         1

2         2

3         3

4         4

5是代码对齐的宽度,我们采用左右对齐,第一列为左对齐,宽度为5,然后不换行再次输出i,第二次输出为右对齐,因此输出入上所示。

关于%操作符就将到这里,大家在下面自己进行练习可以更快的去掌握这些知识。

2. format()方法

format()方法提供了更多的方法去格式化字符串,它的基本语法是通过‘{}’和‘:’来代替‘%’。它的语法格式为:

str.format()

我们通过例子来看一下:

1

2

3

namea = '小明'

nameb = '小华'

print('{}是{}的好朋友'.format(namea,nameb))

这个例子是最简单的使用方式,但是既然这个方法是后来引入的方法,那么它一定有它比较好用的地方,下面我们介绍一下它的具体方法。

在占位符里结构可以为:

1

{[index[:[fill]align][width][#][.k][type]]}

通过图来看一下这个结构:

python字符串2

在上面那个例子中只包含了简单的‘{}’,如果我们加以修饰的话可以使用上面的这些结构,我们来一一说明:

1) index为索引位置,我们可以给他一个数字,用来指定对象在列表中的索引位置,索引值从0开始,如果没有索引值,按从左到右的顺序。像上面的例子,我们如果加了索引值:

1

2

3

namea = '小明'

nameb = '小华'

print('{1}是{0}的好朋友'.format(namea,nameb))

那么他们的位置就进行了一个调换。

2) ‘:’为后续内容使用的前提,使用后面操作的时候都要加一个‘:’。

3) fill可以选择一个参数作为空白填充的字符数。

4) width是可以选择一个参数来指定长度。

5) align可以选择一个参数作为对齐方式,参数为‘>’代表右对齐,‘<’为左对齐,‘=’为右对齐,但是符号放在最左侧,‘^’代表居中,这些需要搭配width使用。

我们看个例子:

1

2

3

>>> my_str = 'dotcpp'

>>> print('{:@>10}'.format(my_str))

@@@@dotcpp

这个例子里我们选择了右对齐,然后宽度为10,空白字符用符号@代替。

6) ‘#’为进制前缀。

7) .k中的k是可选参数,用来表示小数点后保留的数字。

8) type可选择参数来指定类型,常用的有S来表示字符串、D来表示十进制整数、%来表示百分比、f或者F表示浮点数。

下面我们在通过一个例子来使用一下上述这些方法。

1

2

3

my_str = 'dotcpp'#先定义两个字符串

my_string = 123456.654321

print('my_str:{1:!^20s}\nmystring:{0:$^20.2f}'.format(my_string,my_str))

输出为:

1

2

my_str:!!!!!!!dotcpp!!!!!!!

mystring:$$$$$123456.65$$$$$$

对于my_str,‘1‘为它的索引位置,‘!’来替代空白字符,‘^’代表位置居中,20为宽度,‘s’为字符串类型。

对于my_string,‘0’位它的索引位置,‘$’来代替空包字符,‘^’代表位置居中,20位宽度,‘.2’为小数点后保留2位小数,‘f’为浮点类型。

3. 总结

关于字符串就讲到这里,字符串的使用是十分频繁的,所以大家一定要通过习题去练习并掌握它。


"""
 *                        _oo0oo_
 *                       o8888888o
 *                       88" . "88
 *                       (| -_- |)
 *                       0\  =  /0
 *                     ___/`---'\___
 *                   .' \\|     |// '.
 *                  / \\|||  :  |||// \
 *                 / _||||| -:- |||||- \
 *                |   | \\\  - /// |   |
 *                | \_|  ''\---/''  |_/ |
 *                \  .-\__  '-'  ___/-. /
 *              ___'. .'  /--.--\  `. .'___
 *           ."" '<  `.___\_<|>_/___.' >' "".
 *          | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 *          \  \ `_.   \_ __\ /__ _/   .-` /  /
 *      =====`-.____`.___ \_____/___.-`___.-'=====
 *                        `=---='
 * 
 * 
 *      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 
 *            佛祖保佑       永不宕机     永无BUG
 * 
 * @Author       : gyp
 * @Date         : 2024-10-2 14.48.52
 * @LastEditTime : 2023-10-2 15:12:41
 * @LastEditors  : gyp
 * @Description  : 
 * @FilePath     : \C\SString.c
 * 自学之用,欢迎讨论.13438784965
 */
"""

练习

1.链表合并


m,n=map(int,input().strip().split())
#a
x=m+n
a={}
for i in range(x):
    key,val=map(int,input().strip().split())
    a[key]=int(val)


keys=list(a.keys())
keys.sort()

for i in keys:
    print(i,a[i])

2.字符串统计

s = str(input())


def Anum(s):
    j = 0
    for i in s:
        if i >= 'A' and i <= 'Z':
            j += 1
    return j

def anum(s):
    j = 0
    for i in s:
        if i >= 'a' and i <= 'z':
            j += 1
    return j

def num(s):
    j = 0
    for i in s:
        if i >= '0' and i <= '9':
            j += 1
    return j

print("Number of uppercase letters in the string:", Anum(s))
print("Number of lowercase letters in the string:", anum(s))
print("Number of digits in the string:", num(s))

 3.字符串正反链接

s=input()

s1=s[::-1]

print(s+s1)

4.字符串赋值

# 注意切片位置
x=int(input())#字符串总数
m=input()#输入字符串
h=int(input())#切片-1
res=m[h-1:]
print(res)

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

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

相关文章

部署带证书的docker高可用的私有仓库harbor

一、部署带证书的docker高可用的私有仓库harbor harbor下载包&#xff1a;https://hub.fastgit.org/goharbor/harbor/releases docker阿里云地址&#xff1a;docker-ce-linux-centos-7-x86_64-stable-Packages安装包下载_开源镜像站-阿里云 Harbor 是 VMware 公司开源的企业级 …

刷题训练之多源 BFS

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握多源 BFS算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷…

quic-go源码一---server启动

前言&#xff1a; 走马观花地看了RFC 9000:QUIC: A UDP-Based Multiplexed and Secure Transport&#xff0c; 感受不是那么直观&#xff0c;所以再来看看这个协议的golang语言实现&#xff1a;quic-go,加强学习。 https://quic-go.net/docs/quic/quic-go文档 本篇准备的代…

threejs-法线向量

一、介绍 1.介绍 1.在3D计算机图形中&#xff0c;‘法向量’是一个向量&#xff0c;表示3d模型表面在某一点的方向。在每个顶点上&#xff0c;都会有一个关联的法向量&#xff0c;这个向量通常被归一化,也就是说它的长度为1。 2.使用:定点的法向属性在很多计算图形的领域都有应…

lammps统计一个原子周围不同类型原子数量的方法

本文介绍lammps统计一个原子周围不同类型原子数量的方法。 在之前的专栏中,曾介绍过动态统计某一个固定区域内原子数量的方法,也介绍过动态统计某一个原子周围原子数量的方法: 下面介绍第三种类型:动态统计某一个原子周围不同类型原子数量的方法。 以小球的随机碰撞为例,原…

【2024.10.14练习】生命之树

题目描述 题目分析 对于求树的子区域最大和&#xff0c;考虑使用树形DP求解。 假设以树的某一结点为根节点来深度优先搜索整棵树&#xff0c;搜索到每个结点时都会有两种决策状态&#xff1a;加入该节点和不加入该节点。定义代表选择此结点所能得到最大权值和&#xff0c;代表…

【Linux】解析信号的本质&相关函数及指令的介绍

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

动态规划-简单多状态dp问题——LCR.091.粉刷房子

1.题目来源 题目来源&#xff1a;LCR.091.粉刷房子——力扣 测试用例 2.算法原理 下列矩阵表示粉刷每个房子的费用&#xff0c;对应颜色表示粉刷的油漆颜色 1.状态表示 创建一个n3的dp表&#xff0c;每一列代表第i个房子刷三个颜色中任意颜色的情况下花费的费用 dp[i][0]:第…

c语言字符函数

1&#xff0c;字符分类函数&#xff1a; 例如&#xff1a;写一个代码将字符串中的小写字母转化成大写字母 就可以用到上述islower函数判断字符是否是小写 2.字符转换函数 c语言提供了两个字符转换函数 1.int tolower (int c); //将输入进去的大写字母转化成小写 2,int …

AI开发者工具的双子星:Cursor与ChatGPT Canvas的区别

01—Cursor&#xff1a;沉浸式的开发体验 Cursor是一款旨在为开发者提供无缝编程体验的工具。它将AI的功能深度嵌入到开发者熟悉的环境中&#xff0c;便于在编码过程中获得即时帮助。开发者无需离开自己的操作界面&#xff0c;AI就能自动为其提供代码补全、错误检查和优化建议…

荣耀、中国移动、京东三强联合,开启产业链升级的“价值跃迁”

市场最大的不变就是变化&#xff0c;能够赢得跨越式发展的&#xff0c;往往是最能适应变化&#xff0c;并且开拓创新的企业。 在全行业数字化转型的当下&#xff0c;线上智能终端销售模式&#xff0c;正在迎来新的篇章。 10月12日&#xff0c;在2024中国移动全球合作伙伴大会…

买自动猫砂盆怎么不花冤枉钱?双十一高性价比自动猫砂盆推荐

平时出门在外面&#xff0c;真的有点来不及照顾猫咪的猫砂盆&#xff0c;导致粪便堆积的时间过长&#xff0c;污染干净的猫砂&#xff0c;猫砂盆长时间不清理&#xff0c;会增加细菌滋生的机会&#xff0c;从而增加猫咪尿路感染的风险。自动猫砂盆的自动铲屎很方便实用&#xf…

界面耻辱纪念堂--可视元素02

Leif Almberg 发给我们一个从 IBMs NetFinity&#xff08;一个管理网络和远程计算机的程序&#xff09;截取的图片。 这个图片由一大堆混乱的带边框的控件组成&#xff0c;这些控件占据了整个屏幕。由于他们希望把所有东西填充在一个单独对话框中&#xff0c;IBM 的设计者不得…

IPv6 DNS简介

IPv6网络中的每台主机都是由IPv6地址来标识的&#xff0c;用户只有获得待访问主机的IPv6地址&#xff0c;才能够成功实现访问操作。对于用户来讲&#xff0c;记住主机的IPv6地址是相当困难的&#xff0c;因此设计了一种字符串形式的主机命名机制&#xff0c;这就是域名系统。用…

HBuilder X 下载vue-router时 发生异常:npm ERR! code EPERM

一、异常 PS C:\Users\GL\Documents\HBuilderProjects\vj1> npm i vue-router3.6.5 npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path C:\Program Files\nodejs\node_cache\_cacache npm ERR! errno EPERM npm ERR! FetchError: Invalid response body while tr…

Vue3 集成 json-editor-vue3

简介 快速编辑json数据&#xff0c;还需要支持全屏编辑&#xff0c;以及json校验。 https://github.com/guyue88/json-editor-vue3 安装依赖 npm install json-editor-vue3 --save 引入 在 main.js中添加 import “jsoneditor”; 全局引入 import Vue from vue import Json…

【设计模式系列】模板方法模式

一、什么是模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它在父类中定义一个算法的框架&#xff0c;允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些存在共同行为的类&#x…

CSS简单入门

一.简单概念 1.概念 层叠样式表&#xff0c;一种样式表语言&#xff0c;用来美化HTML文档的呈现。 2.书写位置 title标签下方添加style双标签&#xff0c;style标签里面书写CSS代码 &#xff08;1&#xff09;外部学习样式 <title>CSS使用</title> <sty…

【软件工程】数据流图DFD

文章目录 数据流图DFD概述一、数据流图的基本元素二、数据流图的绘制步骤三、数据流图的分层设计四、数据流图的绘制原则五、数据流图的应用 一个完整的数据流包含哪些要素从图中找出所有数据流1. **理解数据流图的结构**2. **识别外部实体**3. **追踪数据流**4. **记录数据流*…

在 MTT GPU 上使用 llama.cpp 推理

大语言模型因其出色的自然语言理解和生成能力而迅速被广泛使用&#xff0c;llama.cpp 大幅降低了进行大语言模型推理的门槛&#xff0c;MTT GPU 同样也是 llama.cpp 支持的运行平台&#xff0c;能够充分利用硬件的性能来助力用户的大语言模型应用。 本文主要介绍了如何在摩尔线…