zoukankan      html  css  js  c++  java
  • 零基础入门学习Python(13)--元组:戴上了枷锁的列表

    前言

    这节课我们讨论主题是元祖:我们有个小标题戴上了枷锁的列表
    我们都知道早在300多年前,孟德斯鸠在变法的时候说过,一切拥有权力的人都容易被滥用权力,这是万古不变的一条经验。但是呢,凡是拥有大权利的人,都想用自身的实践来证明,孟德斯鸠只是一个会说屁话的家伙。但是呢,他们后来好像都失败了哈。
    这不,我们的列表同志,自从打了激素后,一路过关斩将,出任ceo,迎娶白富美,可谓顺风顺水,职场情场双丰收啊。可是呢,这天它又打起了我们美丽又可爱的苍井空老师的主意,居然想把列表里的人妻,替换成苍井空,这可会闹出大问题了。
    对不对,活生生的把我们的苍老师给抢走,金屋藏娇啊,那我们这种屌丝可不同意了,有的说苍井空是大家的,绝不能让你霸占了。
    有的甚至气急败坏的说,苍老师还是处女呢,怎么能纳入人妻的范畴,可恶!
    于是呢,轰轰烈烈的抗议就此拉起,可谓得屌丝者得天下,逆屌丝者必遭殃。
    列表同志真是千古功名一聚尘呐。自从列表同志被抓了后,Python的作者感觉有点大事不妙了。可能列表给的权利太大了。
    我们应该做一些限制,所以呢,Python的作者就Python社区的小伙伴们,推出了我们今天的主题:元组(tuple)
    如果你定义了一个元组,那么里面的任何一个元素无法改变了。所以你尝试把元组里的人妻偷偷换成苍井空,sorry,no way!
    好吧,我们认真讲课了,先忘掉人妻和苍井空吧。

    知识点

    由于和列表是近亲关系,所以元组和列表在实际使用上是非常相似的。
    我们这节课主要通过讨论元组合列表到底有什么不同来学习元组,酱紫大家就不会觉得老是重复一样的内容。
    我们主要从以下几个点来讨论学习:
    首先我们强调一下,元组和列表最大的区别就是列表可以随意修改里面的元素,而元组就不能。

    创建和访问一个元祖

    创建列表时,是用的中括号[],而创建元组时,大部分用的是小括号()

    >>> tuple1 = (1,2,3,4,5,6,7,8)
    >>> tuple1
    (1, 2, 3, 4, 5, 6, 7, 8)
    >>> tuple1[1]
    2
    >>> tuple1[5:]
    (6, 7, 8)
    >>> tupe1[:5]
    Traceback (most recent call last):
      File "<pyshell#4>", line 1, in <module>
        tupe1[:5]
    NameError: name 'tupe1' is not defined
    >>> tuple1[:5]
    (1, 2, 3, 4, 5)
    >>> tuple2 = tuple1[:]
    >>> tuple2
    (1, 2, 3, 4, 5, 6, 7, 8)
    >>> tuple1[1] = 3
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        tuple1[1] = 3
    TypeError: 'tuple' object does not support item assignment
    >>> 
    >>> temp = (1)
    >>> temp
    1
    >>> type(temp)
    <class 'int'>
    >>> 
    >>> temp2 = 2,3,4
    >>> type(temp2)
    <class 'tuple'>
    >>> 
    >>> 
    >>> 
    >>> temp = []
    >>> type(temp)
    <class 'list'>
    >>> 
    >>> 
    >>> 
    >>> temp = ()
    >>> type(temp)
    <class 'tuple'>
    >>> 
    >>> 
    >>> 
    >>> 
    >>> temp = (1,)
    >>> temp
    (1,)
    >>> type(temp)
    <class 'tuple'>
    >>> 
    >>> 
    >>> temp = 1,
    >>> type(temp)
    <class 'tuple'>
    >>> temp
    (1,)
    >>> 
    >>> 
    >>> 8 * (8)
    64
    >>> 8 * (8,)
    (8, 8, 8, 8, 8, 8, 8, 8)

    更新和删除一个元组

    >>> temp = ('小甲鱼','黑夜','迷途','小布丁')
    >>> 
    >>> temp = temp[:2] + ('怡静',) + temp[2:]
    >>> temp
    ('小甲鱼', '黑夜', '怡静', '迷途', '小布丁')
    >>> temp = temp[:2] + temp[3:]
    >>> temp
    ('小甲鱼', '黑夜', '迷途', '小布丁')
    >>> del temp
    >>> temp
    Traceback (most recent call last):
      File "<pyshell#54>", line 1, in <module>
        temp
    NameError: name 'temp' is not defined

    元组相关的一些操作符

    • 拼接操作符 +
    • 重复操作符*
    • 关系操作符>,<,==
    • 成员操作符 in,not in
    • 逻辑操作符 and, or

    课后习题

    • 请用一句话描述什么是列表?再用一句话描述什么是元组?
      列表:一个大仓库,你可以随时往里边添加或删除任何东西。
      元组:封闭的列表,一旦定义,就不可改变(不能添加,删除或修改)
    • 什么情况下你需要使用元组而不是列表?
      当我们希望内容不被轻易改写时候,使用元组。
      需要频繁修改数据,使用列表
    • 请将下图左边列表的内置方法与右边的注释连线,并圈出元组可以使用的方法
      这里写图片描述

    • 创建一个元组,什么情况下逗号与小括号必须同时存在,缺一不可?

    在拼接只有一个元素的元组时候
    >>> temp = (‘小甲鱼’, ‘黑夜’, ‘迷途’, ‘小布丁’)
    # 如果我想在“黑夜”和“迷途”之间插入“怡静”,我们应该:
    >>> temp = temp[:2] + (‘怡静’,) + temp[2:]
    • x,y.z = 1,2,3 请问x,y,z是元组吗?
    所有的多对象,逗号分隔,没有明确用符号定义的这些集合默认类型都是元组
    >>> x,y,z = 1,2,3
    >>> type(x)
    <class 'int'>
    >>> type(x,y,z)
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        type(x,y,z)
    TypeError: type.__new__() argument 1 must be str, not int
    >>> h = x,y,z
    >>> type(h)
    <class 'tuple'>
    >>> h
    (1, 2, 3)
    • 请写出以下情景中应该使用列表还是元组来保存数据:

      1)游戏中角色的属性: 列表
      2)你的身份证信息: 元组
      3)论坛的会员: 列表
      4)团队合作开发程序,传递给一个你并不了解具体实现的函数的参数: 元组
      5)航天火箭各个组件的具体配置参数: 元组
      6)NASA系统中记录已经发现的行星数据:列表

    • 上节课我们通过课后作业的形式学习到了“列表推导式”,那请问如果把中括号改为小括号,会不会得到“元组推导式”呢?

    >>> typle1 = (x**2 for x in range(10))
    >>> typle1
    <generator object <genexpr> at 0x00000065900D1200>
    >>> type(typle1)
    <class 'generator'>
    
    Python3 没有“元组推导式”,那为什么没有报错?因为你误打误撞得到了一个生成器:
    
    尝试访问生成器:
    
    注意:Python3开始next()方法改成位__next__()哦~
    
    >>> typle1.__next__()
    0
    >>> typle1.__next__()
    1
    >>> typle1.__next__()
    4
    >>> typle1.__next__()
    9
    >>> typle1.__next__()
    16
    >>> typle1.__next__()
    25
    >>> typle1.__next__()
    36
    >>> typle1.__next__()
    49
    >>> typle1.__next__()
    64
    >>> typle1.__next__()
    81
    >>> typle1.__next__()
    Traceback (most recent call last):
      File "<pyshell#21>", line 1, in <module>
        typle1.__next__()
    StopIteration
    
  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/wanbin/p/9514698.html
Copyright © 2011-2022 走看看