Python基础

一、编码

  Python从最初的支持ASCII编码到Unicode编码一直到现在的UTF-8编码。

  编码区别

    ASCII编码仅仅是考虑的英文和数字,编码长度一个字节。

    Unicode编码综合考虑的多种语言方式,编码长度一般为俩字节,但是却造成一定的空间浪费。例如英文用ASCII编码需要一个字节,而用Unicode编码需要俩字节,所以就造就了一定空间的浪费。但是也在一定程度上解决了乱码问题,统一的编码方式。(在Unicode出现早期,汉字用gb2312编码)

    UTF-8编码是对Unicode的进一步优化,采用动态分配存储空间,例如英文用一个字节编码,汉字用俩字节编码。UTF-8可以理解为包含了ASCIIUnicode的优点的编码方式。

二、格式化

  在Python中,字符串格式化和C语言是一样的方式.

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

  %运算符就是用来格式化数据用的,%s代表格式化字符串,%d代表是格式化数字。有几个%?,后边对应几个字符串就行了。记得多个字符串格式化,后边字符串要顺序上对应上同时用括号包裹。如果仅仅只有一个字符串括号可以省略。

  常见占位符如下:

%d    整数
%f    浮点数
%s    字符串
%x    十六进制整数

  格式化整数和浮点数还可以指定是否补充0或者是小数点后边保留几位。

>>> '%2d-%02d' % (3, 1)
' 3-01'
>>> '%.2f' % 3.1415926
'3.14'

  如果有时候你不知道格式化的数据的真实数据类型,那么%S可以转换任何数据为字符串类型。

>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'

  如何转译%为普通字符(正常字符串中这直接使用%作为字符串没任何问题,但是在需要有格式化的字符串中如果包含了一个%你需要怎么做?)

>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'

三、集合

  List

    Python内置了一种数据类型列表:List,List是一种有序集合,可以完成添加和删除的功能。  

>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']

    读取方式如下

>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'

    PythonList的拥有反向读取数据的方式,例如-1读取则是从后向前数的第一个数据,也就是最后一个数据。

如果要取最后一个元素,除了计算索引位置外,还可以用-1
>>> classmates[-1] 'Tracy'

    List的添加删除和插入及修改值。

>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']

>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']

>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']

    批注:

      List中数据类型可以是任意类型,这个不同于Java中,在javaList要求在创建集合的时候声明这个集合存储的数据类型,一旦确认则只能存储这一种类型。

    PythonList中存储List

>>> p = ['asp', 'php']
>>> s = ['python', 'java', p, 'scheme']

    这里如果要获取对应的asp这个字符串,那么需要读取s[2][0],很显然整个List可以当做一个一维数组,二维数组,多维数组。

    读取列表长度方式如下

>>> L = []
>>> len(L)
0

  Tuple<元组>

    有序列表元组Tuple,类似于List的数据存储。不同点在于一点定义初始化之后其内部数据对象是不允许修改,所以很显然Tuple不具备appendinsert以及pop等操作。

    声明和初始化对于List使用[],Tuple声明方式()。  

>>> classmates = ('Michael', 'Bob', 'Tracy')

    Tuple功能决定其使用之前需要确定内容数据,因为一旦创建之后数据无法修改。<不允许修改的是Tuple指向的对象>

    可变的Tuple?????

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

    不允许修改的仅仅是Tuple引用的对象,对于Tuple而言直接引用的是数组['A','B']对象,只要保证该数组对象不变<地址不变>,那么对于数组内部的东西他是不关注的,所以可以直接修改器数组内部数据,但是对于'a','b'而言是不允许被修改的。

  dict<字典缩写,其实就是key-value,对于key的实现通过hash算法>

    可以理解为字典<其实做过java的可以当做是map来理解它>,声明方式{key-value},不同在于内部值是以key-value的形式

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

    对于dict的添加,删除,遍历

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
#添加
>>> d['ArMn'] = '25'
>>> d['ArMn']
25
#删除
>>>d.pop('ArMn')
>>>d
{'Michael': 95, 'Bob': 75, 'Tracy': 85}
#遍历print前边需要加空格 否则会报错, IndentationError: expected an indented block
>>> D = {'x':1, 'y':2, 'z':3} 
>>> for key in D:  
    print key, '=>', D[key]   

   批注

    dict中的顺序和放入的先后顺序无关。

    Listdict比较:

      List存储占用空间少,但是随着数据的增加查询速度回越来越慢。

      dict存储占用空间大,但是随着数据的增加查询速度依然很快。

  set<集合>

    集合中的元素不允许重复<等同于java中的HashSet>,set可以看做是dict中的key的集合体,不允许有重复,并且不可变<不能是一个变量,而应该是一个固定值>,声明方式和元组的方式一样,使用括号()。

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

    上述代表在set中声明一个list对象,当然也可以添加其他的数据类型例如字符串

>>> st = set('a')
>>> st
{'a'}
>>> st = set(['a','b'])
>>> st
{'a', 'b'}

    添加数据给set,从真实的执行效果来看,其实内部是解析变量list然后addset

    对于元组而言也是一样,看如下执行结果

>>> tupleSet = set(('a','b'))
>>> tupleSet
{'a', 'b'}

    集合转换

      set转换为tuple,如下

>>> tup = (1,2,3,4)
>>> tupSet = set(tup)
>>> tupSet
{1, 2, 3, 4}
>>> tupCopy = tuple(tupSet)
>>> tupCopy
(1, 2, 3, 4)
>>>

      set转换list,如下

>>> slist = ['a','b','c']
>>> sSet = set(slist)
>>> sSet
{'c', 'a', 'b'}
>>> slistCopy = list(sSet)
>>> slistCopy
['c', 'a', 'b']

       看到类似如上间转化再回头看下set的初始化传入参数有ListTuple是不是有点别的想法<ListsetTupleset转换!!!>