python学习笔记二

来源:互联网 发布:网络老虎机平台 编辑:程序博客网 时间:2024/05/16 17:17

主要介绍两个部分内容:迭代和作用域

一、迭代

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中而不是在模块中

 




 



 

0 0