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、存在安全问题

浙公网安备 33010602011771号