变         量

3.1 引用变量----使用数据名称

       给名称赋值:名称一般叫做变量,表明它们引用的数据可以变化,而名称保持不变。您会看到变量也叫做名称(name),这是Python的叫法。

>>> first_string = "This is a string"
        >>> second_string = "This is another string"
        >>> first_number = 4
        >>> second_number = 5
        >>> print ("The first variables are %s,%s,%d,%d" % (first_string , second_string , first_number , second_number))
        The first variables are This is a string,This is another string,4,5

        示例说明:

         可以用等号(=)将一个值(字符串或者整型数)与名称关联。所用的名称并不与所指的数据直接相关(如果将一个数据命名为“number”,并不意味着它实际保存了一个数值)

>>> first_string = 245
       >>> second_number = "This isn't a number"
       >>> print(first_string)
       245
      >>> print(second_number)
      This isn't a number

      注意:仅希望将一个变量的值打印出来时并不需要使用引号。如果在print()函数中将一个变量用引号括起来,函数会打印出这个变量的名称,而不是它的内容,因为程序把它看做一个字符串而不是一个变量。

  3.1.1 使用名称修改数据

>>> first_string = "a pen"
        >>> first_string = first_string + " b pen"
        >>> print(first_string)
        a pen b pen       >>> first_number = 0
        >>> first_number = first_number + 1
        >>> print(first_number)
        1

       无论何时,在等号右端使用已命名的值时,即使同样的名称在左端,Python仍将这些名称看做它们引用的值。先对右端名称求值并计算结果,然后将结果赋值给左边的名称。

  3.1.2 复制数据

>>> first_number = 1
        >>> second_number = first_number
        >>> print(second_number)
       1
       >>> first_number = first_number + 1
       >>> print(first_number)
       2
       >>> print(second_number)
       1

      给数据起名称仅仅是个名称,是表示要访问的数据的一种方法,可以用多个名称引用一个数据。当再次使用“=”时,就给名称赋值一个已创建的新值,而另一个名称仍然指向原来的值

3.1.3禁用名称和规则

    Python 保留词,不可以用作数据的名称:    and,as,assert,break,class,continue,def,elif,else,except,exec,False,finally,for,from,global,if,import,in,is,lambda,not,None,or,pass,print,raise,return,try,True,while,with,yield

    另外,数据名称不能以数值或者多数非字母的字符开头(例如逗号、加减号、斜杠等),但下划线例外,是合法的。

3.2 内置类型

      除了字符串和数值外,Python还提供了另外的4种基本类型:元组、列表、集合、字典。4种类型有很多共同点,都容许在一个名称下面组织多条数据。这些组织在一起的数据通过圆括号()、方括号[]、花括号{}表示。

   3.2.1 元组-----不可更改的数据序列

          元组是Python的基本类型,元组是值的序列,其中每个值都可以被单独访问,在创建时就可以识别出元组,因为它们被圆括号包围: 

>>> filler = ("string","filled", "by a", "tuple")
            >>> print(filler)
            ('string', 'filled', 'by a', 'tuple')

           元组包含对数据的引用,例如对字符串和数值的引用。虽然它们引用数据,但是仍然可以向其他类型的数据一样为它们命名。可以通过print()函数中调用元组,打印出其中的数据。元组的处理方式就好像输入一个序列来满足给定的格式规范。

>>> a = ("first" , "second" , "third")
            >>> print("This is %s" % a[1])
            This is second
           >>> print("This is %s" % a[0])
           This is first
            >>> print("This is %s" % a[2])
            This is third             >>> print("%d" % len(a))
             3            >>> print(a[len(a) -1])
             third

            每个元素通过该语言的解除引用特性直接访问,通过在元组的名称后放置方括号并且从零起,因此,元组的第一个元素位置为0,第二个为1,以此类推到最后一个元素。

            元组想知道包含元素的数目,可以使用内置函数len得到。返回的数目(此处为3),因此需要牢记len函数从1开始计数。当访问元组时,由于元组从0开始,所以必须在len返回的数小1的位置停止访问。

            通过一个元组访问另外一个元组

>>> a = ("first" , "second" , "third")
        >>> b = (a , "b's second element")
        >>> print("%s" %b[1])
        b's second element
        >>> print("%s" %b[0][0])
        first
        >>> print("%s" %b[0][1])
        second
        >>> print("%s" %b[0][2])
        third

      创建元组a和b  ,这种情形下,代码的工作原理仿佛是先遵循元组b的第一个元素的引用,之后遵循第二层元组中的每个值的引用(第二层的元组最初来源于元组a)。若创建一个元素的元组,必须在该元素之后加一个逗号(,)负责就会创建一个字符串。

      报错:TypeError   该类型并不支持此操作

                IndexError   引用元组中并不存在的元素

3.2.2 列表-----可以更改的数据列表

          列表如同元组,是包含从0开始引用的元素的序列。列表用方括号创建:

 

>>> breakfast = ["coffee" , "tea" , "toast" , "egg"]
          >>> count = 0
         >>> print("Today's breakfast is %s" % breakfast[count])
         Today's breakfast is coffee
         >>> count = 3
         >>> print("Today's breakfast is %s" % breakfast[count])
         Today's breakfast is egg

     使用列表和元组主要区别:元组在创建后不可以修改,列表在任何时候都可以被修改

>>> breakfast[count] = "sausages"
       >>> print("Today's breakfast is %s" % breakfast[count])
       Today's breakfast is sausages

       不仅可以修改已经存在的元素,还可以通过列表类型内置方法append向列表末端添加元素,利用append方法每次只能向列表末端添加一个元素:

>>> breakfast.append("waffle")
     >>> count = 4
      >>> print("Today's breakfast is %s" % breakfast[count])
      Today's breakfast is waffle

      如果想一次性向列表末端添加多个元素,使用extend方法,添加的列表并不是整体作为原有列表的一个元素,相反,其中的每个元素将被复制到原来的列表中。

>>> breakfast.extend(["juice" , "decaf"])
       >>> print(breakfast)
      ['coffee', 'tea', 'toast', 'egg','waffle', 'juice', 'decaf']

     列表的长度也通过len函数确认,跟元组一样,长豆从1开始,而列表的第一个元素位置从0开始。这一点非常重要

     报错:IndexError:list index out of range 出错消息与元组略有不同,指出列表索引超出范围,不是元组超出范围。

3.2.3 字典-----以名称索引的分组数据

        字典类似于列表和元组。包含一组数据的另外一种容器。然而,元组和列表以数字顺序索引,字典却用选择的名称索引。名称可以是字母、数值、字符串或者符号。字典用花括号创建。

>>> menu_specials = {"breakfast" : "sausage and eggs" , "lunch" : "split pea soup and garlic bread" , "dinner" : "2 hot dogs          and onion rings"}
       >>> print(menu_specials)
       {'breakfast': 'sausage and eggs', 'lunch': 'split pea soup and garlic bread', 'dinner': '2 hot dogs and onion rings'}
       >>> print("%s" % menu_specials["breakfast"])
       sausage and eggs
       >>> print("%s" % menu_specials["lunch"])
       split pea soup and garlic bread
       >>> print("%s" % menu_specials["dinner"])
       2 hot dogs and onion rings

      使用字典时,索引和值都有特殊的名称。字典中索引的名称叫做,对应的值叫做。创建一个完全指定的字典,必须在花括号之间指定每个键以及和它对应的值,并以冒号分隔它们。打印某个字典所有的键和值,只需将该字典的名称作为print()函数的参数,也可以将键放在方括号中,如果键是字符串,需要将键放在引号中。如果键是数值,仅使用数值就可以了。

       如果键是一个字符串,但是在方括号中意外地没有将键放在引号中,Python就试图将它看做一个名称,需要解除对它的引用来找到键。大部分情况下,将引起NameError异常,除非凑巧找到一个与该字符串相同的名称,又可能得到一个IndexError错误。

>>> hungry = menu_specials.keys()
       >>> print(list(hungry))
       ['breakfast', 'lunch', 'dinner']
       >>> starving = menu_specials.values()
       >>> print(list(starving))
       ['sausage and eggs', 'split pea soup and garlic bread', '2 hot dogs and onion rings']

      keys方法要求字典以视图的方式返回所有键,以便用户查找所需的键,values方法也将以视图的形式返回所有的值。

>>> menu = {"breakfast" : "spam" , "lunch" : "spam" , "dinner" : "spam with a side of spam"}
       >>> print(menu)
        {'breakfast': 'spam', 'lunch': 'spam', 'dinner': 'spam with a side of spam'}
        >>> menu.get("lunch")
        'spam'
        >>> menu.get("breakfast")
        'spam'      >>> menu2 = {"breakfast" : "spam" , "breakfast" : "ham" , "dinner" : "spam with a side of spam"}
       >>> menu2.get("breakfast")
        'ham'

      字典的工作原理是每个键都是不同的(不可以又完全相同的俩个键),但是可以有多个重复的值,menu2输入第二个“breakfst”的键时,Python替换了相同名称的第一个键的值。

3.2.4 像列表一样处理字符串

>>> last_names = ["Douglass" , "Jefferson" , "Williams" , "Frank" , "Thomas"]
          >>> print("%s" % last_names[0])
          Douglass
         >>> print("%s" % last_names[0][0])
         D
         >>> print("%s" % last_names[1])
         Jefferson
         >>> print("%s" % last_names[1][0])
         J       >>> by_letter = {}
        >>> by_letter[last_names[0][0]] = last_names[0]
        >>> by_letter[last_names[1][0]] = last_names[1]
        >>> by_letter[last_names[2][0]] = last_names[2]
        >>> by_letter[last_names[3][0]] = last_names[3]
        >>> by_letter[last_names[4][0]] = last_names[4]
        >>> print(by_letter)
         {'D': 'Douglass', 'J': 'Jefferson', 'W': 'Williams', 'F': 'Frank', 'T': 'Thomas'}

      可以根据字符串的字母顺序将字典中的元素以姓的首字母分组,并以此对名字归档。

       通过字符串的分片功能,字典by_letter 仅包含了所有姓的首字母。因此,by_letter根据每个姓的首字母索引的字典。

3.2.5 特殊类型

          Python包含几个特殊类型,None、True和False都是特殊的内置值,可以在不同的时刻发挥作用。

         None比较特殊,因为仅有一个None。无论使用多少次,它都是一个名称,除了它本身没有任何其他对象与之匹配。如果函数没有可返回的值,即函数没有可以响应的动作时,返回None。

       True和False是数值0和1的特殊表示,Python通过显式地命名这些值,使得区分这些值变得更容易。

>>> True
        True
       >>> False
         False
       >>> True == 1
       True
      >>> True == 0
       False
      >>> False == 0
      True
      >>> False == 1
     False
      >>> False > 0
     False
     >>> False < 1
     True

3.3 序列的其他共有属性

 3.3.1 引用最后一个元素

        经常需要知道一个序列最后一个元素的内容,有两种方法可以得到该消息。

        一、获取列表中元素的个数,之后用该数直接访问值:然而,这个方法分两步,作为程序员,重复在程序中输入这些代码非常耗时。

>>> last_names = ["Douglass" , "Jefferson" , "Williams" , "Frank" , "Thomas"]
 >>> len(last_names)      获取元素个数
 5
 >>> last_element = len(last_names) - 1
 >>> print ("%s" % last_names[last_element])
 Thomas

       二、可以通过使用数值-1访问一个序列的最后一个元素,使用数值-2访问倒数第二个元素,通过使用数-1到负的列表长度(在last_names列表中是-5),可以将列表的顺序颠倒过来。

>>> print("%s" % last_names[-1])
 Thomas
 >>> print("%s" % last_names[-3])
 Williams

3.3.2 序列的范围

    您可以获取序列的一部分,从中提取一个片段,创建一个单独使用的副本。创建这些分组的方法叫做分片。当一个列表或者元组中创建一个片段时,得到的片段与创建该片段的数据类型一致。

>>> slice_me = ("The" , "next" , "time" , "we" , "meet" , "drinks" , "are" , "on" , "me")
 >>> sliced_tuple = slice_me[5:9]
 >>> print(sliced_tuple)
 ('drinks', 'are', 'on', 'me')
 >>> slice_string = "The next time we meet  , drinks are on me"
 >>> slice_str = slice_string[5:9]
 >>> print(slice_str)
 ext

     在每种情形下,用冒号指定序列的一个片段指示Python创建一个新的序列,新序列恰好包含了片段中的元素。

3.3.3 通过附加序列增长列表

      假如希望两个列表连接到一起。使用append方法向列表中添加一个分层的序列。

>>> living_room = ("rug" , "table")
 >>> apartment = [1]
 >>> apartment.append(living_room)
 >>> apartment
 [1, ('rug', 'table')]

       如果想复制一个序列中所有元素,可以使用extend方法,而不是append方法,extend方法将给定序列中的每个元素插入到调用它的列表中。

>>> apartment = [1]
 >>> apartment.extend(living_room)
 >>> apartment
 [1, 'rug', 'table']

3.3.4 使用列表临时存储数据

      经常需要从其他来源获取数据,在处理完数据之后,不再需要将这些数据保存在列表中,例如:特定时间有效的信息。为了防止列表变得笨重,可以使用pop方法在处理完列表的一个数据之后,将其引用在列表中删除。当删除引用之后,它原来的在列表中的位置会填上后续元素,列表减少的元素个数等于已经弹出的元素个数。

      pop所操作的元素与使用方括号访问的列表元素具有相同的索引(记住,列表中第一个元素的位置是0

>>> today_temp = [23 , 32 , 33 , 31]
 >>> today_temp.append(29)
 >>> today_temp
 [23, 32, 33, 31, 29]
 >>> morning = today_temp.pop(0)
 >>> print("This mornings temp was %.02f" % morning)
 This mornings temp was 23.00
 >>> late_morning = today_temp.pop(0)
 >>> print("This mornings temp was %.02f" % late_morning)
 This mornings temp was 32.00
 >>> today_temp
 [33, 31, 29]
 >>> late2_morning = today_temp.pop(1)
 >>> print("This mornings temp was %.02f" % late2_morning)
 This mornings temp was 31.00
 >>> today_temp
 [33, 29]


        通过只使用pop填充字符串格式,可以避免使用中间名称,因为pop将返回列表中指定元素,可以像已经指定一个数值或者引用一个数值的名称那样使用该元素。如果没有告诉pop要删除列表的哪个元素,它将删除列表中的最后一个元素

3.3.5 处理集合

     Python中,集合与字典类似,只是它仅包含键,而没有与键相关联的值。本质上,集合是不包括重复数据的数据集,在从数据删除重复数据时,集合非常有用。

      有两种类型的集合:可变集合与不可变集合。两者不同之处,从字面意思就可理解,可变集合,可以增加、删除、改变元素,不可变集合的元素在它们初始设定之后就不能再被更改。

>>> alphabet = ['a' , 'b' , 'b' , 'c' , 'a' , 'd' , 'e' ]
 >>> print(alphabet)
 ['a', 'b', 'b', 'c', 'a', 'd', 'e']
 >>> alph2 = set(alphabet)
 >>> print(alph2)
 {'e', 'a', 'c', 'd', 'b'}

     该示例接受数据集alphabet作为输入,并将其转换为一个集合。因为集合不允许重复的值,多余的字符a和b被删除。之后alphabet被赋给alph2.并且打印以显示结果。