高级特性:
比如构造一个1,3,5,7,9,....,99的列表,可以通过循环实现:
# -*- coding: UTF-8 -*-
L = []
n = 1
while n <= 99:
L.append(n)
n = n + 2
print L
# -*- coding: UTF-8 -*-
L = []
n = 1
while n <= 99:
L.append(n)
n = n + 2
print L
n=45
while n <= 45:
print L[n]
n =n-2
# -*- coding: UTF-8 -*-
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print L
print L[0]
print L[1]
print L[2]
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
Michael
Sarah
Tracy
# -*- coding: UTF-8 -*-
L = ('Michael', 'Sarah', 'Tracy', 'Bob', 'Jack')
print L
print L[0]
print L[1]
L[2]='xxxxxxx'
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/t1.py", line 6, in <module>
L[2]='xxxxxxx'
TypeError: 'tuple' object does not support item assignment
('Michael', 'Sarah', 'Tracy', 'Bob', 'Jack')
Michael
Sarah
# -*- coding: UTF-8 -*-
L = ('Michael', 'Sarah', 'Tracy', 'Bob', 'Jack')
print L
print L[0]
print L[1]
print '---------'
for i in range(3):
print L[i]
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
('Michael', 'Sarah', 'Tracy', 'Bob', 'Jack')
Michael
Sarah
---------
Michael
Sarah
Tracy
对这种经常指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
对应上面的问题,取前3个元素,用一行代码就可以完成切片:
# -*- coding: UTF-8 -*-
L = ('Michael', 'Sarah', 'Tracy', 'Bob', 'Jack')
print L
print L[0]
print L[1]
print '---------'
M=L[:3]
print M
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
('Michael', 'Sarah', 'Tracy', 'Bob', 'Jack')
Michael
Sarah
---------
('Michael', 'Sarah', 'Tracy')
tuple 也是一种list,唯一区别是tuple不可变。
因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
# -*- coding: UTF-8 -*-
print (0, 1, 2, 3, 4, 5)[:3]
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
(0, 1, 2)
Unicode字符串u'xxx'
>>> u'中文'
u'u4e2du6587'
>>>
迭代:
如果给定一个list或者tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
在Python中,迭代是通过for ... in 来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的
# -*- coding: UTF-8 -*-
L = [1, 4, 7, 'a1', 'a4', 'a7']
for i in L:
print i
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
1
4
7
a1
a4
a7
# -*- coding: UTF-8 -*-
for ch in 'ABC':
print ch
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
A
B
C
# -*- coding: UTF-8 -*-
for ch in 123:
print ch
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/t1.py", line 2, in <module>
for ch in 123:
TypeError: 'int' object is not iterable
'int' 对象是不可迭代的
# -*- coding: UTF-8 -*-
for ch in '123':
print ch
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
1
2
3
所以,当我们使用for循环时,只要作用域一个可迭代对象,for循环就可以正常运行,
而我们不太关心该对象究竟是list还是其他数据类型。
那么,如何判断一个对象是可迭代对象呢?方法是通过collections模块的iterable类型判断:
# -*- coding: UTF-8 -*-
from collections import Iterable
a = '123'
if isinstance(a, Iterable):
for ch in a:
print ch
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
1
2
3
# -*- coding: UTF-8 -*-
from collections import Iterable
a = 123
if isinstance(a, Iterable):
for ch in a:
print ch
else:
print 11111
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
11111
from collections import Iterable
从collections 导入Iterable模块:
# -*- coding: UTF-8 -*-
a= [(1, 1), (2, 4), (3, 9)]
print a[0]
print a[1]
print a[2]
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
(1, 1)
(2, 4)
(3, 9)
# -*- coding: UTF-8 -*-
a= [(1, 1), (2, 4), (3, 9)]
print a[0][1]
print a[1][1]
print a[2][1]
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
1
4
9
# -*- coding: UTF-8 -*-
a= [[1, 1], [2, 4], [3, 9]]
print a[0][1]
print a[1][1]
print a[2][1]
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
1
4
9
列表生成式:
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式:
# -*- coding: UTF-8 -*-
a=range(1, 11)
print a
a[5]='aaa'
print a
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/t1.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 'aaa', 7, 8, 9, 10]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
生成器:
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,
列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅
需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。