Python重要的函数

一、yield的用法

代码:

 1 def  foo():
 2     print("foo starting ...")
 3     while True:
 4         ret = yield 4
 5         print("return:%s"%ret)
 6 
 7 gen = foo()   #gen实际上是一个生成器(generator),相当于一个对象
 8 print(gen)   #打印出生成器的内存地址
 9 print(next(gen))  #直接return,没有给变量ret赋值
10 gen.send(7)  #由于send方法中包含next()方法,所以程序会继续向下运行执行print方法
11 print(next(gen)) 

结果:

<generator object foo at 0x029A4468>
foo starting ...
4
return:7
return:None
4

  

 说明:带yield的函数是一个生成器,而不是一个函数,这个生成器有一个函数就是next函数,next就相当于"下一步"生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next 的时候,生成器并不会从foo()函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数;

 

二、eval()的用法

1、语法:eval(expression,globals = None,locals= None)  ----将字符串str当成有效的表达式来求值并返回计算结果。

  • expression:表达式;
  • globals:变量作用域,全局命名空间,如果被提供,则必须是一个字典(dictionary)对象;(特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。)
  • locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象;(特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。)

2、实例;

x =1
y =1

def test_eval():
    x = 2
    y =2
    num1 = eval("x+y")
    print(num1)
    num2 = eval("x+y",globals())
    print(num2)
    num3 = eval("x+y",locals(),globals())
    print(num3) #结果为2,搞不懂
    num4 = eval("x+y", globals(), locals())
    print(num4) #结果为4,搞不懂

test_eval()

结果:

4
2
2
4

  

     python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print (locals())来查看该函数体内的所有变量名和变量值。

x =1
y =1

def call_xy():
    x = 2
    y =2

    print(locals()["x"])
    print(locals()["y"])
    print(globals()["x"])
    print(globals()["y"])

call_xy()

  结果:

2
2
1
1

  locals()对象的值不能修改,globals()对象的值可以修改

z=0
def f():
    z = 1
    print (locals())
    locals()["z"] = 2
    print (locals())
f()
globals()["z"] = 2
print (z)

  返回结果:

{'z': 1}
{'z': 1}
2

  3、存在安全问题

 

posted @ 2019-06-08 10:33  小马的那片海  阅读(252)  评论(0)    收藏  举报