Python学习笔记-变量与数据类型

Python学习笔记---变量与数据类型

Python中的变量与内置数据类型


       本文只是我在慕课网学习《Python入门》这门课程时,摘录、整理的一些对自己比较重要的语法与提示。九成以上的内容以及所有代码示例,均摘抄自慕课网。由于我本人有一定C/C++语言基础,而本文主要供我自己复习使用,所以我偏向于摘录一些Python和C/C++之间的差异之处,可能造成本文语义上不一定连贯,建议有学习需求的读者直接前往慕课网学习该课程(链接:http://www.imooc.com/learn/177)或是查看该门课程授课教师廖雪峰先生官方网站所给出的Python教程(链接:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000)


1.变量

       变量名构成:英文字母、阿拉伯数字、下划线,其中阿拉伯数字不能作为开头【和C一样嘛!】

       同一个变量可以反复赋值,而且可以是不同类型的变量,这种变量本身类型不固定的语言称之为动态语言【与之对应的是静态语言(C、Java等),在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错】。例如:

a = 123       # a是整数
print a
a = 'imooc'   # a变为字符串
print a


2.字符串类型

       字符串可以用单引号或者双引号括起来表示。字符串本身包含单引号,则可用双引号括起来表示(例1);字符串本身包含双引号,则可用单引号括起来表示(例2);字符串本身同时包含单引号与双引号,则必须转义(例3)。Python字符串用\进行转义,转义字符 \ 不计入字符串的内容中。

       在字符串前面加r前缀,可以标志一个raw字符串(例4)。raw字符串里面的字符无需转义,适用于转义字符过多,且本身不含单双引号的情况。

       用三个单引号可以把多行字符串括起来(例5)。

       在字符串前面加u前缀,可以标志一个Unicode字符串(例6)。Unicode字符串内部使用unicode编码,适用于处理中文等非ASCII字符。 Unicode字符串除了多了一个 u 之外,与普通字符串没啥区别,转义字符和多行表示法仍然有效(例7)。

        raw字符串、多行字符串、Unicode字符串是不同维度的概念,可以交叉使用(例8)。

# 例1.字符串本身包含单引号,可用双引号括起来表示
print "I'm OK"

# 例2.字符串本身包含双引号,可用单引号括起来表示
print 'Learn "Python" in imooc'

# 例3.字符串本身同时包含单双引号,必须用反斜杆转义
print 'Bob said \"I\'m OK\".'

# 例4.用r前缀标志一个raw字符串
print r'\(~_~)/ \(~_~)/'

# 例5.用三个单引号括起一个多行字符串
print '''Python is created by Guido.
It is free and easy to learn.'''
# 等效于
print 'Python is created by Guido.\nIt is free and easy to learn.'

# 例6.用u前缀标志一个Unicode字符串
print u'中文'

# 例7.转义、Unicode、多行同时应用
print u'中文\n日文\n韩文'

# 例8.raw、Unicode、多行同时应用
print ur'''Python的Unicode字符串支持"中文",
"日文",
"韩文"等多种语言'''

      如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题.可以在第一行添加注释:

# -*- coding: utf-8 -*-

目的是告诉Python解释器,用UTF-8编码读取源代码.然后用编辑器另存为... 并选择UTF-8格式保存。


3.布尔类型

       在Python中,布尔类型只有TrueFalse两种值,并把0、空字符串''和None看成 False,其他数值和非空字符串都看成 True。

       布尔类型还可以与其他数据类型做 and、or和not运算,但运算的结果可能不是布尔类型(例1)。例如:

# 例1 布尔类型与其他数据类型做逻辑运算,结果不为布尔类型
a = True
print a and 'a=T' or 'a=F'
# 打印结果是:a=T
这是因为,Python中的 and 和 or 运算有一条重要法则---短路计算

  • 在计算 a and b 时,如果 a 是 False,则根据与运算法则,整个结果必定为 False,因此返回 a;如果 a 是 True,则整个计算结果必定取决与 b,因此返回 b。
  • 在计算 a or b 时,如果 a 是 True,则根据或运算法则,整个结果必定为 True,因此返回 a;如果 a 是 False,则整个计算结果必定取决于 b,因此返回 b。

因此,在上述例子中,True and 'a=T' 计算结果是 'a=T',继续计算 'a=T' or 'a=F' 计算结果还是 'a=T'。【短路计算并不稀奇,C++其实也有,不同的只是,C++会先把非布尔类型转成布尔类型再进行运算,所以逻辑运算结果一定是布尔类型】


4.列表类型

4.1 list

       list,是一种有序的列表。和其他语言不同,在Python中,它是一种内置的数据类型。list是数学意义上的有序集合。

       构造list非常简单,直接用方括号 [ ] 把list的所有元素都括起来,就是一个list对象(例1);通常,我们会把list赋值给一个变量,这样,就可以通过变量来引用list;一个元素也没有的list,就是空list(例2)。【挺像C++ STL中的vector】

       由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种不同类型的数据(例3)。【这点和vector差异较大】

       可以通过索引来获取list中的指定元素。需要特别注意的是,索引从 0 开始,也就是说,第一个元素的索引是0,第二个元素的索引是1,以此类推(例4)。使用索引时,千万注意不要越界。【一定程度上,索引可以类比为C语言中的数组下标】

       比较稀奇的是,在Python中还可以通过索引来倒序访问list中的指定元素!索引使用一个 -号来表示自己是倒序的,例如,我们可以用 -1 这个索引来表示最后一个元素,类似的,倒数第二用 -2 表示,倒数第三用 -3 表示…以此类推(例4)。

       list 有两种方法可以添加新元素,其中:append()方法总是把新的元素添加到 list 的尾部;insert()方法接受两个参数,第一个参数是索引号num,第二个参数是待添加的新元素。使用insert()方法插入新元素后,list里面原先索引号为num及num以后的元素,依次后移一位。(例5)

       list 使用pop()方法删除指定元素,该方法可以不要参数,则默认将list尾部的元素删掉;也可以接收一个索引号num,则将list索引为0的元素删掉。每次调用pop()方法后会自动打印出被删除的元素。(例6)

       替换list 中指定元素,直接使用索引(正序逆序皆可)访问并赋新值即可。(例7)

# 例1 用[]把元素括起来就是list
L = ['Michael', 'Bob', 'Tracy']

# 例2 元素数据类型不完全相同的list
mix_list = ['Adam', 95.5, 'Lisa', 85, 'Bart', 59]

# 例3 空list
empty_list = []

# 例4 用索引获取list中的指定元素
print L[0]   # 用正序索引访问第一个元素
print L[-3]  # 用逆序索引访问第一个元素(倒数第3个元素)

# 例5 添加新元素
L.append('Tom')      # 将Tom添加到例1所示list的尾部
print L  # 显示:['Michael', 'Bob', 'Tracy', 'Tom']
L.insert(0, 'Alice') # 将Alice添加到例1所示list中索引为0的位置
print L  # 显示:['Alice', 'Michael', 'Bob', 'Tracy', 'Tom']

# 例6 删除元素
L.pop()      # 无参,默认将list尾部的元素删掉,显示:'Tom'
print L  # 显示:['Alice', 'Michael', 'Bob', 'Tracy']
L.pop(0)     # 参数为索引,将list索引为0的元素删掉,显示:'Alice'
print L  # 显示:['Michael', 'Bob', 'Tracy']

# 例6 替换元素
L[0]  = 'Alice'
L[-1] = 'Tom'
print L

4.2 tuple

       tuple也是一种有序列表类型,一般译为“元组”。和list不同的是,tuple一旦创建完毕,就不能修改了。所以,tuple就没有append、insert、pop等方法,也不能通过索引重新赋值。

       不同于list,创建tuple需要使用圆括号 ( )将所有元素括起来,而非方括号 [ ] (例1)。因为圆括号同时可以表示运算时的优先级,所以创建单元素tuple时必须在元素后面加一个逗号(例2)!

       除以上几点以外,tuple的使用和list是类似的。(例3-5)

       tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b';如果指向一个list,就不能改成指向其他对象。但是,指向的这个list本身是可变的(例3)!所以,要创建一个内容也不变的tuple就必须保证tuple的每一个元素本身也不能变。

# 例1 用()把元素括起来就是tuple
T = ('Michael', 'Bob', 'Tracy')

# 例2 创建单元素tuple
single_tuple = ('Bob',)
single_tuple = (10,)

# 例3 元素数据类型不完全相同的tuple
mix_tuple = ('Adam', 95.5, 'Lisa', 85, 'Bart', 59)

# 例4 空tuple
empty_tuple = ()

# 例5 用索引获取tuple中的指定元素
print T[0]   # 用正序索引访问第一个元素
print T[-3]  # 用逆序索引访问第一个元素(倒数第3个元素)

# 例6 "可变的"tuple
T = ('a', 'b', ['A', 'B'])
L = T[2]
L[0] = 'X'
L[1] = 'Y'
print T    #显示:('a', 'b', ['X', 'Y'])


5.待续