这周继续学习了Python的一些知识,下面是我的一些笔记:
1.切片:
取list或tuple的部分元素(字符串也可以):
L=list(range(100))#建立一个0~99的list
print(L[0:2])#取0,1,正好两个元素,但不包括2
print(L[:10])#前十个元素,即0~9,不包括L[10]=10,它是第11位元素
print(L[-10:])#后十个元素,包括L[-10],因为是从-1开始索引的,且[ :]的前部是包括的
#后部不包括,即输出90~99
print(L[10:20])#从10~19
print(L[::5])#所有数,每5个取一次
2.迭代:
(1)dict:
只迭代key:for key in d:
只迭代value:for value in d.values():
同时迭代key,value:for k,v in d.items():
(2)迭代字符串:
for ch in 'ABC':
print(ch)
#输出A,B,C
(3)迭代list的索引和元素本身:
for i,value in enumerate(['A','B','C']):
print(i,value)
#enumberate是内置函数
#输出:
#0 A
#1 B
#2 C
(4)for 中同时引用两个变量:
for x,y in [(1,1),(3,4),(3,8)]:
print (x,y)
#输出(1,1) (3,4),(3,8)
3.列表生成式:
(1)生成列表
L=list(range(1,11))
print(L)
#输出[1,2,3,4,5,6,7,8,9,10]
L=[]
for x in range(1,11):
L.append(x*x)
print(L)
#输出[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
(2)列表生成式:
注意:for 的前部是表达式,有if必须有else;后部只有if 不能有else
L=[x*x for x in range(1,11) if x%2==0]
print(L)
#筛选出偶数的平方
#输出[4,16,36,64,100]
#两层循环形成全排列
L=[m+n for m in 'ABC' for n in 'XYZ']
print(L)
#输出['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
#if else
L=[x if x%2==0 else -x for x in range(1,11) ]
print(L)
#输出:[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
#两个变量生成list
d={'X':'A','Y':'B','Z':'C'}
L=[k+ '='+ v for k, v in d.items()]
print(L)
#输出:['X=A', 'Y=B', 'Z=C']
4.生成器generator:
如果列表元素可以按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
g=(x*x for x in range(10))
for n in g:
print(n)
#输出:0
#1
#4
#9
#16
#25
#36
#49
#64
#81
5.高阶函数:
(1)介绍:
函数本身可以赋值给变量,可通过该变量来调用这个函数。函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(x,y,f):#传入函数
return f(x)+f(y)
print(add(-5,6,abs))
#输出11
(2)map()
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
map()
作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的函数,还可以计算任意复杂的函数。
def f(x):
return x*x
r=map(f,[1,2,3,4,5,6,7,8,9])
print(list(r))
#输出 [1, 4, 9, 16, 25, 36, 49, 64, 81]
#通过list()函数让它把整个序列都计算出来并返回一个list
#当然也可以用一个循环实现
(3)reduce()
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算。效果如下:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
#对一个序列求和
from functools import reduce
def add(x,y):
return x+y
print(reduce(add,[1,3,5,7,9]))
#输出25
#把序列[1, 3, 5, 7, 9]变换成整数13579
from functools import reduce
def add(x,y):
return x*10+y
print(reduce(add,[1,3,5,7,9]))
#输出13579
(4)综合运用map和reduce
#因为字符串也是序列,所以可以写出一个新函数str2int,实现str和int的转换
from functools import reduce
DIGITS={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def str2int(s):
def add(x,y):
return x*10+y
def c2num(s):
return DIGITS[s]
return reduce(add,map(c2num,s))
print(str2int(['1','3','5','7','9']))
#输出 13579