zoukankan      html  css  js  c++  java
  • Python 定义动态变量

    问题描述

    在做数据处理时,对一些分组得来的数据,所做的操作大同小异,变量的命名也都拥有相同的结构,比如对每个月份的数据求均值、方差等统计量,变量的命名可取为“n月的均值”,“n月的方差”,抽象出来就是“n月的 'm统计量' ”

    在编程实现的时候,对上述变量的定义以及引用,都可以一同实现,从而减少了重复代码的数量

    实现的时候遇到了动态定义变量的问题,这里总结一下


    利用 exec 动态定义变量

    我们可以如此动态定义变量

     for n in range(1, 13):
         exec('month_{} = {}'.format(n, value or expression))

    一般这种语句都可以正确定义变量,但有时上述语句会出错,比如后方传入的expression返回一个 DataFrameGroupBy 类变量时,会出现语法错误

      File "<string>", line 1
        month_12 = <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001F40E46E160>
                   ^
    SyntaxError: invalid syntax

    原因未明...经过搜索,我发现还有另一种定义方法,可以解决上述问题

    for n in range(1, 13):
         exec('month_{} = temp'.format(n), {'temp': expression})

    这种方法有两个问题:

      1、利用format替换的部分需在变量名的最后方,例 month_{} ,方可执行成功,而 {}_month 便不可行,原因待查...还请各位同学指点!

    File "<string>", line 1
        12_month = temp
          ^
    SyntaxError: invalid token

      2、这种方法定义的变量,只在 exec 中有效,在 exec 语句外便无效,这或许是因为python将 exec 中复杂的指令当做了局部变量,可以在利用以下语句检验

    for n in range(1, 13):
         exec('month_{} = temp\nprint(locals()==globals())'.format(n), {'temp': expression})

    其中locals()与globals()是python的内部方法,它们提供了基于字典的访问局部与全局变量的方式。

    如果返回 True ,说明当前环境处于全局级别,在 exec 中的语句可以在  exec 外生效

    如果返回 False ,说明当期环境处于局部级别,定义的变量被看做局部变量,所以不能在 exec 外调用,可以在语句中传入globals()使其在全局生效

    for n in range(1, 13):
         exec('month_{} = temp'.format(n), {'temp': expression}, globals())

     exec 方式太容易混乱,还有另外一种动态定义变量的方法,便是上文提到的globals()与locals()方法

    利用命名空间动态定义变量

    首先创建locals()的副本

    varDict = locals()

    对于上文提到的变量便可如此定义

    for n in range(1, 13):
        varDict['month_'+str(n)] = value or expression

    这种方法创建的变量不会出现第一种方法中语法错误与变量作用域的错误,推荐!

  • 相关阅读:
    POJ 2299 UltraQuickSort(求逆序数,归并排序或者离散化+树状数组)
    HDU 4349 Xiao Ming's Hope(数学题)
    HDU 2222 Keywords Search(AC自动机的入门题)
    HDU 4341 Gold miner(分组的背包问题)
    HDU 2825 Wireless Password(AC自动机+状态压缩DP)
    POJ 2352 Stars(树状数组)
    HDU 4342 History repeat itself(数学规律)
    HDU 4345 Permutation(数学题,记忆化搜索)
    HDU 3247 Resource Archiver(AC自动机+状态压缩DP)
    RFC
  • 原文地址:https://www.cnblogs.com/ech2o/p/11846069.html
Copyright © 2011-2022 走看看