12 字符串编码,list和tuple元祖,dict和set和raw_input输入数字的情况

参考学习网站:
廖雪峰python学习网站

1 数据类型和变量

a = 'ABC'
b = a
a = 'XYZ'
print b
ABC

发生了什么呢?
其实a,b只是一个变量,’ABC’与’XYZ’才是一个对象,所以输出b的时候还是原来的那个’ABC’,因为没有给这个变量赋予新的对象啊~

2 字符串和编码

1 字符编码

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

图

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

图

2 Python的字符串

普通的字符串’ABC’在Python内部都是ASCII编码的。Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换:

ord('a')
97
chr(65)
'A'

Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u’…’表示,比如:

print u'中文'
中文
u'中'
u'\u4e2d'

\u后面是十六进制的Unicode码。

u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'

反过来,把UTF-8编码表示的字符串’xxx’转换为Unicode字符串u’xxx’用decode(‘utf-8’)方法:

'abc'.decode('utf-8')
u'abc'
'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
中文

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

3 格式化

'hello,%s' % 'world'
'hello,world'
'%2d-%02d' % (3,1)
' 3-01'
'growth rate:%d %%' % 7
'growth rate:7 %'

请牢记仅使用Unicode和UTF-8这两种编码方式。

3 使用list和tuple

1 list

classmates = ['Michael','Bob','Tracy']
classmates
['Michael', 'Bob', 'Tracy']
classmates[-1]
'Tracy'
classmates.append('Adam')
classmates
['Michael', 'Bob', 'Tracy', 'Adam']
classmates.pop()
'Adam'
classmates
['Michael', 'Bob', 'Tracy']

list元素也可以是另一个list,比如:

s = ['python', 'java', ['asp', 'php'], 'scheme']
len(s)
4

2 tuple元组

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:

classmate=('Michael','Bob','Tracy')
classmates
['Michael', 'Bob', 'Tracy']

要定义一个只有1个元素的tuple,如果你这么定义:

t = (1)
t
1

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

t = (1,)
t
(1,)

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

‘可变的’tupe:

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

其实变的是里面的list,原本定义的那个list还是那个list的内存空间,只是空间里面的内容变了

3 再议raw_input

birth = raw_input('birth:')
if birth < 2000:
    print '00前'
else:
    print '00后'
birth:1982
00后

1982是00后?

birth
'1982'

原来是因为birth是字符串,并不是数字,要输入数字的话要用下面输入方法

birth = int(raw_input('birth: '))
birth
birth: 2





2

4 使用dict和set

1 dict

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

pop可以删除字典中的一个key

d.pop('Bob')
75
d
{'Michael': 95, 'Tracy': 85}

和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而增加;
需要占用大量的内存,内存浪费多。
而list相反:

查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。

2 set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

s = set([1, 1, 2, 2, 3, 3])
s
{1, 2, 3}
s.add(4)
s
{1, 2, 3, 4}
s.remove(4)
s
{1, 2, 3}

3 再议对象与变量

a = 'abc'
a.replace('a','A')
'Abc'
a #a还是没变
'abc'

因为对象是’abc’这个字符串,a只是一个变量,下面这种写法才是正确的

a = a.replace('a','A')
a
'Abc'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值