zoukankan      html  css  js  c++  java
  • python表达式和语句,exec和ecal

    一,基本概念

    Python代码由表达式和语句组成,并由Python解释器负责执行。它们的主要区别是“表达式”是一个值,它的结果一定是一个Python对象。当Python解释器计算它时结果可以是任何对象。例如42,1+2,int(‘123’),range(10)等。
    表达式:赋值,是什么,产生结果,表达式的结果是值,对象 用eval语句(变量名,值,运算符,)
    语句: 做事流程,干什么, 语句是控制程序走向,不产生值,

    常见的Python表达式操作符有

    算术运算符: x+y, x-y, x / y, x*y, x // y, x%y
    比较运算符:x>y, x<y, x>=y, x<=y, x==y, x!=y
    逻辑运算符: x or y, x and y, not x
    成员关系运算:x in y, x not in y
    对象实例测试:x is y, x not is y
    位运算:x & y, x | y, x ^ y, x<<y, x>>y 等。

    结果不是对象的代码则成为‘语句’。它们表示的是一个动作而不是生成或者返回一个值, 语句是控制程序走向,不产生值。
    常见的Python语句有:赋值语句a='a'
    调用函数
    print:打印对象
    if/elif/else:条件判断
    for/else:序列迭代
    while/else:普通循环
    pass:占位符
    break
    continue
    def
    return
    yield
    global
    raise:手动触发异常
    import
    from:模块属性访问 等。

    二, exec与eval的主要区别

    ** Exec与Eval语句的主要区别是,exec处理字符串里面的代码,无论代码返回什么统一返回None,能执行长的复杂的代码,
    而eval是处理字符串里面的表达式,简单的加减乘除返回运算结果,无法执行长的python代码。**

    In [20]: eval("9+10")
    Out[20]: 19
    
    In [21]: exec('9+10')
    
    In [22]: print(exec('9+10'))
    None
    In [29]: res1 = eval('1+2+3')
        ...: res2 = exec('1+2+3')
        ...: print('res1_eval', res1, 'res2_exec', res2)
    res1_eval 6 res2_exec None
    
    In [30]: 
    

    执行复杂代码

    code = '''
    def foo():
        print ('run foo')
        return 1234
    foo()
        '''
    
    In [23]: code = '''
        ...: def foo():
        ...:     print ('run foo')
        ...:     return 1234
        ...: foo()
        ...:     '''
    
    In [24]: code
    Out[24]: "
    def foo():
        print ('run foo')
        return 1234
    foo()
        "
    
    In [25]: exec_code= exec(code)
    run foo
    
    In [26]: exec_code
    
    In [27]: eval_code= eval(code)
    Traceback (most recent call last):
    
    
    source_code = '''
    import time
    def test_func():
        for n in (10,):
        #for n in (100,200,300):
            data = b'x'*n
            start = time.time()
            b = data
            print('data: ',data)
            while b:
                b = b[1:]
                print('b: ',b)
            print('bytes', n, time.time()-start)
        return '124'
    test_func()
    '''
    res1 = exec(source_code)
    print('res1', res1)
    输出结果
    data:  b'xxxxxxxxxx'
    b:  b'xxxxxxxxx'
    b:  b'xxxxxxxx'
    b:  b'xxxxxxx'
    b:  b'xxxxxx'
    b:  b'xxxxx'
    b:  b'xxxx'
    b:  b'xxx'
    b:  b'xx'
    b:  b'x'
    b:  b''
    bytes 10 0.0
    res1 None
    

    三, eval() 函数

    eval(source, globals=None, local=None) 作用: 把一个字符串当成一个表达式来执行,返回表达式执行的结果

    
    x = 100
    y = 200
    s = "x + y"
    a = eval(s)
    print('a1', a)
    ls = {"x": 1, "y": 2}
    a = eval(s, None, ls)
    print('a2',a)
    gs = {'x': 11, 'y': 21}
    a = eval("x+y", gs, None)
    print('a3',a)
    a = eval("x+y", gs, ls)
    print('a4',a)
    # 输出内容:
    a1 300
    a2 3
    a3 32
    a4 3
    

    四 exec()函数

    exec(source, globals=None, local=None) 作用:把一个字符串当成程序来执行,动作,流程

    x = 100
    y = 200
    s = "print('hello:', x, y)"
    gd = {'x': 10, 'y':20}
    ld = {'x': 1, 'y':2}
    exec(s)
    exec(s, gd, ld)
    exec(s, gd)
    exec(s, None, ld)
    # 输出内容
    hello: 100 200
    hello: 1 2
    hello: 10 20
    hello: 1 2
    

    转自:https://www.cnblogs.com/yangmingxianshen/p/7810496.html

    1.eval函数

    函数的作用:
    计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。
    eval(source, globals=None, locals=None, /)

    参数说明:
    source:必选参数,可以是字符串,也可以是一个任意的code(代码)对象实例(可以通过complie函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)python表达式进行分析和解释。

    globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。

    locals:可选参数,表示局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果参数被忽略,那么它将会取与globals相同的值。

    如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。

    返回值:
    如果source是一个code对象,且创建该code对象时,complie函数的mode参数是‘exec’,那么eval()函数的返回值是None;
    否则,如果source是一个输出语句,如print(),则eval()返回结果为None;
    否则,source表达式的结果就是eval()函数的返回值
    实例:

    x = 10
    def func():
        y = 20   #局部变量y
        a = eval("x+y")
        print("a:",a)      #x没有就调用全局变量
        b = eval("x+y",{"x":1,"y":2})     #定义局部变量,优先调用
        print("b:",b)
        c = eval("x+y",{"x":1,"y":2},{"y":3,"z":4})  
        print("c:",c)  
        d = eval("print(x,y)")
        print("d:",d)   #对于变量d,因为print()函数不是一个计算表达式,因此没有返回值
    func()
    

    输出结果:

    a: 30
    b: 3
    c: 4
    10 20
    d: None
    

    2.exec函数

    函数的作用:
    动态执行python代码。也就是说exec可以执行复杂的python代码,而不像eval函数那样只能计算一个表达式的值。
    exec(source, globals=None, locals=None, /)
    source:必选参数,表示需要被指定的python代码。它必须是字符串或code对象。如果source是一个字符串,该字符串会先被解析为一组python语句,然后执行。如果source是一个code对象,那么它只是被简单的执行。
    返回值: exec函数的返回值永远为None。
    eval()函数和exec()函数的区别:
    eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
    eval()函数可以有返回值,而exec()函数返回值永远为None。
    示例1:

    x = 10
    def func():
        y = 20
        a = exec("x+y")
        print("a:",a)
        b = exec("x+y",{"x":1,"y":2})
        print("b:",b)
        c = exec("x+y",{"x":1,"y":2},{"y":3,"z":4})
        print("c:",c)
        d = exec("print(x,y)")
        print("d:",d)
    func()
    

    执行结果:

    #exec不会有任何返回值
    a: None   
    b: None
    c: None
    10 20
    d: None
    

    示例2

    x = 10
    expr = """
    z = 30
    print(x,y,z)
    """
    def func():
        y = 20
        exec(expr)
        exec(expr,{'x':1,'y':2})
        exec(expr,{'x':1,'y':2,'z':10},{'x':50,'z':4}) # x是定义全局变量1,y是局部变量
        exec(expr,{'x':1,'y':2,'z':10},{'x':50,'y':3,'z':4}) # x是定义全局变量1,y是局部变量
    func()
    

    执行结果:

    10 20 30
    1 2 30
    50 2 30
    50 3 30
    
    • eval()函数和exec()函数的区别:
    • eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
    • eval()函数可以有返回值,而exec()函数返回值永远为None。

    3.complie函数

    函数的作用:

    compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

    参数说明:
    source:字符串或AST对象,表示需要进行编译的python代码
    filename:指定需要编译的代码文件,如果不是文件读取代码则传递一些可辨认的值。
    mode:用于标识必须当做那类代表来编译;如果source是由一个代码语句序列组成,则指定mode=‘exec’,
    如果source由单个表达式组成,则指定mode=‘eval’;如果source是由一个单独的交互式语句组成,
    则指定modo=‘single’。必须要制定,不然肯定会报错。
    代码示例1:

    s = """              #一大段代码
    for x in range(10):
        print(x, end='')  
    print()
    """
    code_exec = compile(s, '<string>', 'exec')   #必须要指定mode,指定错了和不指定就会报错。
    code_eval = compile('10 + 20', '<string>', 'eval')   #单个表达式
    code_single = compile('name = input("Input Your Name: ")', '<string>', 'single')   #交互式
    
    a = exec(code_exec)   使用的exec,因此没有返回值
    b = eval(code_eval)  
    
    c = exec(code_single)  交互
    d = eval(code_single)
    
    print('a: ', a)
    print('b: ', b)
    print('c: ', c)
    print('name: ', name)
    print('d: ', d)
    print('name; ', name)
    

    执行结果:

    0123456789  #有print就会打印
    Input Your Name: kebi
    Input Your Name: kebi
    a:  None
    b:  30
    c:  None
    name:  kebi
    d:  None
    name;  kebi
    
    写入自己的博客中才能记得长久
  • 相关阅读:
    pip错误:'utf-8' codec can't decode byte解决方法
    windows中python2与python3共存
    Alpha 冲刺 (3/10)
    Alpha 冲刺 (2/10)
    Alpha 冲刺 (1/10)
    项目需求分析报告答辩总结
    项目选题报告答辩总结
    项目UML设计(团队)
    # 第七次作业--项目需求分析(团队)
    结对项目--第二次作业
  • 原文地址:https://www.cnblogs.com/heris/p/14023509.html
Copyright © 2011-2022 走看看