Beginning Python Chapter8

  • 如果要让Python打印出指定的文字,可以用print语句,然后把希望打印的文字用单引号或者双引号括起来,但不能混用单引号和双引号. print会依次打印每个字符串,遇到逗号“,”会输出一个空格,

  • 所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:PI = 3.14159265359但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法

  • 把u’xxx’转换为UTF-8编码的’xxx’用encode(‘utf-8’)方法:
    u’ABC’.encode(‘utf-8’)
    u’中文’.encode(‘utf-8’)

  • 英文字符转换后表示的UTF-8的值和Unicode值相等(但占用的存储空间不同),而中文字符转换后1个Unicode字符将变为3个UTF-8字符,你看到的\xe4就是其中一个字节,因为它的值是228,没有对应的字母可以显示,所以以十六进制显示字节的数值。len()函数可以返回字符串的长度:

len(u’ABC’)
3
len(‘ABC’)
3
len(u’中文’)
2
len(‘\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’)
中文
unicode(100)
u’100’

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

这个tuple定义的时候有3个元素,分别是’a’,’b’和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?
别急,我们先看看定义的时候tuple包含的3个元素:
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向’a’,就不能改成指向’b’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
这里写图片描述
这里写图片描述

  • dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

    key = [1, 2, 3]
    d[key] = ‘a list’
    Traceback (most recent call last):
    File “”, line 1, in
    TypeError: unhashable type: ‘list’


set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。要创建一个set,需要提供一个list作为输入集合:
s = set([1, 2, 3])
s
set([1, 2, 3])
注意,传入的参数[1, 2, 3]是一个list,而显示的set([1, 2, 3])只是告诉你这个set内部有1,2,3这3个元素,显示的[]不表示这是一个list。 重复元素在set中自动被过滤:

s = set([1, 1, 2, 2, 3, 3])
s
set([1, 2, 3])
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
s.add(4)
s
set([1, 2, 3, 4])
s.add(4)
s
set([1, 2, 3, 4])
通过remove(key)方法可以删除元素:

s.remove(4)
s
set([1, 2, 3])
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
set([2, 3])
s1 | s2
set([1, 2, 3, 4])

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
  • tuple虽然是不变对象,但试试把(1, 2, 3)和(1, [2, 3])放入dict或set中,并解释结果。
    a[(1, 2, 3)]=’sss’ 成功
    a[(1,[2,3])]=’sss’ 报错

定义默认参数要牢记一点:默认参数必须指向不变对象!
def add_end(L=[]):
L.append(‘END’)
return L

add_end()
[‘END’]
add_end()
[‘END’, ‘END’]
add_end()
[‘END’, ‘END’, ‘END’]

python 没有取值范围的概念
元组的括号可以省略

dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()。
由于字符串也是可迭代对象,因此,也可以作用于for循环:
for i in a.values(): 也可以使用这种方法迭代值

如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
from collections import Iterable
isinstance(‘abc’, Iterable)
返回True是可迭代的,

for i, value in enumerate([‘A’, ‘B’, ‘C’]):
print i, value
同时得到下表和值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值