列表与元组(三)

前言


闲言:结束一天的工作,今天确实有点累,现在时间已经是22:50了,其实心里真的不想打开电脑继续写,可能这就是惰性吧。
本来自己就不是那种特别能坚持的人,但是当我打开电脑之后觉得坚持一下实际上也没那么难,所以是不是开头很难,中间易?
如果有人看到了这篇博客,我想对你说:无轮做什么,一定要坚持、一定要自律,不要像我一样,不想写学习就试图找个说服自己不愧疚的理由。

正文:在前面的章节中主要学习了什么序列、序列的索引与分片,本节主要介绍的序列的运算,主要是序列相加和序列的乘法。

一、序列相加

序列是可以相加的,但是要注意这里的相加并不是相对应的元素值相加,而是序列首尾相接。由于字符串属于字符串序列,所以字符串相加也可以看作序列相加,但是一个字符串不能和另一个序列相加,否则会抛出异常。

1、本例演示了两个序列之间的加法,以及序列和字符串相加会抛出异常
print([1,2,3]+[4,5,6])
print('Hello'+'world')
print([1,2,3]+['hello'])
print([1,2,3]+['h','e','l','l','o'])
print([1,2,3]+'hello')
输出结果:
[1, 2, 3, 4, 5, 6]
Helloworld
[1, 2, 3, 'hello']
[1, 2, 3, 'h', 'e', 'l', 'l', 'o']
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-35e2b49fddd0> in <module>()
      3 print([1,2,3]+['hello'])
      4 print([1,2,3]+['h','e','l','l','o'])
----> 5 print([1,2,3]+'hello')

TypeError: can only concatenate list (not "str") to list

可以看到,上面代码中运行最后一条语句会抛出异常,因为是序列和字符串相加,而要让序列与字符串相加,需要将‘hello’作为序列的一个元素,如[‘hello’],然后在进行相加,两个相加的序列元素的数据类型可以是不一样的,例如,上面代码中第3行将一个整数类型的序列和一个字符串类型的序列相加。

二、序列的乘法

如果用数字n乘以一个序列会生成一个新的序列,而在新的序列中,原来的序列将会被重复N次,如果序列的值为None(Python内建的一个值,表示‘什么都没有’),那么将这个序列与数字n相乘,假设这个包含None值得序列长度是1,那么就会产生占用n个元素空间的序列。

2、本例通过字符串与数字相乘,复制字符串;通过将数字与序列相乘复制序列
print('hello'*5)
print([20]*10)
print([None]*6)
输出结果:
hellohellohellohellohello
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20]
[None, None, None, None, None, None]
3、本例会利用序列的乘法生成一个6*11二维序列,序列的每一个元素是一个以为序列,序列中的每一个元素是空格或星号(*),二维序列中的元素会形成一个由星号(*)组成的三角形
spacenum=5
i=1
linespacenum=spacenum
triangle=[]
#开始生成三角形
while linespacenum>=1:
	#生成左侧空格
	leftspacelist=[' ']*linespacenum
	#生成星星列表
	starlist=['*']*(2*i-1)
	#生成右侧空格列表
	rightspacelist=[' ']*linespacenum
	#生成每一行序列
	linelist=leftspacelist+starlist+rightspacelist
	triangle.append(linelist)
	linespacenum-=1
	i+=1
for i in triangle:
	print(i)

输出结果:
[' ', ' ', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', '*', '*', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', '*', '*', '*', '*', '*', ' ', ' ', ' ']
[' ', ' ', '*', '*', '*', '*', '*', '*', '*', ' ', ' ']
[' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', ' ']

三、检查某个值是否属于一个序列

为了检查某个值是否属于一个序列,可以使用in运算符。这个运算符是不二运算符,也就是说,如果某个值属于一个序列,那么in运算符会返回True,否则会返回False。

4、在这个例子中利用in运算符判断一个字符是否属于另一个字符串,以及一个值是否属于一个序列
str='I Love you'
print('you' in str)
print('hello' in str)
names=['Bill','Jack','Mike']
print('Mike' in names)
print('mary' in names)

'''
输出结果:
True
False
True
False
'''

在上面的代码中,通过in运算符,检查了‘you’和‘hello’是否属于str,很显然,str包含‘you’,因此返回True而不包含‘hello’返回False。

5、本例要求从控制台输入用户名和密码,并通过in运算符在在account序列中重查找是否存在输入的用户名和密码,入股存在,输出‘登录成功’,如果不存在输出‘登陆失败’,account就相当于一个表里面保存了多条用户记录
account=[
['张三','123456'],
['李四','654321'],
['王五','567890']
]
username=input('用户名:')
password=input('密码:')
#用in运算符判断是否存在account序列中
if [username,password] in account:
	print('登录成功')
elseprint('登陆失败')
输出结果:
'''
用户名:张三
密码:123456
登录成功

用户名:赵四
密码:234567
登录失败
'''
通过上面的代码能够看到,account序列的每一个元素也是一个序列,通过in运算符进行判断,如果属于,则返回True,否则返回False

四、序列的长度、最大值和最小值

主要介绍三个函数,len、max、min。这三个函数分别用来返回序列中元素的数量、序列中值最大的元素和序列中值最小的元素。使用max和min函数要注意一点,就是序列中的每一个元素值必须是可比较的,否则会抛出异常。例如,如果序列中包含的整数和字符串类型的元素,那么使用min和max函数将会抛出异常

6、本例测试了lenmaxmin函数的用法,在使用maxmin函数是,如果函数参数指定了不同类型的序列或值,并且这些值无法比较,将抛出异常。
values=[10,40,5,67,86,23,-2,1]
print(len(values))
print(max(values))
print(min(values))
print(min([4,2,7]))
print(max([34,56,23]))
print(max(['abc',4,7]))
输出结果:
8
86
-2
2
56
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-851b2f3fec46> in <module>()
      5 print(min([4,2,7]))
      6 print(max([34,56,23]))
----> 7 print(max(['abc',4,7]))

TypeError: '>' not supported between instances of 'int' and 'str'

从上面的代码中可以看到,max和min的参数不仅可以是一个序列,还可以是可变的参数,这两个函数会返回这些参数中的最大值和最小值,否则会抛出异常。不管max和min函数的参数是一个序列还是一个可变参数,每个值都必须是可比较的,否则会抛出异常。


总结

本节仍然介绍列表与元组的内容,主要关于序列的运算,主要包括序列的相加、序列的相乘以及in运算符判断一个元素是否属于序列。解释一下这里为什么叫序列,很多人可能说这不就是列表吗?我在前面已经说过了,序列可以是列表,但也可以是别的,比如说元组、比如说字符串等等,所以这里的序列的操作同样复用于列表、元组、字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值