python输入和输出:
print(300)
300print(100 + 200)
300print(‘100 + 200 =’, 100 + 200)
100 + 200 = 300
要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里。比如输入用户的名字:name = input()
Michael
当你输入name = input()并按下回车后,Python交互式命令行就在等待你的输入了。这时,你可以输入任意字符,然后按回车后完成输入。
输入完成后,不会有任何提示,Python交互式命令行又回到>>>状态了。那我们刚才输入的内容到哪去了?答案是存放到name变量里了。可以直接输入name查看变量内容:name
‘Michael’
dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:
names = [‘Michael’, ‘Bob’, ‘Tracy’]
scores = [95, 75, 85]
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。
如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:d = {‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85}
d[‘Michael’]
95
修改和删除字典元素和清空字典,删除字
dict = {‘a’:‘123’, ‘b’:‘456’, ‘c’:789};
dict[‘b’] = ‘abc’;
del dict[‘a’];
dict.clear();
del dict;
python字典 “键”的约束
字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
dict = {‘a’:‘123’, ‘b’:‘456’, ‘a’:789};
print "dict[‘a’]: ", dict[‘a’];
dict[‘a’]: 789
2)键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:
dict = {[‘a’]:‘123’, ‘b’:‘456’, ‘c’:789};
print "dict[‘a’]: ", dict[‘a’];
print "dict['b]: ", dict[‘b’];
由于第一个键位一个列表,所以以上实例报错:
Traceback (most recent call last):
File “E:/PythonLearn/pydict.py”, line 3, in
dict = {[‘a’]:‘123’, ‘b’:‘456’, ‘a’:789};
TypeError: unhashable type: ‘list’
但是可以是元组如:
dict = {(‘a’):‘123’, ‘b’:‘456’, ‘c’:789};
print "dict[‘a’]: ", dict[‘a’];
print "dict['b]: ", dict[‘b’];
dict[‘a’]: 123
dict['b]: 456
字典内置的函数和方法:
Python字典包含了以下内置函数:
1 cmp(dict1, dict2)
比较两个字典元素。
2 len(dict)
计算字典元素个数,即键的总数。
3 str(dict)
输出字典可打印的字符串表示。
4 type(variable)
返回输入的变量类型,如果变量是字典就返回字典类型。
Python字典包含了以下内置函数:
1 radiansdict.clear()
删除字典内所有元素
2 radiansdict.copy()
返回一个字典的浅复制
3 radiansdict.fromkeys()
创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
4 radiansdict.get(key, default=None)
返回指定键的值,如果值不在字典中返回default值
5 radiansdict.has_key(key)
如果键在字典dict里返回true,否则返回false
6 radiansdict.items()
以列表返回可遍历的(键, 值) 元组数组
7 radiansdict.keys()
以列表返回一个字典所有的键
8 radiansdict.setdefault(key, default=None)
和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default
9 radiansdict.update(dict2)
把字典dict2的键/值对更新到dict里
10 radiansdict.values()
以列表返回字典中的所有值
#删除字典内容
myDict1.pop(“赵雷”) #标准删除姿势
print(“删除赵雷后:”,myDict1)
del myDict1[‘花花’] # 换个姿势删除
print(“删除花花后:”,myDict1)
myDict1.popitem() #随机删除一个
print(“随机删除一个后”,myDict1)
set
set和dict类似,也是一组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中自动被过滤:s = set([1, 1, 2, 2, 3, 3])
s
{1, 2, 3}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:s.add(4)
s
{1, 2, 3, 4}s.add(4)
s
{1, 2, 3, 4}
通过remove(key)方法可以删除元素:
s.remove(4)
s
{1, 2, 3}
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
{2, 3}s1 | s2
{1, 2, 3, 4}
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
再议不可变对象
上面我们讲了,str是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:a = [‘c’, ‘b’, ‘a’]
a.sort()
a
[‘a’, ‘b’, ‘c’]
而对于不可变对象,比如str,对str进行操作呢:a = ‘abc’
a.replace(‘a’, ‘A’)
‘Abc’a
‘abc’
虽然字符串有个replace()方法,也确实变出了’Abc’,但变量a最后仍是’abc’,应该怎么理解呢?
我们先把代码改成下面这样:a = ‘abc’
b = a.replace(‘a’, ‘A’)
b
‘Abc’a
‘abc’
要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’
当我们调用a.replace(‘a’, ‘A’)时,实际上调用方法replace是作用在字符串对象’abc’上的,而这个方法虽然名字叫replace,但却没有改变字符串’abc’的内容。相反,replace方法创建了一个新字符串’Abc’并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串’abc’,但变量b却指向新字符串’Abc’了:
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
切片
L = [‘Michael’, ‘Sarah’, ‘Tracy’, ‘Bob’, ‘Jack’]
print(L[0],L[1],L[2],L[3],L[4])
print(L[0:3])
n = 3
r= []
for i in range(n):
r.append(L[i])
print r