3,通用的序列操作

python的学习3

今天的学习又开始了。

本文按照《python基础教程》(第三版)顺序进行学习

本文写作时开发环境:windows系统,python3.8 32-bit

列表和元组

列表和元组都是python内置的多种序列之一,其区别是:列表可以修改,元组不可以

列表

列表的表示:所有元素都放在方括号内,用逗号隔开

>>> edward = ['Edward Gumby',42]
>>> john = ['John Smith',50]
>>> database = [edward,john]
>>> database
[['Edward Gumby'42],['John Smith'50]]

字符串

以后探讨

通用的序列操作

索引

  • 编号:一个序列中所有元素都有编号,从左往右第一个元素编号为0,然后是1,2,3从右往左第一个元素编号为-1,然后是-2,-3.

注:对于字符串字面量(以及其他的序列字面量),可直接对其执行索引操作,无需先将其赋给

变量。这与先赋给变量再对变量执行索引操作的效果是一样的。

即:

>>> 'hello'[1]
'e'

>>> a = 'hello'
>>> a[1]
'e'

所以,如果函数返回一个序列,你就可以直接对这个序列进行索引操作:获取用户输入的年份的最后一位

>>> fourth = input('year:')[-1]
year:2003
>>> fourth
'3'
  • 索引操作示例
#将以数指定的年、月、日的日期打印出来
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
#一个列表,其中包涵数1-31对应的结尾
endings = ['st','nd','rd'] + 17*['th']\
          + ['st','nd','rd'] + 7*['th']\
          + ['th']

year  = input('Year: ')
month = input('Month(1-12): ')
day   = input('Day(1-31): ')

month_number = int(month)
day_number   = int(day)

#别忘了将表示月和日的数减一,这样才能得到正确的索引
month_name = months[month_number-1]
ordinal    = day + endings[day_number-1]

print(month_name + ' '+ ordinal + ',' + year)
input('退出请按回车:')

切片

用来访问特定范围内的元素

使用两个索引,并用冒号分隔

>>> tag = '<a href="http://www.python.org">Python web site</a>'
>>> tag[9:30]
'http://www.python.org'
>>> tag[32:-4]
'Python web site'
  • 切片适用于提取序列的一部分,其中的编号很重要
  1. 中括号中第一个索引是指包含的第一个元素的编号
  2. 中括号中第二个索引是指切片后余下的第一个元素的编号
>>> number = [1,2,3,4,5,6,7,8,9,10]
>>> number[3:6]
[4,5,6]
>>> number[0:1]
[1]

即:通过提供的两个索引来指定切片的边界,其中第一个索引指定的元素包含在切片内,但第二个索引指定的元素不包含在切片内

切片中的简写

  • 如果切片结束于序列结尾,可省略第二个索引number[3:]
  • 如果切片开始于序列开头,可省略第一个索引number[:6]
  • 如果要复制整个序列,可以将两个索引都省略number[:]

注:如果编号再进一步,可能出现

>>> number[-3:0]
[]

执行切片操作时,如果第一个索引指定的元素位于第二个索

引指定的元素后面(在这里,倒数第3个元素位于第1个元素后面),结果就为空序列.

切片示例:

#提取手机尾号
shoujihao = input('请输入手机号: ')
print('手机尾号:' + shoujihao[-4:])

切片的步长

在切片时,我们忽略了一个参数:切片的步长

通常的,在执行切片中,步长的默认值为1

步长的默认为1,不能为0,但是可以为负数

>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[1:5:2]
[2,4]
>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[10:0:-2]
[10,8,6,4,2]

相加

可以用加法运算符对序列进行拼接

>>> [1,2,3] + [4,5,6,7]
[1,2,3,4,5,6,7]
>>> 'hello' + ',world'
'hello,world'

但是

>>> 'hello' + [1,2,3]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    'hello' + [1,2,3]
TypeError: can only concatenate str (not "list") to str

由上述错误可知,不能拼接不同的序列

相乘

当一个序列和一个数x相乘时,将会重复这个序列x次来构成一个新序列

>>> 'python'*4
'pythonpythonpythonpython'
>>> 7*[42]
[42, 42, 42, 42, 42, 42, 42]

空列表

  • 空列表使用[]表示。

  • 如果要创建一个包涵十个元素的列表,但是没有任何有用的内容,可以使用[0]*10

    这将创建一个包含十个零的列表。

  • 如果想要表示列表中什么都没有,可以使用None.

    Python中,None表示什么都没有。(区分大小写)

    所以可以:

    >>> sequence = [None]*10
    >>> sequence
    [None, None, None, None, None, None, None, None, None, None]
    

乘法运算示例:

#在位于屏幕中间且宽度合适的方框内打印一个句子

sentence = input('sentence: ')

screen_width = 80
text_width   = len(sentence)
box_width    = text_width + 6
left_margin  = (screen_width - box_width)//2

print()
print(' ' * left_margin + '+'  + '-'*(box_width-2) +  '+')
print(' ' * left_margin + '| ' + ' '*(text_width+2)+ ' |')
print(' ' * left_margin + '|  '+ sentence         +'  |')
print(' ' * left_margin + '| ' + ' '*(text_width+2)+ ' |')
print(' ' * left_margin + '+'  + '-'*(box_width-2) +  '+')
print()

#此程序对中文无法正确排版

#sentence:序列  ,sceen:屏幕  ,width:宽度  ,text:文本  ,box:箱
#left:左边  ,margin:边缘

成员资格检查

简单来说,就是指检查元素是否包含在序列中。

  • 一般使用运算符in
  • 它的作用是检查是否满足指定的条件,并返回相应的值
  1. 满足时返回True
  2. 不满足时返回False

Ps:像in这样的运算符称为布尔运算符,而前述真值称为布尔值。

>>> permissions = 'pw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False

这两个示例使用成员资格测试分别检查'w'和'x'是否包含在字符串变量permissions中。在UNIX系统中,可在脚本中使用这两行代码来检查对文件的写入和执行权限。

>>> users = ['mlh','foo','bar']
>>> input('Enter your user name: ') in users
Enter your user name: mlh
True

这个示例检查提供的用户名mlh是否包含在用户列表中,这在程序需要执行特定的安全策略时很有用(在这种情况下,可能还需检查密码)。

>>> subject = '$$$ Get rich now!!! $$$'
'$$$' in subject
True

最后一个示例检查字符串变量subject是否包含字符串'$$$',这

可用于垃圾邮件过滤器中。

序列成员资格示例:

#检查用户名和PIN码
database = [
    ['abc','1234'],
    ['smith','4224'],
    ['jones','9843'],
    ['albert','7895']
    ]

username = input('User name: ')
pin = input('Pin: ')

if [username,pin] in database:
    print('Access granted')

上述代码可用来从用户那里获取一个用户名和一个PIN码,并检查它们组成的列表是否包含在数据库(实际上也是一个列表)中。

也可以将其变的更加复杂,比如分别检测用户名和密码,在输入错误信息时返回对应信息。或者其他更复杂的地方。

其他

容器

容器是python支持的一种数据结构的基本概念。

指的是可包含其他对象的对象,两种主要的容器是序列(如列表和元组)和映射(如字典)。

  • 在序列中,每个元素都有编号
  • 在映射中,每个元素都有名称(也叫

还有一种既不是序列也不是映射的容器,他就是集合

内置函数len,max,min

长度

函数len返回序列包含的元素个数

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

最大值和最小值

max和min分别返回序列中最大和最小的元素

>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> max(numbers)
10
>>> min(numbers)
1
>>> max(2,3,5)
5
>>> min(5,8,1)
1

最后,今天的学习结束。

posted @ 2021-02-18 21:56  话多  阅读(123)  评论(0)    收藏  举报