Python 基础知识 : 序列

序列

参考了《Python基础教程:第3版》,也算是读书笔记,整理下来,方便回顾

1.1 序列概述

在 Python 中最基本的数据结构为序列,列表、元组以及字符串是 Python 中常用的重要的序列。列表和元组的主要不同在于,列表是可以修改的,而元组不可以。这意味着列表适用于需要中途修改元素的情形,而元组适用于出与某种考虑禁止修改序列的情形。
Python 支持一种数据结构的基本概念,名为容器(container)。容器基本上就是可包含其他对象的对象。两种主要的容器是序列(例如:列表和元组)和映射(如字典)。在序列中,每个元素都有编号,而在映射中,每个元素都有名称(键)。

有几种操作适用于所有序列,包括:索引、切片、相加、相乘成员资格检查以及迭代。

  • 索引
    序列中的所有所有元素都有编号,从 0 开始递增。
string = 'python makes you happy'
print(string[0])

# 字符串就是由字符组成的序列。索引 0 指向 第一个元素。
# 不同于其他语言,Python 没有专门表示字符的类型,因此一个字符就是只包含一个元素的字符串

list1 = [2, 3, 4, 6, 1]
print(list1[-1])
# 当使用负数索引时,Python 将从右边(即最后一个元素)开始往左数,因而 -1 是最后一个元素的位置

  • 切片
    使用切片(slicing)来访问特点范围的元素。为此,可是有两个索引,并用冒号分隔
month = ['January', 'February', 'March', 'April', 'May',
         'June', 'July', 'August', 'September', 'October', 'November', 'December']
print(month[2:6])
>> ['March', 'April', 'May', 'June']
# 第一个索引是包含的第一个元素的编号
# 但第二个索引是切片后余下的第一个元素的编号
# 简而言之,两个索引来指定切片的边界,其中第一个索引指定元素包含在切片内,但第二个索引指定的元素不包含在切片内。

numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers[4:10])
>> [5, 6, 7] 
# numbers 这个列表的长度为 6 ,索引8取的是第 7 个元素,这个元素不存在,但依然取得 numbers 最后三个元素

print(numbers[-3:-1])
>> [5, 6] 
# 可以使用负数索引

print(numbers[-3:0])
>> []
# 该结果为空, 这是因为执行索引操作时,如果第一个索引的元素位于第二个索引值得元素后边,结果为空序列

print(numbers[-3: ])
>> [5, 6, 7]
# [-3:-1] 但不包含最后一个元素,因而可以使用 [-3 :], 索引一直到结束,可以省略第二个索引

print(numbers[ :3])
>> [1, 2, 3]
# 同样切片始于序列的开头,可以省略第一个索引

执行切片操作时,常常显式或隐式地指定起点和终点,但通常省略了另一个参数,即步长。在默认情况下,步长为 1 。

numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers[0:5:2])
>> [1, 3, 5]
# 指定步长为 2 

print(numbers[::3])
>> [1, 4, 7]
# 显式地指定步长时,也可以简写,

print(numbers[::-2])
>> [7, 5, 3, 1]
# 也可以指定步长为负数

print(numbers[0:6:-2])
>> []
#当第二个索引的元素位于第一个索引后边时,指定步长为负数,将返回空序列
  • 序列相加
    可以使用加法来拼接序列
a = [2, 3, 9]
b = [1, 4, 5]
print(a + b)
>> [2, 3, 9, 1, 4, 5]

s = (1, 0, 8)
print(a + s)
>> TypeError: can only concatenate list (not "tuple") to list
# 虽然都是序列,但一般而言,不能拼接不同类型的序列
  • 乘法
    将序列与数 x x x相乘时,将重复这个序列 x x x 次来创建一个新的序列
s = (1, 0, 8)
print(s * 2)
>> (1, 0, 8, 1, 0, 8)

  • 成员资格
    要检查特点的值是否包含于序列中,可以使用运算符 in 。她检查是否满足指定的条件,并返回相应的值:满足时返回 True;不满足时返回 False
list1 = [1, 3, 4, 5, 6]
print(2 in list1)
>> False
print(3 in list1)
>> True
  • 长度、最小值、最大值
    内置函数len min max ,其中 len 返回序列包含的元素个数,而 minmax 分别返回序列中的最小值与最大值
nums = [222, 33, 123]
print('len', len(nums))
print('max', max(nums))
print('min', min(nums))

>> len 3
   max 222
   min 33

1.2 列表:Python的主力

  • 函数 list
    鉴于不能像修改列表那样修改字符串,因而在有些情况下使用字符串创建列表很有帮助。为此可以使用 list
language = 'Python'
print(list(language))
>> ['P', 'y', 't', 'h', 'o', 'n']
# 可将任何序列作为list 的参数,不限于字符串

language_list = list(language)
language_list[0] = 'p'
print(''.join(language_list))
>> python
# 将字符串列表转换为字符串,
  • 可对列表执行所有的标准序列操作,如索引、切片、拼接和相乘,但列表的有趣之处在于其是可以修改的。

    • 修改列表:给元素赋值
    • 删除元素
    • 给切片赋值 :可给多个元素赋值,通过切片可以替换不同长度的序列
  • 列表的方法

    • append 用于将一个对象附加到列表的末尾
    • clear 清空列表的内容,lst.clear() 等价于 lst[:] = []
    • copy 复制列表
    • count 计算指定的元素在列表中出现的次数 lst.count(ele)
    • extend 能够将多个值附加到列表末尾 lst1.extend(lst2), 其与拼接的不同在于,这将修改 ‘lst1’ ,拼接是返回一个全新的序列
    • index 在列表中查找指定值第一次出现的索引 lst.index(value),当指定元素不在列表时,会引发错误
    • insert 用于将一个对象插入列表的指定位置 lst.insert(idx, value)
    • pop 从列表中删除一个元素(末尾为最后一个元素),并返回该元素 lst.pop([idx]) 其中[idx]指定时,删除该索引的元素,美誉指定时,删除列表最后一个元素。
      可以使用 pop 实现一种常见的数据结构栈(stack),后进先出(LIFO)可以用 append替代 push 操作。
    • remove 由于删除第一个为指定值的元素 lst.remove(ele),就地修改不返回值,指定元素不在列表时,引发错误。
    • reverse 按相反的顺序排列列表中的元素 lst.reverse() 就地修改
    • sort 用于对列表排序。就地排序意味着对原来的列表进行修改lst.sort()sorted函数排序,并返回结果 sorted(lst)
    • 高级排序: sort 方法接收两个可选的参数 key 和 reverse 。参数key,可将其设置为一个用于排序的函数。利用这个函数为裂变的每个元素创建一个键,再根据这些键对元素排序。比如一个含有字符串的列表,可将key 设置为函数len 。根据子树串的长度对元素排序。 reverse = (True\False) 指定是否按照相反顺序排序

1.3 元组:不可修改的序列

只要将一些值用逗号分隔,就能自动创建一个元组, 通常用圆括号括起来

1, 2, 3
>> (1, 2, 3)

1325>> (1325,)
# 创建包含一个元素的元组

函数 tuple 将一个序列作为参数,将其转换为元组。
元组的切片也是元组

1.4 字符串

所有标准序列的操作都适用于字符串。字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的

1.4.1 设置字符串的格式
forma = 'Hello, %s is the %s language'
values = ('Python', 'best')
forma % values
>> 'Hello, Python. is the best language'
# %s 为转换说明符,指出了要将值插入到什么位置
# s 意味着将值是为字符串进行格式设置,如果指定的值不是字符串,将使用 str 强制转换

上述是一种比较旧的方法,现在用的比较多的是字符串的format 方法, 它融合了早期方法的优点。使用这种方法时,每个替换字段都使用花括号括起来,其中可能包含名称,还可能包含有关如何相应的值进行转换和格式设置的信息。
替换字段(其中每个部分都是可选的)

  • 字段名:索引或标识符,指出要设置哪个值得格式并使用结果来替换该字段。除指定值外,还可指定值得特定部分,如列表得元素
  • 转换标志:跟在叹号后面的单个字符。当前支持的字符包括 r(表示repr)、s(表示str)和 a(表示 ascii)。如果指定了转换标志,将不适用对象本身的格式设置机制,而是使用指定的函数将对象转化为字符串,再做进一步的格式设置
  • 格式说明符: 跟在冒号后面的表达式(这种表达式是使用微信格式指定语言表示的)。格式说明符能够详细地指定最终的格式,包括格式类型,字段宽度和数的精度,如何显示符号和千位分隔符,以及各种对齐和填充方式。
'good good {}, day day {}'.format('study', 'up')
>> 'good good study, day day up'
'one {1} three {2} {0}'.format('seven', 'four', 'three')
>> 'one four three three seven'
# 在最简单的情况下, 替换字段没有名称或将索引用作名称

'my name is {name}, I am {old} years old'.format(name='Bob', old=10)
>> 'my name is Bob, I am 10 years old'
# 可以给参数指定名称,注意到 old 为 int 型变量

print('{word!s} {word!r} {word!a}'.format(word='汉字'))
>> 汉字 '汉字' '\u6c49\u5b57'
# 指定转换标志,
# 函数 str 通常创建外观普通的字符串版本
# 函数 repr 尝试创建给定值的 Python 表示(这里是一个字符串字面量)
# 函数 assii 创建只包含 ASCII 字符的表示  

print('My favorite number is {num}'.format(num=10))
print('My favorite number is {num:.3f}'.format(num=10))
>> My favorite number is 10
>> My favorite number is 10.000
>> My favorite number is 1010
# 可以指定需要转换的数据类型,即在冒号后边说明,也可以指定长度

字符串格式设置中的类型说明符

类型含义
b将整数表示为二进制数
c将证书解读为 Unicode 码点
d将整数视为十进制数进行处理,这是整数默认使用的说明符
e使用科学表示法来便是小数(用e来表示指数)
E与 e 相同,但使用 E 来表示指数
f将小数表示为定点数
F与 f 相同,但对于特殊值 (nan 和 inf),使用大写表示
g自动在定点表示法和科学表示法之间做出选择。这是默认用于小数的说明符,默认情况下至少有 1 位小数
G与 g 相同,但使用大写表示指数和和特殊值
n与 g 相同,但插入随区域而异的数字分隔符
o将整数表示为八进制数
s字符串的说明符
x将证书表示为十六进制数并使用小写字母
X与 x 相同,但使用大写字母
%将数表示为百分比值(乘以100,按说明符 f 设置格式,再在后边加上 %)
print(r'number:{:10}'.format(3))
print(r'string:{:10}'.format('wasd'))
>> number:         3
>> string:wasd  
# 指定宽度时,字符串与数字的对齐方式不同

import math
print('pi = {:.5f}'.format(math.pi))
>> pi = 3.14159
# 精度使用整数指定,但需要在它前面加上一个表示小数点的句点

print('bigger number: {:,}'.format(31415926))
>> bigger number: 31,415,926
# 使用千分位分隔符

import math
print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(math.pi))
>> 
# 运行后可看结果, 分别指定了左对齐、居中和右对齐

1.4.2 字符串方法
print("The Middle by Jimmy Eat World".center(39))
print('The Middle by Jimmy Eat World'.center(39,'-'))
>>      The Middle by Jimmy Eat World     
>> -----The Middle by Jimmy Eat World-----
# 方法 center 通过在两边添加填充字符(默认位空格)使字符串居中
# 相似作用的还有 ljust , rjust ,zfill 

print('With a moo-moo here, and a moo-moo there'.find('moo'))
>> 7
# 方法 find 在字符串中查找子串。如果找到,返回子串的的哥字符的索引,否正返回-1

print('moo' in 'With a moo-moo here, and a moo-moo there')
>> True
# 成员资格检查也可以查找子串,返回布尔值

a = ['1', '4', '3', '3', '7', '6']
''.join(a)
>> '143376'
# join 用于合并序列的元素

'143376'.split('7')
>> ['1433', '6']
# 与 join 相反,实现分割

# lower 返回字符串小写版本

# title 字符串中所有单词的首字母都大写,其他字母都小写

print('This is a test'.replace('is', 'ezz'))
>> Thezz ezz a test
# replace 将指定子串替换位另一个字符串,并返回替换后的结果, 
# 如果指定子串不在,则返回原字符串

# strip: 方法strip 将字符串开头和末尾的空白(也可指定字符)删除,并返回删除后的结果。

table = str.maketrans('cs', 'kz')
print('this is an incredible test'.translate(table))
>> thiz iz an inkredible tezt
# translate 与 replace 类似,但只能进行单字符替换;当替换多个字符时,效率更高

# 判断字符串是否满足特点条件,例如:isspace、isdigit、 issupper

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值