主要介绍两个部分内容:迭代和作用域
一、迭代
1.关于字典:
D={'a':1,'c':3,'b':2}
K=D.keys()
K
dict_keys(['a', 'c', 'b']) #K不是一个列表而是一个对象,一个dict_keys对象
字典有自己的迭代器,返回连续的键:
I=iter(D)
next(I) #输出‘a’
next(I) #输出'c'
2.zip 和 map:
Z=zip((1,2,3),(10,20,30))
for pair in Z:print(pair)
(1, 10)
(2, 20)
(3, 30)
若为
Z=zip((1,2,3),(10,20,30))
list(Z)
for pair in Z:print(pair)#输出为空
zip 和 map 不支持相同结果的多个活跃迭代器:
Z=zip((1,2,3),(10,20,30))
I1=iter(I)
I2=iter(I)
next(I1) #输出(1,10)
next(I1) #输出(2,20)
next(I2) #输出(3,30)
对于range来说,range不是自己的迭代器,进行手动迭代可以支持结果上的多个迭代器
R=range(3)
I1=iter(R)
I2=iter(R)
next(I1) #输出 0
next(I1) #输出 1
next(I2) #输出 0
next(I1) #输出 2
next(I2) #输出 1
3.在文本文件中读取文本行的最佳方式是不要可以去读取:
for line in open('check.txt'):print(line)
二、作用域
1.一个例子
版本一:
x=255
def func():
x=30
return x
print(func(),x)
上述代码的输出为30,255,在def之前的x为全局变量,def中的x为本地变量,该本地变量只作用在def中
把上述的代码进行修改为版本二如下:
x=255
def func():
return x
print(func(),x)
上述代码输出为255,255,由此可以看出,在第一个版本中,def中的x取代了进入def之前的x在def中的作用
我们接着修改版本二的代码为版本三:
x=255
def func():
global x
x=30
return x
print(func(),x)
版本三的输出为30,30;这里用global将def中的x作用域修改为全局,从而覆盖了之前进入def前的全局变量x2.工厂函数:一个能够记住嵌套作用域的变量值的函数
def maker(N):
def action(X):
return X**N
f=maker(2) #f记住2
f #f为内嵌的一个引用,这时输出<function action at 0x14...>
g=maker(3) #g记住3
f(3) #输出3**2=9
f(4) #输出4**2=16
g(2) #输出2**3=8
3.lambda表达式:能够看到所有在编写的函数中可以用的变量
def func():
x=4
action=(lambda n:x**n) #lambda表达式引入了新的本地作用域
return action
x=func()
print(x(2)) #输出4**2=16
下面比较两组有关lambda的代码
代码一:
def makeActions():
acts=[]
for i in range(5):
acts.append(lambda x,i=i:i**x)
return acts
acts[0](2)
acts[2](2)
acts[4](2) #以上三个输出均为4**2=16
#代码一:
def makeActions():
acts=[]
for i in range(5):
acts.append(lambda x,i=i:i**x)
return acts
acts[0](2)
acts[2](2)
acts[4](2) #以上三个输出依次为0,4,16
对比以上的两个代码,两个代码都试图记住每一个i,而第一个代码记住的所有i都是一样的,即最后一次的i值为4,第二个代码成功获取每一个i值。
原因是:嵌套作用域中的变量在嵌套的函数被调用时才进行查找,所以记住的是同样的值,即在最后一次循环迭代中循环变量的值4.nonlocal:修改嵌套作用域变量
通过以下代码来理解:
def tester(start):
stat=start
def nested(label):
nonlocal state
print(label,state)
state+=1
return nested
如果省去nonlocal这一句,那么state+=1这一句将产生错误,在第二个def中将无法修改嵌套作用域变量state
state=10
def tester(start):
def nested(label):
nonlocal state #ERROR
print(state)
state+=1
return nested
第四行代码产生错误,nonlocal的变量必须在def中而不是在模块中