Learning Python(3)

chap7 映像和集合类型

1. 映像类型基本操作

1)创建字典和赋值

>>> dict1={}
>>> dict2={'name':'earth','port':80}
>>> dict1,dict2
({}, {'name': 'earth', 'port': 80})

工厂方法dict()创建字典

>>> fdict=dict((['x',1],['y',2]))
>>> fdict
{'y': 2, 'x': 1}

内建方法fromkeys()创建一个“默认”字典,字典中元素具有相同的值(如果没给出,默认为None)

>>> ddict={}.fromkeys((‘x’,’y’),-1) >>> ddict {‘y’: -1, ‘x’: -1} >>> >>> edict={}.fromkeys((‘foo’,’bar’)) >>> edict {‘foo’: None, ‘bar’: None}

2)访问字典中的值

>>> for key in dict2.keys():
...     print 'key=%s,value=%s' %(key,dict2[key])
...
key=name,value=earth
key=port,value=80

也可以不使用keys()方法获取提供循环使用的键值列表,可以用迭代器来轻松访问类序列对象,比如字典和文件。只需要字典的名字就可以在for循环里遍历字典。例如:for key in dict2.keys()可以写成for key in dict2。

得到字典中的某个元素的值,判断字典中是否有某个键。

>>> dict2['name']
'earth'
>>> 'server' in dict2
False
>>> dict2.has_key('server')
False

字典中的键必须是可哈希的,所以数字和字符串可以作为字典中的键,但是列表和其他字典不行。
3)更新字典

>>> dict2
{'name': 'earth', 'port': 80}
>>> dict2['name']='value'
>>> dict2['arch']='sunos5'
>>> dict2
{'arch': 'sunos5', 'name': 'value', 'port': 80}

4)删除字典元素和字典

>>> del dict2['name']
>>> dict2
{'arch': 'sunos5', 'port': 80}
>>> dict2.clear()
>>> dict2
{}
>>> del dict1
>>> dict2
{}
>>> dict1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'dict1' is not defined
>>> ddict
{'y': -1, 'x': -1}
>>> ddict.pop('x')
-1
>>> ddict
{'y': -1}

2.映射类型的相关函数

dict([container]) 创建字典的工厂函数,如果提供了容器类(container),就用其中的条目填充字典,否则就创建一个空字典。
len(mapping)返回映射的长度。
hash(obj)返回obj的哈希值。

3.集合类型基本操作

1)创建和集合赋值

>>> s=set('cheeseshop')#可变集合
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> type(s)
<type 'set'>
>>> s=frozenset('bookshop')#不可变集合
>>> s
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> type(s)
<type 'frozenset'>
>>> len(s)
6

2)如何访问集合中的值

>>> 'k' in s
True
>>> 'c' not in s
True
>>> for i in s:
...     print i
...
b
h
k
o
p
s
>>>

3)更新集合

>>> s.add('z')#不可变集合
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
>>> s=set('cheeseshop')#可变集合
>>> s.add('z')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
>>> s.update('pypi')
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
>>> s.remove('z')
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
>>> s -= set('pypi')
>>> s
set(['c', 'e', 'h', 'o', 's'])

4.集合等价

集合等价是指,对每个集合而言,当且仅当其中搞一个集合中的每个成员同事也是另一个集合中的成员。

5.集合类型操作

联合(|)
交集(&)
差补(-)
对称差分(^)
ps.加号不是集合类型操作符

仅适用于可变集合的操作符:
(Union)Update(|=)—从已存在的集合中添加成员,和update方法等价。
Retention/Intersection Update(&=)—保留(或交集更新)操作保留与其他集合的共有成员。
Difference Update(-=)—对集合s和t进行差更新操作s-=t,差更新操作会返回一个集合,该集合中的成员是集合s去除掉集合t中元素后剩余的元素。
Symmetric Different Update(^=)—返回集合中的成员仅是集合s或集合t中的成员。

chap8 条件和循环

1.if语句

if expression:
    expr_true_suite
else:
    expr_false_suite
if expression1:
    expr1_true_suite
elif expression2:
    expr2_true_suite
...
elif expressionN:
    exprN_true_suite
else:
    none_of_the_above_suite

ps.使用映像对象的一个最大好处就是它的搜索操作比类似if-elif-else语句或者是for循环这样的序列查询要快很多。

2.条件表达式
smaller=x if x<y else y

3.while语句

while expression:
    suite_to_repeat

4.for语句
python中最强大的循环结构可以遍历序列成员,可以用在列表解析和生成器表达式中,会自动地调用迭代器的next()方法,捕获StopIteration异常并结束循环。
1)一般语法

for iter_var in iterable:
    suite_to_repeat

2)用于序列类型
通过序列项迭代

>>> nameList=['Walter',"Nicole",'Steven','Henry']
>>> for eachName in nameList:
...    print eachName,"Lim"
...
Walter Lim
Nicole Lim
Steven Lim
Henry Lim

通过序列索引迭代

>>> for nameIndex in range(len(nameList)):
...     print "Liu,",nameList[nameIndex]
...
Liu, Walter
Liu, Nicole
Liu, Steven
Liu, Henry

–使用range()可以得到用来迭代的nameList的索引数列表,使用切片/下标操作符([]),就可以访问对应的序列对象。
–直接迭代序列要比通过索引迭代快。
使用项和索引迭代(内建函数enumerate)

>>> for i,eachLee in enumerate(nameList):
...     print "%d %s Lee" %(i+1,eachLee)
...
1 Walter Lee
2 Nicole Lee
3 Steven Lee
4 Henry Lee

3)用于迭代器类型
range()内建函数
range(start,end,step=1)—两个或三个整型参数
xrange()内建函数
性能远高出range(),它不会在内存里创建列表的完整拷贝

5.与序列相关的内建函数
sorted()
reversed()
enumerate()
zip()

6.break语句
结束当前循环然后跳转到下条语句。常用在当某个外部条件被处罚,需要立即从循环中退出时break语句可以用在while和for循环中。

7.contunue语句
立即启动循环的下一次迭代,即程序会停止当前循环,并忽略剩余的语句,然后回到循环的顶端,在开始下一次迭代前,如果是条件循环,我们将验证条件表达式,如果是迭代循环,我们将验证是否还有元素可以迭代。

8.pass语句
NOP

9.列表解析
python支持的函数式编程特性:map()对所有的列表成员应用一个操作,filter()基于一个条件表达式过滤列表成员,lambda允许快速创建只有一行的函数对象。
[expr for iter_var in iterable]–列表解析语法
map(lambda x:x**2,range(6))
[x**2 for x in range(6)]
[expr for iter_var in iterable if cond_expr]–列表解析语法扩展

 

Leave a Reply

Your email address will not be published. Required fields are marked *