python的一些小问题

1. 如何动态生成变量名?

Q:lst = [‘A’, ‘B’, ‘C’, ‘D’] , 如何才能得到以 list 中元素命名的新列表 A = [], B = [], C = [], D = []呢?

  • 方法一: 动态进行变量赋值,通过修改命名空间植入变量
    1
    2
    >>> for i in lst:
    >>> globals()[i] = []
  • 方法二:动态执行代码
    1
    2
    >>>for i in lst:
    >>> exec(f"{i}=[]")
    备注:locals()实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。

    2. 命名空间

    Q:from module import 和 import module 之间的不同?
    使用 import module,模块自身被导入,但是它保持着自已的名字空间,这就是为什么您需要使用模块名来访问它的函数或属性: module.function 的原因。但是使用 from module import,实际上是从另一个模块中将指定的函数和属性导入到您自己的名字空间,

    3. 星号表达式

    Q:星号表达式的试用场景?
  • 参数传递
    1
    2
    3
    4
    def fun1(*args, **kwargs):
    print(args, kwargs)
    # * 会将传入的参数放入名为args的元组中
    # ** 会将传入的参数放入名为kwargs的字典中
  • unpack可迭代变量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 赋值语句中的 * 用于列表数值取出
    >>> a, *b, c = range(5)
    >>> a
    0
    >>> c
    4
    >>> b
    [1, 2, 3]
    # 用于递归求和
    def sum(items):
    head, *tail = items
    return head + sum(tail) if tail else head
    注意:*表达式不可单独使用!