最近要回学校开始做毕设了,准备做个有关算法的,听说python运算好一些,特地来学一学。
先从基础开始啊…………………………
切片
取一个list的部分元素是非常常见的操作。
Python提供了切片(Slice)操作符,能大大简化这种操作。
取前3个元素,用一行代码就可以完成切片:
L[0:3]
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
如果第一个索引是0,还可以省略:
L[:3]
也可以从索引1开始,取出2个元素出来:
L[1:3]
只用一个 : ,表示从头到尾:
L[:]
因此,L[:]实际上复制出了一个新list。
切片操作还可以指定第三个参数:
L[::2]
第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。
tuple同上。
L[-1]是最后一个元素,用此做倒序切片。
倒序切片包含起始索引,不包含结束索引。
利用倒序切片对 1 - 100 的数列取出:
* 最后10个数;
* 最后10个5的倍数。
L = range(1, 101)
print L[-10:]
print L[4::5][-10:]
字符切片
>>> ‘ABCDEFG‘[:3] ‘ABC‘
集合是指包含一组元素的数据结构,我们已经介绍的包括: 1. 有序集合:list,tuple,str和unicode; 2. 无序集合:set 3. 无序集合并且具有 key-value 对:dict
enumerate() 函数把:
[‘Adam‘, ‘Lisa‘, ‘Bart‘, ‘Paul‘]
变成了类似:
[(0, ‘Adam‘), (1, ‘Lisa‘), (2, ‘Bart‘), (3, ‘Paul‘)]使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。
>>> L = [‘Adam‘, ‘Lisa‘, ‘Bart‘, ‘Paul‘] >>> for index, name in enumerate(L): ... print index, ‘-‘, name ... 0 - Adam 1 - Lisa 2 - Bart 3 - Paul
zip()函数可以把两个 list 变成一个 list:
>>> zip([10, 20, 30], [‘A‘, ‘B‘, ‘C‘]) [(10, ‘A‘), (20, ‘B‘), (30, ‘C‘)]
dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list
dict除了values()方法外,还有一个 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一样
那这两个方法有何不同之处呢?
1. values() 方法实际上把一个 dict 转换成了包含 value 的list。
2. 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
3. 打印 itervalues() 发现它返回一个 <dictionary-valueiterator> 对象,这说明在Python中,for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环,而内部如何迭代我们通常并不用关心。
如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
在一个 for 循环中,如何同时迭代 key和value。
dict 对象的 items() 方法返回的值:
>>> d = { ‘Adam‘: 95, ‘Lisa‘: 85, ‘Bart‘: 59 } >>> print d.items() [(‘Lisa‘, 85), (‘Adam‘, 95), (‘Bart‘, 59)]
可以看到,items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:
>>> for key, value in d.items(): ... print key, ‘:‘, value ... Lisa : 85 Adam : 95 Bart : 59
和 values() 有一个 itervalues() 类似, items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。
d.ieteritems()
列表生成式
>>> L = [] >>> for x in range(1, 11): ... L.append(x * x) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 字符串可以通过 % 进行格式化,用指定的参数替代 %s。字符串的join()方法可以把一个 list 拼接成一个字符串。
如果我们只想要偶数的平方,不改动 range()的情况下,可以加上 if 来筛选:
>>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]
有了 if 条件,只有 if 判断为 True 的时候,才把循环的当前元素添加到列表中。
isinstance(x, str) 可以判断变量 x 是否是字符串
字符串的 upper() 方法可以返回大写的字母
在列表生成式中,也可以用多层 for 循环来生成列表。