高级特性

高级特性:

比如构造一个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万个元素的列表,不仅占用很大的存储空间,如果我们仅仅

需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

原文地址:https://www.cnblogs.com/hzcya1995/p/13349619.html