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
    
  • 相关阅读:
    Linux下oracle数据库操作
    springcloud学习一
    nginx反向代理实现前后端分离
    GIT版本控制(码云)
    VUE环境搭建
    线程池的使用
    neo4j图形数据库实战
    idea 下tomcat字符集问题
    webservice客户端生成方式
    Spring声明式事务不回滚的问题
  • 原文地址:https://www.cnblogs.com/wanbin/p/9514698.html
Copyright © 2011-2022 走看看