python元组

第026讲:元组

小甲鱼python第26讲

课堂笔记

rhyme = (1, 2, 3, 4, 5, '上山打老虎')
rhyme
(1, 2, 3, 4, 5, '上山打老虎')
rhyme = 1, 2, 3, 4, 5, '上山打老虎'
rhyme
(1, 2, 3, 4, 5, '上山打老虎')
rhyme[0]
1
rhyme[-1]
'上山打老虎'
rhyme[1] = 10
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    rhyme[1] = 10
TypeError: 'tuple' object does not support item assignment
rhyme[3:]
(4, 5, '上山打老虎')
rhyme[:]
(1, 2, 3, 4, 5, '上山打老虎')
rhyme[::-1]
('上山打老虎', 5, 4, 3, 2, 1)
rhyme[::2]
(1, 3, 5)
nums = (3, 1, 9, 6, 8, 3, 5, 3)
nums.count(3)
3
heros = ("蜘蛛", "绿巨人", "黑寡妇")
heros.index("黑寡妇")
2
s = (1, 2, 3)
t = (4, 5, 6)
s + t
(1, 2, 3, 4, 5, 6)
s * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
w = (s, t)
w
((1, 2, 3), (4, 5, 6))
for each in s:
    print(each)

    
1
2
3
for i in w:
    for each in i:
        print(each)

        
1
2
3
4
5
6
s = (1, 2, 3, 4, 5)
[each * 2 for each in s]
[2, 4, 6, 8, 10]
(each * 2 for each in s)
<generator object <genexpr> at 0x000001DBFAE798C0>
(1,)
(1,)
x = (520,)
type(x)
<class 'tuple'>
x = (520)
type(x)
<class 'int'>
#打包和解压
t = (123, "FishC", 3.14)
t
(123, 'FishC', 3.14)
x, y, z = t
x
123
y
'FishC'
z
3.14
t = [a,b,c]
Traceback (most recent call last):
  File "<pyshell#73>", line 1, in <module>
    t = [a,b,c]
NameError: name 'a' is not defined
a, b, c, d, e = "FishC"
a
'F'
b
'i'
c
's'
d
'h'
e
'C'
x, y, z = [1, 2, 3]
x
1
y
2

z
3
a, b, c = "FishC"
Traceback (most recent call last):
  File "<pyshell#85>", line 1, in <module>
    a, b, c = "FishC"
ValueError: too many values to unpack (expected 3)
a, b, *c = "FishC"
a
'F'
b
'i'
c
['s', 'h', 'C']
x, y = 10, 20
x
10
y
20
_ = (10, 20)
_
(10, 20)
x, y = _
x
10
y
20
s = [1,2,3]
t = [4,5,6]
w = (s,t)
w
([1, 2, 3], [4, 5, 6])
w[0][0] = 0
w
([0, 2, 3], [4, 5, 6])

课后作业

0. 既然元组和字符串都是不可改变的对象,那么两者有何区别?
  元组可以存放多种类型的数据,而字符串只能够存放字符类型

1. 请写出仅有一个元素 5 的元组。
  5, 或者 (5,)

2. 请问下面代码得到的结果是?

>>> t = (3, 1, 4, 9, 8)
>>> t.sort()

  报错。元组是不可变的,所有它没有 sort() 方法(该方法在列表中是对列表进行原地排序)。

3. 请问下面代码得到的结果是?

>>> t = (3, 1, 4, 9, 8)
>>> t[2:4]

  (4, 9) 。 有些鱼油可能会很纳闷 “不是说不能修改元组的内容吗?”,但是,这里并没有修改它的内容,t 的内容仍然是 (3, 1, 4, 9, 8),t[2:4] 是通过切片语法生成了一个新的元组 (4, 9)。

4. 请问我们可以修改的是 “元组中的列表” 还是 “列表中的元组” ?
  可以修改的是 “元组中的列表” 。

5. 用一个专业的名词描述以下代码的行为?
  解包。将赋值号右边变量的多个值拆分给(赋值号)左边各个变量的行为,我们称之为解包。

6. 请问下面代码为什么会出错?如何解决呢?

>>> a, b, c = "FishC"
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    a, b, c = "FishC"
ValueError: too many values to unpack (expected 3)

  出错的原因是赋值号左侧的变量名数量,跟右侧序列的元素数量不一致。
  解决方案一,使得赋值号左右两侧的数量一致:

>>> a, b, c, d, e = "FishC"

  解决方案二,将剩余的多个对象分配到一个变量中(使用星号):

>>> a, *b, c = "FishC"
>>> a
'F'
>>> b
['i', 's', 'h']
>>> c
'C'

7. 如果我们非要修改一个元组,你觉得应该怎么做?
  创建一个新的元组,并赋值给同个变量。这是一种“狸猫换太子”的做法(看着是成功地修改了元组,但其实是在一个新的地方创建了一个新的元组并赋值给同个变量)。

>>> t = (1, 2, 3, 4, 5)
>>> t = (1, 1) + t[1:3] + (5,)
>>> t
(1, 1, 2, 3, 5)

8. 有一天,居委会的大妈找上门,让你帮她用 Python 创建一个对象,用于登记接种新冠疫苗的情况。登记内容包含(姓名、生日、接种日期),你应该怎么做?
  比较恰当的方法是使用列表来存储,然后由于每个人登记的内容是不需要改变的,所以可以用元组打包。

>>> checked = [("口口布", 19910220, 20210601), ("弓长飞", 19630509, 20210623), ("刘Baby", 19990520, 20210520)]

  这样添加一个新的登记就只需要 checked.append(("关习习", 20000220, 20210806))

9. 如果我们想知道到底是创建列表的速度快,还是创建元组的速度快,应该如何做呢?
  咱们可以使用一个叫做timeit模块来实现,自学文档 -> timeit -- 测量代码片段的执行时间

import timeit

sum1 = 0
sum2 = 0
speed1 = 0
speed2 = 0

test1 = timeit.repeat('num = [1, 2, 3, 4]', repeat = 100)
test2 = timeit.repeat('num = (1, 2, 3, 4)', repeat = 100)

for each in test1:
    sum1 = sum1 + each
speed1 = sum1 / 100

for each in test2:
    sum2 = sum2 + each
speed2 = sum2 / 100

print("创建列表的平均速度是:",speed1)
print("创建元组的平均速度是:",speed2)

或者

import timeit
    
t_speed = timeit.repeat('t = (1, 2, 3, 4, 5)', repeat=100)
l_speed = timeit.repeat('l = [1, 2, 3, 4, 5]', repeat=100)
    
# 统计生成元组的平均速度
t_sum = 0
for each in t_speed:
    t_sum = t_sum + each
    
t_average = t_sum / len(t_speed)
    
# 统计生成列表的平均速度
l_sum = 0
for each in l_speed:
    l_sum = l_sum + each

l_average = l_sum / len(l_speed)
    
print("创建元组的平均速度是:", t_average,sep='')
print("创建列表的平均速度是:", l_average,sep='')  

其实再往后几节,大家学习到 sum() 函数之后,代码就能简单多了……

import timeit
    
t_speed = timeit.repeat('t = (1, 2, 3, 4, 5)', repeat=100)
l_speed = timeit.repeat('l = [1, 2, 3, 4, 5]', repeat=100)
    
t_average = sum(t_speed) / len(t_speed)
l_average = sum(l_speed) / len(l_speed)
    
print("创建元组的平均速度是:", t_average)
print("创建列表的平均速度是:", l_average)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值