Python基础二

1、字符串

Python3的字符串使用Unicode,直接支持多语言。
  当str和bytes互相转换时,需要指定编码。最常用的编码是UTF-8.Python当然也支持其它编码方式,比如把Unicode编码成GB2312。格式化字符串的时候,可以用Python的交互式环境测试,方便快捷。

对于单个字符的编码,Python提供了ord()函数获取字符的整数形式表示,chr()函数把编码转换为对应的字符。比如,ord('A')输出65, chr(66) 输出 ‘B’。

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把 str 变为以字节为单位的 bytes 。Python对bytes类型的数据用带 b 前缀的单引号或双引号表示:x = b'ABC'
‘ABC'与b'ABC'的区别:前者是 str,后者虽然内容显示得和前者一样,但 bytes 的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:'ABC'.encode('ascii') 输出b'ABC'。'中文'.encode('utf-8') 输出  b'\xe4\xb8\xad\xe6\x96\x87'。  
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。在bytes中,无法显示为ASCII字符的字节,用 \x## 显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:例如:b'ABC'.decode('ASCII')  输出结果为 ABC。   b'\xe4\xe8\xad\xe6\x96\x87'.decode('utf-8') 输出结果为: ‘中文’。
如果bytes中包含无法解码的字节,decode()方法会报错;如果bytes中只有一小部分无效的字节,可以传入 errors='ignore'忽略错误的字节;要计算 str包含多少个字符,可以用len()函数。比如:len('ABC')输出结果为3, len('中文') 输出结果为 2。
2、字符串格式化得两种方式
(1)用%运算符来格式化字符串。在字符内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。常见的占位符有:
如果不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串;如果字符串里面的%是一个普通字符,这时候就需要转义,用%%来表示一个 %。
(2)format()
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}.......,不过这种方式写起来比%要麻烦得多。比如,'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)     输出结果为:'Hello, 小明, 成绩提升了 17.1%'

3、list和tuple
list和tuple是Python内置得有序集合,一个可变,一个不可变。list是一种有序集合,可以随时添加和删除其中得元素。

list是一个可变的有序表。添加元素:1、追加元素到末尾。比如,创建list   classmates=['Michael','Bob','Tracy']     classmates.append('Adam')   classmates得list为['Michael','Bob','Tracy','Adam']。2、添加元素到指定位置,比如索引号为 1 的位置:  classmates.insert(1,'Jack')    list变为['Michael','Jack','Bob','Tracy','Adam']

删除元素:1、删除末尾的元素,用pop()方法: 例如:classmates.pop()  2、删除指定位置的元素,用pop(i)方法,其中i是索引位置。例如:classmates.pop(1)    classmates list变为['Bob','Tracy']。
len()函数:获取list元素的个数。list索引是从0开始的。最后一个元素的索引是len(classmates)-1。
获取最后一个元素的方法:1.计算索引位置。2.用-1做索引,直接获取最后一个元素。例如,classmates[-1]输出结果为'Tracy'。
替换某个元素,可以直接赋值给对应的索引位置。比如,classmates[1]='Sarah' classmates变为['Michael','Sarah','Tracy']。
list里面的元素的数据类型可以不同。例如,L=['Apple',123,True]
list元素可以是另外一个List,比如,s=['python','java',['asp','php'],'scheme']          len(s)=4         其中s是一个list,s[2]又是一个list。将s拆开可以更方便理解,p=['asp','php'] , s=['python','java',p,'scheme'],要拿到'php'可以写成p[1]或者s[2]p[1],因此s可以看成一个二维数组。
如果一个list中一个元素也没有,就是一个空的list,它的长度为0.

tuple:一种有序列表,tuple和list非常类似,但是tuple一旦初始化就不能修改,比如,同样是列出同学的名字:
classmates=('Michael','Bob','Tracy')。现在,classmates这个puple不可变,所以没有 append(),insert()这样的方法。

不可变的tuple,代码更安全,如果可能,能用tuple代替list就尽量用tuple.

tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。
如果要定义一个空的tuple,可以写成();因为括号()既可以表示tuple,又可以表示数学公式中的小括号,在tuple只有一个元素时就会有歧义,所以只有一个元素时必须加一个逗号,来消除歧义。例如,   t=(1,)。
tuple所谓的“不变”是说,tuple的每一个元素,指向永远不变。即指向a,就不能改成指向b,指向一个list,就不能改成指向其它对象,但指的这个list本身是可变的!例如:
                                                                 
4、dict和set

dict   Python内置了字典:dict的支持,在其他语言中也成为map,使用键-值(key-value)存储,具有极快的查找速度。
比如:假设要根据同学的名字查找对应的成绩,可以按以下方式实现。
d={'Michael': 95, 'Bob': 75, 'Tracy':85} dict查找速度很快。是因为dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。这种key-value存储方式,在放进去的时候,必须根据key算出value的存储位置,这样,取的时候才能根据key直接拿到value。
将数据放入dict的方法:1、初始化时指定。例,d={'Michael': 95, 'Bob': 75, 'Tracy':85} 2、通过key放入。例,d['Jack']=90

注意:一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值冲掉;如果key不存在,dict就会报错。
避免key不存在的错误的方法:1、通过in判断key是否存在:'Thomas' in d 会输出false  2、通过dict提供的get()方法,如果key存在,可以返回None,或者自己指定的value.注意:返回None的时候Python的交互环境不显示结果。
要删除一个key,用pop(key)方法,对应的value也会从dict中删除。

dict 和 list 区别:

和list比较,dict有以下特点:
(1)查找和插入的速度极快,不会随着key的增加而变慢;

(2)需要占用大量的内存,内存浪费多。

而list相反:

(1)查找和插入的时间随着元素的增加而增加;

(2)占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,dict的key必须是不可变对象
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置(value)的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心的作为key.而list是可变的,不能作为key。
set   set和list类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key.
要创建一个set,需要提供一个list作为输入集合:比如,s=set([1,2,3])     输出结果:s={1,2,3}

注意:传入的参数[1,2,3]是一个list,而显示的{1,2,3}只是告诉你这个set内容有1,2,3这3个元素,显示的顺序也不表示set是有序的。重复元素在set中自动被过滤
添加元素到set中:add(key)
删除元素:remove(key)
set和dict的区别:set没有存储对应的value,但是,set的原理和dict一样,所以同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。

不可变对象:str是不变对象,而list是可变对象。对于可变对象,比如list、对list进行操作,List内部的内容是会变化的。而对于不变对象,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

阅读更多

没有更多推荐了,返回首页