Python学习笔记(三)
高级特性
1.切片
顾名思义,就是对集合进行切取,类似java中的subString()
方法的功能。在Python中能进行切片操作的有List,tuple,字符串。在其他语言中需要写循环语句来遍历达到截取的目的,在Python中很简单。
L = list(range(100))
print(L[0:10])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[0:10]
表示从从索引0
开始取,直到索引10
为止,但不包括索引10
。
如果第一个索引是0
,还可以省略:
L = list(range(100))
print(L[:10])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
它同样支持倒数切片,例如:
L = list(range(100))
print(L[-5:])
[95, 96, 97, 98, 99]
L[-5:]
表示重倒数第5个开始打印,一直到L末尾元素。
前10个数,每两个取一个:
L = list(range(100))
print(L[:10:2])
[0, 2, 4, 6, 8]
L[:10:2]
表示没隔两个取一个。
复制一个list可以用[:]
来处理。
tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
t = (1,2,3)
print(t[0:3])
(1, 2, 3)
字符串’xxx’也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
str = 'ABCDEFG'
print(str[0:3])
ABC
2.迭代
在Python中只要是可迭代对象,无论有无下标,都可以迭代,判断一个对象是否是可迭代对象
from collections import Iterable
print(isinstance('abc',Iterable))
True
在java中迭代通过for
循环来完成,但是在Python中通过for...in
来完成:
迭代list:
L= [1,2,3]
for i in L:
print(i)
1
2
3
迭代dict:
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
a
c
b
默认情况下,dict迭代的是key
。如果要迭代value
,可以用for value in d.values()
d = {'a': 1, 'b': 2, 'c': 3}
for value in d.values():
print(value)
2
3
1
迭代字符串:
for ch in 'ABC':
print(ch)
A
B
C
如果我们想得到索引index和对应的value,可以通过Python内置函数enumerate
来把一个list变成索引-元素对,这样就可以用for
来获同事迭代索引和元素本身。
L = ['A','B','C']
for ch in enumerate(L):
print(ch)
(0, 'A')
(1, 'B')
(2, 'C')
打印结果是一个一个的tuple,说明是enumerate
将list变成一个装有tuple的list。
L = ['A','B','C']
for index,value in enumerate(L):
print(index,value)
0 A
1 B
2 C
在for
循环中还可以引入两个变量。
zip()
函数可以把两个 list 变成一个 list:
L1= [1,2,3,4]
L2 = ['android','java','kotlin','Rxjava']
for x in zip(L1,L2):
print(x)
(1, 'android')
(2, 'java')
(3, 'kotlin')
(4, 'Rxjava')
3.列表生成器
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
创建一个[1*1,2*2,3*3...,10*10]
的集合:
L = [x * x for x in range(1,11)]
print(L)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for 循环后面还可以添加判断条件:
L2 = [x * x for x in range(1,11) if x %2 == 0]
print(L2)
[4, 16, 36, 64, 100]
还可以使用两层循环,可以生成全排列:
L3 = [m + n for m in 'ABC' for n in 'XYZ']
print(L3)
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列表生成式也可以使用两个变量来生成list:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print([k+':'+v for k,v in d.items()])
['y:B', 'z:C', 'x:A']
items()
函数的作用是将dict里面的key-value转变成tuple装进一个list里面
d = {'x': 'A', 'y': 'B' , 'z': 'C' }
print(d.items())
dict_items([('z', 'C'), ('y', 'B'), ('x', 'A')])
把一个list中所有的字符串变成小写:
L = ['Hello', 'World', 'IBM', 'Apple']
print([s.lower() for s in L])
print([s.upper() for s in L])
['hello', 'world', 'ibm', 'apple']
['HELLO', 'WORLD', 'IBM', 'APPLE']
lower()
函数的作用是将字符串变成小写,upper()
函数的作用是将字符串变成大写。
3.生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
L = [s * s for s in range(1,11)]
print(L)
G = (s * s for s in range(1,11))
print(G)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
<generator object <genexpr> at 0x002C05A0>
创建L
和G
的最大的区别就是[]
和()
的区别,L
是一个list,G
是一个generator。
获取generator里面的每一个元素,可以利用next()
函数,类似于指针作用,指向哪个元素就可以打印出哪个元素。也可以通过for
循环来打印:
G = (s * s for s in range(1,11))
for s in G:
print(s)
1
4
9
16
25
36
49
64
81
100
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator.
参考资料:廖雪峰的官方网址