目录
元组
元组与列表类似,也是元素的有序序列。元组与列表的区别是:元组存储的值不能被修改,即这些数据值是不可改变的。元组中没有append()、extend()和insert()方法。除此之外,列表中的其他函数和方法对元组同样适用。
元组可以当成一个独立的对象使用,也可以通过索引方式引用其他任何元素。
1.1 元组的创建和使用
1.元组的创建
元组的定义通常是由逗号分隔,或由圆括号括住的一个序列。列表是用方括号括住。
例如:
t1=('month','year',1997,2000) #用圆括号括住多个用逗号分隔的元素
t2=(1,2,3,4,5)
t3='a','b','c','d' #多个用逗号分隔的元素,输出时自动加上圆括号
注意:
- 元组中数据的类型可以不同;
- t=()表示创建一个空元组,而不是表达式;
- 创建只有一个元素的元组时,语句的末尾要加逗号,如t='a',或t=('a',);
- 可以使用tuple()函数把一个列表转换为元组,如t1=[1,2,3,4,5],t2=tuple(t1)。
对于上面注意中的第3点,如果末尾不加逗号,就没有成功创建一个元组。例如:
t1='a'
t2='a',
t3=('a')
t4=('a',)
print(t1,end='\t')
print(t2,end='\t')
print(t3,end='\t')
print(t4,end='\t')
执行结果为:
E:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
a ('a',) a ('a',)
Process finished with exit code 0
2.元组的访问和切片
元组内元素的访问和切片与列表一致。通过单个索引,可以获得该索引位置的元素,但是只能读,不能修改。通过切片,可以获得由若干个元素构成的子元组。
3.元组操作符
元组对+和*的操作符与字符串相似。其中,+用于合并元组,*用于重复元组。成员运算符in和not in用来测试元素是否在元组中。使用方法见4.1节。
4.删除整个元组
虽然元组的元素不能修改,但是可以用del元组名来删除整个元组。
5.元组的函数和方法
在列表的函数和方法中,除append()、extend()和insert()这3种方法之外,其他函数和方法都可以用于元组。使用方法见4.1节。
1.2 不可变和可变对象
对象是一个可以存储数据并且具有数据操纵方法的实体。数值、字符串、列表和元组都是对象。当使用赋值语句创建一个变量后,赋值号之后的值就成为内存中的一个对象,变量名(引用)指向该对象。修改一个列表是在该对象所在空间中完成。当一个变量要修改的值是数值、字符串或元组时,Python会分配一个新的内存空间存储新值,并把此对象赋值给该变量。
因此,列表相当于原地修改,但是数值、字符串和元组不是。能够原地修改的对象称为可变的,不能原地修改的对象是不可变的。
编写一个Python程序,模拟扑克游戏的发牌,两副牌,4个人玩。
程序如下:
import random
print('扑克游戏发牌模拟')
#定义牌的数字元组
ranks=('2','3','4','5','6','7','8','9','10','J','Q','K','A')
#定义牌的花色元组
suits=('黑桃','红桃','方块','梅花')
#通过列表解析,把2个元组组合在一起,生成新的列表
puke=[(x,y) for x in suits for y in ranks]
pai=puke*2 #两副牌
cardRand=random.sample(pai,104) #使用随机函数打乱扑克牌的顺序
#定义玩家列表,存放所分发的牌
play1=[]
play2=[]
play3=[]
play4=[]
#洗好的牌按顺序分发给4个玩家,模拟发牌
for i in range(26):
play1.append(cardRand.pop())
play2.append(cardRand.pop())
play3.append(cardRand.pop())
play4.append(cardRand.pop())
play1.sort(key=lambda x:x[0]) #按花色对分到的牌排序
play2.sort(key=lambda x:x[0])
play3.sort(key=lambda x:x[0])
play4.sort(key=lambda x:x[0])
print('玩家1的牌')
#输出玩家1的牌,每行输出6个数据
i=1
for each in play1:
print(each,end=',')
if i%6==0:
print()
i=i+1
print('\n玩家2的牌')
i=1
for each in play2:
print(each,end=',')
if i%6==0:
print()
i=i+1
print('\n玩家3的牌')
i=1
for each in play3:
print(each,end=',')
if i%6==0:
print()
i=i+1
print('\n玩家4的牌')
i=1
for each in play4:
print(each,end=',')
if i%6==0:
print()
i=i+1
运行结果:
E:\PycharmProjects\PythonTest\venv\Scripts\python.exe E:/PycharmProjects/PythonTest/ssss.py
扑克游戏发牌模拟
玩家1的牌
('方块', '5'),('方块', 'J'),('方块', '2'),('方块', '6'),('方块', '10'),('方块', 'Q'),
('方块', '8'),('方块', 'A'),('梅花', '10'),('梅花', '7'),('梅花', 'A'),('梅花', '7'),
('梅花', 'K'),('梅花', '2'),('梅花', '3'),('红桃', 'A'),('红桃', '3'),('红桃', '5'),
('红桃', '2'),('红桃', '4'),('黑桃', 'K'),('黑桃', '7'),('黑桃', '3'),('黑桃', '2'),
('黑桃', '4'),('黑桃', '6'),
玩家2的牌
('方块', '9'),('方块', '8'),('方块', 'K'),('方块', '3'),('梅花', '9'),('梅花', 'A'),
('梅花', '4'),('红桃', '6'),('红桃', 'Q'),('红桃', '5'),('红桃', '7'),('红桃', 'J'),
('红桃', '9'),('红桃', '10'),('红桃', 'A'),('红桃', 'K'),('红桃', 'J'),('红桃', '4'),
('红桃', '9'),('黑桃', '5'),('黑桃', '10'),('黑桃', 'J'),('黑桃', '9'),('黑桃', 'K'),
('黑桃', 'Q'),('黑桃', '8'),
玩家3的牌
('方块', '2'),('方块', 'J'),('方块', 'Q'),('方块', '4'),('方块', '3'),('方块', '7'),
('方块', '9'),('梅花', 'Q'),('梅花', 'J'),('梅花', '4'),('梅花', 'J'),('梅花', 'Q'),
('梅花', '6'),('梅花', '5'),('梅花', 'K'),('梅花', '9'),('红桃', 'K'),('红桃', '7'),
('红桃', '10'),('红桃', '3'),('黑桃', '2'),('黑桃', '8'),('黑桃', '7'),('黑桃', 'A'),
('黑桃', 'Q'),('黑桃', '10'),
玩家4的牌
('方块', 'K'),('方块', 'A'),('方块', '4'),('方块', '10'),('方块', '7'),('方块', '5'),
('方块', '6'),('梅花', '2'),('梅花', '6'),('梅花', '3'),('梅花', '8'),('梅花', '5'),
('梅花', '10'),('梅花', '8'),('红桃', 'Q'),('红桃', '8'),('红桃', '2'),('红桃', '6'),
('红桃', '8'),('黑桃', '3'),('黑桃', '9'),('黑桃', 'A'),('黑桃', '5'),('黑桃', '4'),
('黑桃', 'J'),('黑桃', '6'),
Process finished with exit code 0
第十行中sample(list, k)返回一个长度为k新列表,新列表存放list所产生k个随机不重复的元素,在本题中,也就完成了将所有牌打乱的功能。