学习python的第二周的第二天

学习python的第二周

——第二天

练习:

  • homework01 – 用一个列表保存54张扑克牌,先洗牌,
    再按斗地主的发牌方式把牌发给三个玩家,多的3张牌给第一个玩家(地主),最后把每个玩家手上的牌显示出来。
import random

suits = [ '♠' , '♥' , '♣' , '♦' ]
faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10','J', 'Q', 'K']
# 列表生成式
cards = [f'{suit}{face}' for suit in suits for face in faces]
'''等于
for suit in suits:
	for face in faces:
		cards = [f'{suit}{face}']
'''

cards.append('大王')
cards.append('小王')
# 随机打乱列表的元素
random.shuffle(cards)

players = [[] for _ in range(3)]  # 创造列表生成式
for _ in range(17):
    for i in range(3):
        # pop()随机删除一个元素并返回该值
        players[i].append(cards.pop())
players[0].extend(cards)

for player in players:   # 列表循环生成式的寻找元素
    player.sort(key = lambda x: x[1:])
    for card in player:
        print(card, end=' ')
    print()
  • example01- 保存5个学生,3门课程的成绩

    import random
    
    names = ('关羽', '张飞', '赵云', '马超', '黄忠')
    courses = ('语文', '数学', '英语')
    scores = [[random.randrange(60,101) for _ in range(len(courses))] for _ in len(nums)]
    print(scores)
    # for i, name in enumerate(names):
    #     for j, course in enumerate(courses):
    #         print(f'{name}的{course}成绩: {scores[i][j]}')
    
  • 统计每个学生的平均成绩

    for i,name in enumerate(names):
    	print(f'{name}平均成绩为{sum(scores[i])/len(couses):.1f}')
        # scores是二元组,但是可以一元组形式存在
    
  • 统计每门课的最高分和最低分

    for j, course in enumerate(courses):
        temp = [scores[i][j] for i in range(len(names))]
        #  for i in range(len(names)):
        #    temp.append(scores[i][j])
        print(f'{course}的最高分: {max(temp)}')
        print(f'{course}的最低分: {min(temp)}')
    

元组

不可变的容器,元组也是多个元素按照一定的顺序构成的序列。。元组和列表的不同之处在于,元组是不可变类型,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能进行修改。定义元组通常使用()字面量语法,也建议大家使用这种方式来创建元组。

fruits1 = ('apple', 'banana', 'grape')
print(type(fruits1))
# 其中命名变量时,不能命名为tuple(关键字,tuple()函数)
# 重复运算
print(fruits1 * 3)
# 这里不i改变元组本身

# 成员运算
print('apple' in fruits1)
print('grape' not in fruits1)
# 看代码是否在元组里,输出结果True or Flase

# 找元素的数量
print(len(fruitsl)      # 3 
      
# 合并运算
fruits2 = ('pitaya', 'litchi')
fruits3 = fruits1 + fruits2
print(fruits3)
      
# 索引和切片
print(fruits1[2],fruits1[-1]) # grape grape
# TypeError: 'tuple' object does not support item assignment
# fruits3[4] = 'shit'
      
print(fruits3[1:4])  # 从1取到位置4之前
print(fruits3[1:4:2])  # 从1取到位置4,并步长为2
print(fruits3[::-1])  # 将列表反转
# tuple[起始位置:终止位子(不取最后一个):步长或反取值]

# 索引和求取该值出现次数
print(fruits3.index('apple'))
# 取该元素所在位子下标
print(fruits3.count('apple'))
#  统计该元素出现次数

由于元组是不可变的容器,当执行该语句时就会报错,并提示元组不具备这样的属性。

定义一元组时,需要在元素后面加一个‘’,这样才是定义数组,不然就是输入什么类型就是什么类型,例子如下

# AttributeError: 'tuple' object has no attribute 'append'
# fruits3.append('durian')
# AttributeError: 'tuple' object has no attribute 'pop'
# fruits3.pop(0)
# AttributeError: 'tuple' object has no attribute 'remove'
# fruits3.remove('banana')

# 空元组
a = ()
print(type(a))    # <class 'tuple'>
# 不是元组
b = ('hello')
print(type(b))    # <class 'str'>
c = (100)
print(type(c))    # <class 'int'>
# 一元组
d = ('hello', )
print(type(d))    # <class 'tuple'>
e = (100, )
print(type(e))    # <class 'tuple'>

元组的应用场景

打包和解包操作。
#  打包

a, *_, b = 5, 10, 15, 20, 25
print(a)     # 5
print(c)	 # 25
# 可以得出处两边所有值外打包了中间的值,并形成列表

*a, b, c = 5, 10, 15, 20, 25
print(a)
print(b)
print(c)
#  [5, 10, 15] 20 25

a, b, *c = 5, 10, 15, 20, 25
print(a)
print(b)
print(c)
# 5 10 [15, 20, 25]


##解包
a = 1, 10, 100, 1000
# i, j, k = a             # ValueError: too many values to unpack (expected 3)
# i, j, k, l, m, n = a    # ValueError: not enough values to unpack (expected 6, got 4)

a = 1, 10, 100, 1000
i, j, *k = a
print(i, j, k)          # 1 10 [100, 1000]
i, *j, k = a
print(i, j, k)          # 1 [10, 100] 1000
*i, j, k = a
print(i, j, k)          # [1, 10] 100 1000
*i, j = a
print(i, j)             # [1, 10, 100] 1000
i, *j = a
print(i, j)             # 1 [10, 100, 1000]
i, j, k, *l = a
print(i, j, k, l)       # 1 10 100 [1000]
i, j, k, l, *m = a
print(i, j, k, l, m)    # 1 10 100 1000 []
交换
# a = b, b = a`ROT_TWO`
a, b = b, a

# ROT_THREE
a, b, c = b, c, a
a = '\'hello, \a\tworld\b\b\''
b = "\"hello, \n\nworld\""
# '\n'转行 '\t'空格 、'\b'删除最后一个元素,有几个\b就删几个 \是转义的意思
c = '''
床前明月光,
疑似地上霜。
举头望明月,
低头思故乡。
'''

print(a)
print(b)
print(c)

# 原始字符串(每个字符都是它原始的含义,没有转移字符)
d = r'c:\Users\Administrator\abc\hello.py'
print(d)

# 带占位符的字符串(格式化字符串)
e = f'文件路径: {d}'
print(e)

s1 = '\141\142\143\x61\x62\x63'
# 二进制 x开头的十进制
print(s1)
# ASCII ---> GB2312 ---> GBK ---> Unicode(UTF-8)
s2 = '\u9a86\u660a'
print(s2)

在这里插入图片描述

总结

列表和元组都是容器型的数据类型,即一个变量可以保存多个数据。列表是可变数据类型元组是不可变数据类型,所以列表添加元素、删除元素、清空、排序等方法对于元组来说是不成立的。但是列表和元组都可以进行拼接成员运算索引和切片这些操作,就如同之前讲到的字符串类型一样,因为字符串就是字符按一定顺序构成的序列,在这一点上三者并没有什么区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值