容器概念

容器是Python中的重要概念,分为有序与无序。

有序容器也称为序列类型容器,如:字符串、列表。

通用序列容器操作

容器连接+

加号可以把两个序列连接成一个更大的容器,相加后两个序列的值并不改变

>>> s1='abc'
>>> s2='def'
>>> s3=s1+s2
>>> s3
'abcdef'
>>> s1
'abc'
>>> s2
'def'
>>> l1=[1,2,3]
>>> l2=[4,5,6]
>>> l3=l1+l2
>>> l3
[1, 2, 3, 4, 5, 6]
>>> l1
[1, 2, 3]
>>> l2
[4, 5, 6]

数乘

一个序列容器乘以一个整数,把序列重复整数遍。相乘后原序列依然不发生变化。

>>> s1='ab'
>>> s2=s1*3
>>> s2
'ababab'
>>> l1=[1,2]
>>> l2=l1*3
>>> l2
[1, 2, 1, 2, 1, 2]

in与not in

in判断一个元素是否在序列容器中,not in判断是否不再序列容器中,返回值为布尔类型。

>>> s1='abc'
>>> 'a'in s1
True
>>> 'ab'in s1
True
>>> 'd' in s1
False
>>> l1=[1,2,3]
>>> 1 in l1
True
>>> [1,2] in l1#错误因为[1,2]不在[1,2]中
False`
>>> [1,2] in [[1,2],3]#正确
True

索引[]

取单个元素,从0开始计数。

我们一个称第一个元素为第一个,第零号。

最大下标为长度减一,超过此范围会报错。

我们也可以倒着数,最后一个元素为-1,第一个元素为长度的负数。

列表的索引支持重新赋值,字符串不支持

>>> l=[1,2,3]
>>> l[1]=3
>>> l
[1, 3, 3]
>>> s="abc"
>>> s[1]="c"
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
s[1]="c"
TypeError: 'str' object does not support item assignment

切片[]

在一个序列容器l中,有l[a:b]其中a<b,(若a>b,l[a:b]为空串)

l[a:b]=l[a]+l[a+1]+......+l[b-1]。(若a=0,a可以省略)

在切片中依然可以只用负数索引,并且有时可以做到一些直接索引不好做的操作。

如,我们要把一个数字+一个字符的串中的最后一个字符去掉,直接使用切片似乎不太好处理,因为我们无法确定数字的长度。

这时我们可以使用[0:-1],我们切刀的第一个元素到倒数第二个元素。巧妙地解决了这个问题。

>>> s="25c"
>>> s[:-1]
'25'

(注意,如果序列容器中,我们可以在切片中使用长度(这似乎看上去并不合理),这是为了解决无法切片得到最后一个元素的问题,但我们通常不推荐这么做,我们通常使用省略最后一个切片范围的方法来使得切片取到最后一个字符)

通用序列容器函数

len函数

获得序列容器的长度。

min函数

获得序列容器中最小的元素。

max函数

获得序列容器中的最大元素。

sort函数

排序函数,按照ASC码顺序排序。

字符串特性

字符串中的引号与转义

如果需要在字符串中使用单引号,我们可以使用双引号包裹。

如果需要在字符串中使用双引号,我们可以使用单引号包裹。

>>> a="'a'+'b'"
>>> a
"'a'+'b'"
>>> a='"a"+"b"'
>>> a
'"a"+"b"'

也可以使用反斜杠(左上到右下)做转义。

>>> a="\'a\'+\'b\'"
>>> a
"'a'+'b'"

三个单引号或者三个双引号,可以使字符串保留回车。

>>> """
a
cacad
casdw
,
"""
'\na\ncacad\ncasdw\n,\n'

如果想在输出时在多行书写,但同时最后的结果不会换行,可以在行末加反斜杠。

>>> s="adad\
vasd\
avasddaw\
,\
"
>>> print(s)
adadvasdavasddaw,

如果想使输入时的字符,不被识别成转义字符,我们可以在引号前面加一个r。

>>> s=r'a\ndjwaid\tdad'
>>> s
'a\\ndjwaid\\tdad'
>>> print(s)
a\ndjwaid\tdad

字符串特有函数(方法)

lower和upper

把大写变成小写,不会改变原来字符串

>>> s="ADADWDADS"
>>> s.lower()
'adadwdads'
>>> s
'ADADWDADS'

upper是把小写变成大写,使用方法与lower一致。

find

find("s",a,b)从左往右数第一次在字符串的[a,b-1]范围中出现的位置。

如果找不到则返回-1

>>> s.find("p",0,2)
-1
>>> s.find("p",0,3)
2

count

count('s')计算s在字符串中出现的次数。

>>> s="hello,world"
>>> s.count('l')
3

strip、lstrip、rstrip

strip去掉左右两边空格,lstrip去掉左边空格,rstrip去掉右边空格。

>>> s=' hello world    '
>>> s.strip()
'hello world'
>>> s.lstrip()
'hello world '
>>> s.rstrip()
' hello world'

replace

replace('s1','s2')把字符串中的's1'替换成's2'

>>> s=' hello world '
>>> s.replace(' ','-')
'-hello-world-'

%

字符串的格式化,类似于C/C++中,不同的是后面也要用%,如print("%d+%f"%(1,1.2)),这里略。

列表特性

列表的字面是可以是表达式

>>> a=6
>>> b=8
>>> [a,b]
[6, 8]
>>> [a+2,b-a]
[8, 2]

list函数可以将其他类型转换成列表

>>> s="this is a string"
>>> list(s)
['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g']

如果列表的元素还是一个列表,就形成了广义表

>>> t=[[1,2,3],[4,5,6],[7,8,9]]
>>> len(t)
3
>>> t[0]
[1, 2, 3]
>>> t[0][0]
1

列表的赋值并不重分配空间

列表的赋值并不重分配空间,只是把新变量的指针也指向原来的变量指向的地址。这导致了,改变被赋值的变量会导致原变量被修改,这与其他变量的赋值不同。

>>> t=[1,2,3]
>>> t[0]
1
>>> l=t
>>> l[0]
1
>>> l[0]=2
>>> l
[2, 2, 3]
>>> t
[2, 2, 3]

如图:

列表切片的其他应用

为了解决上面的问题,我们可以使用切片

如果想要重新分配一个空间来让新变量拥有可以使用切片的方法。

>>> t1=[1,2,3]
>>> t2=t1[:]#省略开头结尾,表示从0开始一直到结束
>>> t2[0]=0
>>> t1
[1, 2, 3]
>>> t2
[0, 2, 3]

如图:



使用切片时,如果切片在赋值号右边,那么它会给左边的变量分配新的空间,

如果在左边,那么它指向的是原来的空间,所以可以通过改变切片的值来改变原来的空间。

>>> t=[1,2,3,4,5,6,7,8,9,10]
>>> ts=t[2:4]
>>> t[2:4]=[10,20]
>>> ts
[3, 4]
>>> t
[1, 2, 10, 20, 5, 6, 7, 8, 9, 10]

如图:



甚至可以赋与切片中元素个数不同的列表。

>>> t[2:4]=[10,20,30]
>>> t
[1, 2, 10, 20, 30, 5, 6, 7, 8, 9, 10]

我们也可以利用这一特性来删除元素

>>> t[2:4]=[]#删除第二个第三个元素。
>>> t
[1, 2, 30, 5, 6, 7, 8, 9, 10]
```python
##del运算符
在del后面加上要删除的元素,即可在列表中删除这一元素。
如果要删除整个列表,可以直接del+列表名即可。
```python
>>> t=[1,2,3,4,5,6]
>>> del t[2]
>>> t
[1, 2, 4, 5, 6]
>>> del t
>>> t
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
t
NameError: name 't' is not defined

列表的函数

append

相当于C++中STL的push_back,把一个新的元素添加的列表的最后。

extend

相当容器连接运算符+,把两个列表连接起来。

(注意:append与extend看似内容相似,实际上功能上还是有着很大的差异,append是添加元素,它的参数应该为一个字面量或者表达式,而extend的作用是扩展列表,连接两个列表,后面的参数必须也是一个列表)

>>> t=[1,2,3,4,5,6,7,8]
>>> t.append(10)
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10]
>>> t.extend([1,2,3])
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3]
>>> t.append([1,2,3])#这是正确的因为列表也是一个字面量
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, [1, 2, 3]]
>>> t.extend(1)#下面报错,因为参数不为列表
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
t.extend(1)
TypeError: 'int' object is not iterable

insert函数

insert函数有两个参数,第一个参数指定在哪个元素前面插入(0~INF),第二个元素指定要插入的元素(字面量或者表达式)

>>> t=[1,2,3,4,5,6,7]
>>> t.insert(0,0)
>>> t
[0, 1, 2, 3, 4, 5, 6, 7]
>>> t.insert(0,[1,2])
>>> t
[[1, 2], 0, 1, 2, 3, 4, 5, 6, 7]

当insert的第一个参数超过了列表的最大下标时,我们会把元素添加到列表尾部。

>>> t=[1,2,3,4,5,6]
>>> t.insert(100,1)
>>> t
[1, 2, 3, 4, 5, 6, 1]

remove函数

删除元素,与del运算符不同的是,del是删除指定位置的元素,remove是删除指定值(第一个)的元素。

如果有很多指定值,那么删除第一个。

>>> t=[1,2,3,4,5,6,2]
>>> t.remove(2)
>>> t
[1, 3, 4, 5, 6, 2]

pop函数

与数据结构中堆栈的pop一致,即弹出最后一个元素,函数的返回值为该元素的值。

如果该函数带有参数,那么弹出的值为该位置元素的值。

>>> t=[1,2,3,4,5,6,7,8]
>>> t.pop()
8
>>> t.pop(2)
3
>>> t
[1, 2, 4, 5, 6, 7]

reverse函数

翻转列表,没有什么好说的。

>>> t=[1,2,3]
>>> t.reverse()
>>> t
[3, 2, 1]

index函数

与字符串的find函数一致,返回指定元素在列表中的位置,如果有多个就返回第一个。

与find函数基本一致

>>> t=[1,3,4,5,7,3,4,24]
>>> t.index(4,3,9)
6
>>> t.index(4)
2
>>> t.index(4,3)
6

列表推导式

列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它可以将循环和条件判断结合,从而避免语法冗长的代码,同时提高程序性能。

基本格式:

[expression for item in iterable]

如,我们要产生2,4,6,8,10的列表可以使用n1=[2*n for n in [1,2,3,4,5]]

待条件的列表解析

[expression for item in iterable if condition] or

[expression if condition else expression for item in iterable]

>>> l=[n for n in range(1,8) if n%2==1]
>>> l
[1, 3, 5, 7]

例如:求1-1/2+...-1/20之和

>>> a=sum([1/i if i%2==1 else -1/i for i in range(1,21)])
>>> a
0.6687714031754279

列表与字符串的转换

split函数

默认无参时把字符串按空格分隔成列表。

>>> s="this is a string"
>>> s.split()
['this', 'is', 'a', 'string']

带参数时按照参数分隔。

>>> s="12:35"
>>> s.split(":")
['12', '35']

join函数

把一个列表按照某个字符串来作为连接,格式为s.join(l),其中s为连接的字符串,l为列表。

>>> l=["hello","world"]
>>> "-".join(l)
'hello-world'

元组

与列表基本一样,但是元组是用圆括号'('包裹的。并且元组中的元素不能被改变(可以看出C/C++中的const string)!

元组与字符串一致都不支持元素的重新赋值。

元组可以使用除了修改元素的所有的列表的函数。

一般不加括号的容器默认为元组。

>>> a,b=3,4
>>> a
3
>>> b
4
>>> p=3,4
>>> p
(3, 4)

tuple函数

可以用tuple函数把其他容器转化为元组。

随机库random

使用随机函数前需要import random

shuffle函数

random.shuffle(t)

把容器t随机打乱。

>>> import random
>>> t=["zyk","zjc","ysy","xhm"]
>>> random.shuffle(t)
>>> t
['ysy', 'xhm', 'zyk', 'zjc']
>>> random.shuffle(t)
>>> t
['xhm', 'zjc', 'zyk', 'ysy']

其他函数详见:python--随机函数(random,uniform,randint,randrange,shuffle,sample)

随机数种子

seed(int a),每个种子获得的随机数是相同的,可以借此来完成一些特殊的任务。

MOOC python笔记(三) 序列容器:字符串、列表、元组的更多相关文章

  1. Python第三天 序列 数据类型 数值 字符串 列表 元组 字典

    Python第三天 序列  数据类型  数值  字符串  列表  元组  字典 数据类型数值字符串列表元组字典 序列序列:字符串.列表.元组序列的两个主要特点是索引操作符和切片操作符- 索引操作符让我 ...

  2. Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式

    Python第三天 序列  5种数据类型  数值  字符串  列表  元组  字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell ...

  3. python字符串列表元组序列操作

    Table of Contents generated with DocToc python系列-字符串.列表.元组的操作 序列的访问及运算符 序列通用操作 访问单个元素 切片访问一部分元素 序列的复 ...

  4. Python学习三---序列、列表、元组

    一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...

  5. Python基础灬序列(字符串、列表、元组)

    序列 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员.序列包含字符串.列表.元组. 字符串 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' print(c ...

  6. MOOC python笔记(二)python中的数据类型和基本语句

    python数据类型 数字类型 整数(int) 与数学中整数概念一致(数字大小没有限制,这和其他语言不同),整数可正可负,默认情况下,整数采用十进制.其他进制需要增加相应的引导符号. 如果是二进制在前 ...

  7. day5_python学习笔记_chapter6_字符串列表元组

    1. 序列:seq[n], seq[x:y], seq * n序列重复n次,切片, 序列翻转 s=”abcde", s[::-1]="edcba" 内建函数:1. 类型转 ...

  8. python笔记(2)--字符串

    一.创建字符串 使用 '' , "" , ''' 和 """ 来创建字符串 var1 = 'hello, world' var2 = "ja ...

  9. Python基础:序列(字符串)

    一.概述 字符串 类似于C中的字符数组(功能上更像C++中的string),它是由一个个 字符 组成的序列.与C/C++不同的是,Python中没有 字符 这个类型,而是用 长度为1的字符串 来表示字 ...

随机推荐

  1. 基于STC89C52的oled红外遥控闹钟

    这个红外遥控主要是程序通过对按下的键的键码进行解析,并运行相应的功能代码 一次按键动作的遥控编码信息为 32 位串行二进制码.对于二进制信号“0”,一个脉冲占 1.2ms:对于二进制信号“1”,一个脉 ...

  2. charles 禁用缓存

    本文参考:charles 禁用缓存 No caching Settings/无缓存工具的用法 弹窗面板上一句话概括了他的工作原理:通过修改请求和响应头来防止缓存; 无缓存工具 无缓存工具阻止客户端应用 ...

  3. Python3 爬虫之 Scrapy 核心功能实现(二)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的搭建过程请参照本人的另一篇博客:Python3 爬虫之 Scrap ...

  4. MYSQL之概念基础篇

    1数据库概述 1.1 数据管理技术的产生和发展 数据库技术是应数据库管理任务的需要而产生的.20世纪50年代中期以前,计算机主要是用于科学计算.当时的硬件状况是,外存只有纸带.卡片.磁带,没有磁盘等可 ...

  5. wrk,ab,locust,Jmeter 压测结果比较

    背景: 项目需要对一批接口进行压测,要求是接口的QPS(Quest Per Second每秒请求数)达到6万以上由于楼主一直使用的压力测试工具是jmeter,但是jmeter单台电脑无法达到6万的QP ...

  6. Nginx--面试基础必会

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 最近一直在更新关于Nginx的系列文章,终于将Nginx的几个关键知识点讲的差不多了.本篇作为Nginx系列的 ...

  7. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...

  8. FourAndSix2 靶机渗透

    0x01 简介 FourAndSix2是易受攻击的一个靶机,主要任务是通过入侵进入到目标靶机系统然后提权,并在root目录中并读取flag.tx信息 FourAndSix2.镜像下载地址: https ...

  9. SpringBoot启动zipkin-server报错Error creating bean with name ‘armeriaServer’ defined in class path resource

    目前,GitHub 上最新 release 版本是 Zipkin 2.12.9,从 2.12.6 版本开始有个较大的更新,迁移使用 Armeria HTTP 引擎. 从此版本开始,若直接添加依赖的 S ...

  10. [C++] 类的使用(1)

    1.类的基本思想是数据抽象和封装.数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术. 2.常量对象,以及常量对象的引用或指针都只能调用常量成员函数.因为非常量成员函数有可能修改其作用的对象,与 ...