作用域

Python变量的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

nonlocal and global

global关键字用于声明变量为全局变量,这样在函数或方法内部对变量的修改将影响到全局作用域中的变量。相反,nonlocal关键字用于声明变量为上级函数中的局部变量,这样在嵌套函数内部对变量的修改将影响到上级函数中的同名局部变量,而不是全局变量。

Example

str = 'global'
def func1():
    print(str)    #global, 局部找不到, 全局中找
func1()
print(str)    #global,全局中找

str = 'global'
def func1():
    str = "xyz"    
    print(str)    #xyz, 局部定义了,和全局不是一个变量
func1()
print(str)    #global,全局中找

str = 'global'
def func1():
    global str
    str = "xyz"
    print(str)  #xyz, 局部强制引入了全局变量,修改后会直接修改全部变量
func1()
print(str)    #xyz,全局中找,被func1函数修改了变量值

sys._getframe().f_code.co_name

获取当前函数名

绝对导入 import module_name 该方法不建议在同目录下导入使用

即import后直接接模块名。在这种情况下,Python会在两个地方寻找这个模块:

  1. 第一是sys.path(通过运行代码import sys; print(sys.path)查看),os这个模块所在的目录就在列表sys.path中,一般安装的Python库的目录都可以在sys.path中找到(前提是要将Python的安装目录添加到电脑的环境变量),所以对于安装好的库,我们直接import即可。
  2. 第二个地方就是运行文件(这里是m1.py)所在的目录,因为m2.py和运行文件在同一目录下,所以上述写法没有问题。

from import 同目录下导入建议用该方法

  • from . import module_name。导入和自己同目录下的模块。
  • from .package_name import module_name。导入和自己同目录的包的模块。
  • from .. import module_name。导入上级目录的模块。
  • from ..package_name import module_name。导入位于上级目录下的包的模块。
  • 当然还可以有更多的.,每多一个点就多往上一层目录。

      //m1.py
      import m2
      from Branch.Child import m3
      m2.printSelf()
      m3.printSelf()
    
      //m3.py
      from . import m4
      def printSelf():
          print('In m3')
          m4.printSelf()
    
      Tree
      |____ m1.py
      |____ m2.py
      |____ Branch
          |____ Child
              |____m3.py
              |____m4.py
    

相对导入和绝对导入

绝对导入: import m2 和 from Branch import m3 相对导入:from . import m4

获取所有模块列表

help('modules') //获取所有模块
sys.modules.keys() //获取已加载的模块

python & pythonw

Windows系统搭建好Python的环境后,进入Python的安装目录,大家会发现目录中有python.exe和pythonw.exe两个程序。

  • python.exe在运行程序的时候,会弹出一个黑色的控制台窗口(也叫命令行窗口、DOS/CMD窗口);
  • pythonw.exe是无窗口的Python可执行程序,意思是在运行程序的时候,没有窗口,代码在后台执行
  • .py和.pyw文件的区别也来源于python.exe和pythonw.exe的区别:
  • 安装视窗版 Python 时,扩展名为 .py 的文件被默认为用 python.exe 运行的文件,而 .pyw文件则被默认为用 pythonw.exe 运行。
  • 如果.py文件直接用python.exe打开,文件被执行完成之后,视窗会立即关闭,如果想让视窗停留;给大家提供两个方法:
    • 可以在程序中import time模块,加入超长睡眠语句,如time.sleep(1800),如果你不手动关闭视窗,视窗将会停留30min;
    • 可以调用sys和os模块,使用命令行语句pause
  • .pyw格式是被设计用来运行开发的纯图形界面程序的,纯图形界面程序的用户不需要看到控制台窗口。在开发纯图形界面程序的时候,可以暂时把 .pyw 改成 .py ,运行时能调出控制台窗口,方便看到所有错误信息。
  • .pyc文件,是Python解释器运行程序的过程中产生的字节码文件(也就是中间文件)。
  • 在你 import 别的 py 文件时,那个 py 文件会被存一份 pyc 加速下次装载。而主文件因为只需要装载一次就没有存 pyc,你可以写两个 a.py 和 b.py,一个 import 另一个试试就会产生pyc文件。

添加路径到搜索路径

import sys
sys.path.append('C:\\Users\\CNMIZHU7\\Source\\repos\\UtilityTools\\PMTWUserScript')