#-*- coding:utf-8 -*-
#------字典--------
'''字典类似于通过联系人名查找联系人的详细信息,即,把键(名字)和值(详细情况)联系在一起,
键必须唯一,只能使用不可变的对象如字符串来作为字典的键,但是可以把不可变或者可变对象作为
字典的值。基本说就是应该只使用
'''
#-------练习---------
email = {'张三':'123@126.com',
         '李四':'456@126.com',
         '王五':'789@126.com',
         '二大爷':'137@126.com'
         };
#下面用In来检查一个键值对是否存在,也可以用has_key
if '李四' in email:
  print("李四的邮件是:"), email['李四'];
if email.has_key('李四'):
  print("李四的邮件是:"), email['李四'];
#李四的邮件是: 456@126.com

print ('二大爷的邮件是:'),email['二大爷'];
#二大爷的邮件是: 137@126.com

print str(email).decode('string_escape');
#{'张三': '123@126.com', '李四': '456@126.com', '二大爷': '137@126.com', '王五': '789@126.com'}

#delete a key-value pair
del email ['张三'];
print 'there are %d contacts in the email-book'%len(email);
print ('there are {0} contacts in the email-dic'.format(len(email)));
#there are 3 contacts in the email-book

#add a key-value pair
email ['赵六'] = '357@qq.com';
for name,emails  in email.items():
        print 'email %s at %s'%(name,emails);
for name,semail in email.items():
     print ('email {0} at {1}'.format(name,semail));
if '李四' in email:
  print("李四的邮件是:"), email['李四'];
'''
email 李四 at 456@126.com
email 二大爷 at 137@126.com
email 王五 at 789@126.com
email 赵六 at 357@qq.com
李四的邮件是: 456@126.com
这里使用字典的items方法,来使用字典中的每个键/值对,返回一个元组列表,其中每个元组都包含
一堆项目--键与对应的值,抓取这个对,然后分别赋给for..in循环中的变量name和email,再打印
这些值。
'''
'''
注意在 for遍历后会如果用email会改变email里的值,再输出李四的邮件会报错,所以我这里用了
semail和emails
'''

#----------------------------------------------------------------------------------------------------------------------------
#------------序列----------
#对list进行操作----------
box = ['a','b','c','d','e','f','g'];
print ('box:%s')%box;
#box:['a', 'b', 'c', 'd', 'e', 'f', 'g']

#取单个项目------------
print('item 0 is:'),box[0];  #item 0 is: a
print('item 1 is:'),box[1];  #item 1 is: b
print('item -1 is:'),box[-1];  #item 1 is: g  从后往前取

#切片操作-----------------
#[start:end]冒号前为起始索引,冒号后为结束索引,包左不包右
print('item 1 to 3 is'),box[1:3];  #item 1 to 3 is ['b', 'c']
print('item 3 to end is:'),box[3:]; #item 3 to end is: ['d', 'e', 'f', 'g']
print('item 4 to -1 is:'),box[4:-1]; #item 4 to -1 is: ['e', 'f']
print('item start to end is:'),box[:]; #item start to end is: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

#--------------对字符串操作---------------------------------------------------------
s='abcdefghijklmn';
print('s.len:%s')%len(s); #s.len:14
print('S:%s')%s;   #S:abcdefghijklmn
print('s:'),s[1:3]; #s: bc
print('s:'),s[4:];  #s: efghijklmn
print('s:'),s[6:-2]; #s: ghijkl
print('s:'),s[:-11];  #s: abc


#-----------切片中的步长[start:end:step],就是切片中的第三个参数step-----------------------------------------------------
print s[1:8:2];  #bdfh  由索引为1开始,索引为8结束,步长为2
print s[1:8:3];  #beh
'''step 默认为1,可以为负,但不可以为0
   step>0 从左向右排列,start必须小于end才有结果;
   step<0 从右向左排列,start必须大于end才有结果;
'''
print s[0:3:];   #abc
print s[3:0:-1]; #dcb


#-----------集合------------------------------------------------------------------------------------------------------------------
#创建set([1, 2, 3, 4])
cou = set(['usa','india','russia']);
print('cou:%s')%cou;  #cou:set(['india', 'russia', 'usa'])
print 'china' in cou;  #False
cous = cou.copy();
print('cous:%s')%cous; #cous:set(['india', 'russia', 'usa'])
cous.add('china');
print cous.issuperset(cou); #True 检查是否cou的每一个元素都在cous中
print cous>=cou;#True 与上一句等同
cou.remove('india');
print('cou与cous的并集:'),cous.union(cou);  #cou与cous的交集: set(['russia', 'usa'])
print('cou与cous的交集'),cous.intersection(cou); #cou与cous的交集 set(['russia', 'usa'])
print('cous中有但是cou没有'),cous.difference(cou); #cous中有但是cou没有 set(['india', 'china'])
print('cou和cous中不重复的'),cous.symmetric_difference(cou);#cou和cous中不重复的 set(['india', 'china'])
'''
也可以这样写
cous.union(cou)---cous|cou
cous.intersection(cou)---cous&cou
cous.difference(cou)---cous-cou
cous.symmetric_difference(cou)---cous^cou
'''

#----------------引用------------------------------------------------------------------------------------------------------
'''当你创建一个对象并给他赋一个变量的时候,这个变量就是引用的哪个对象,而不是表示这个
对象本身,也就是说,变量名指向你计算机中存储的那个对象的内存,这杯称为名称到对象的绑定
'''
box = ['apple','orange','banana']
mylist = box;   #mylist 是同一个object的另一个名字

del box[0]; #删掉第一个item  如果这样写del mybox 报错

print 'box is:',box; #box is: ['orange', 'banana']
print 'mybox is:',mylist  #mybox is: ['orange', 'banana']
#box 和 mylist指向同一个 object

list = ['apple','orange','banana'];

print 'Copy by making a full slice'; #Copy by making a full slice   
mylist = list[:];#--这里是复制list和mylist不指向同一个object

del mylist[0];
print 'list is:',list;  #list is: ['apple', 'orange', 'banana']
print 'mylist is:',mylist;  #mylist is: ['orange', 'banana']

'''所以如果想要复制一个列表或者类似的序列,必须使用切片来拷贝,如果使用另一个变量名
两个变量名都引用同一个对象,会造成麻烦。
总结:列表的赋值语句不等于创建拷贝,要使用切片操作符来建立序列的拷贝
'''

#--------一些字符串补充----------------------------------------------------------------------------------
name = 'Moonsky';   #这是一个string object
if name.startswith('Mo'):
    print 'yes,the string starts with \'Mo\'';
if 's' in name:
    print 'yes,it contains the string\'s\'';
if name.find('oo')!=-1:
    print 'yes,it contains the string "oo"'; #如果不返回-1,表示字符串里包含oo
country = ['china','us','uk'];
delimiter = '-**-';
print(delimiter.join(country)); #str类的一个作为分隔符的字符串序列的项目整洁的方法,返回字符串
'''
输出
yes,the string starts with 'Mo'
yes,it contains the string's'
yes,it contains the string "oo"
china-**-us-**-uk
'''