《python 与数据挖掘 》一 3.4 作用域

简介:

本节书摘来自华章出版社《python 与数据挖掘 》一书中的第3章,第3.4节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 作用域

Python在创建、改变或查找变量名时都是在命名空间中进行的,更准确地说,是在特定作用域下进行的。所以我们需要使用某个变量名时,应清晰地知道其作用域。由于Python不能声明变量,所以变量第一次被赋值的时候已经与一个特定作用域绑定了。更通俗地说,在代码中给一个变量赋值的地方决定了这个变量将存在于哪个作用域,它可见的位置在哪里。
首先举一个函数的例子,如果有这样的函数:


def defin_x():
    x = 2
然后执行命令:
>>> x = 1
>>>defin_x()
>>>print x
>>>1

执行函数defin_x后函数外的x的值没有变化。这是因为整段程序中存在两个x,起初在函数体外创建了一个x,接着执行defin_x()时又在函数内部创建了一个新的x和一个新的命名空间。第二个x的作用域是defin_x()函数的内部代码块,赋值语句x = 2仅在局部作用域(即函数内部)起作用。所以它不会使得函数外的x发生改变。我们把函数内的变量称为局部变量(Local Variable),而在主程序中的变量称为全局变量(Global Variable)。在函数内部是可以访问到全局变量的:

def print_x():
    print x
>>>x = 1
>>>print_x()
>>>1

程序没有发生报错并正确返回了1,所以在函数内部同样可以使用全局变量。
通过前面的例子我们已经知道,函数内既可访问局部变量也可访问全局变量。如果局部变量和全局变量出现重名,那最终会访问哪一个呢?实际上,第一个例子已经说明了这个问题,在局部作用域中,如果全局变量与局部变量重名,那么全局变量会被局部变量屏蔽。如果想访问全局变量,可以使用globals函数:

def print_x():
    x = 2
    print  globals()['x']
>>> x = 1
>>>print_x()
>>>1
再考虑另一个方向的问题:我们如何在函数内创建全局变量呢?可以使用global进行声明:
def defin_x():
    global x
    x = 2
>>>x = 1
>>>defin_x()
>>>print x
>>>2

函数内部使用global声明了变量名x的作用域是全局的,因而程序访问的是全局变量x。虽然global似乎很好用,但我建议程序中尽量少用global,它会使代码变得混乱,可读性变差。相反,局部变量会使代码更加抽象,封装性更好。一个好的函数只有输入和输出能够和函数外的程序进行联系。

相关文章
|
4天前
|
数据可视化 数据挖掘 Python
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(下)
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化
12 0
|
4天前
|
数据可视化 API 开发者
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(上)
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化
16 0
|
4天前
|
机器学习/深度学习 数据可视化 安全
Python随机森林、线性回归对COVID-19疫情、汇率数据预测死亡率、病例数、失业率影响可视化(下)
Python随机森林、线性回归对COVID-19疫情、汇率数据预测死亡率、病例数、失业率影响可视化
14 1
|
4天前
|
机器学习/深度学习 数据可视化 Python
Python随机森林、线性回归对COVID-19疫情、汇率数据预测死亡率、病例数、失业率影响可视化(上)
Python随机森林、线性回归对COVID-19疫情、汇率数据预测死亡率、病例数、失业率影响可视化
19 0
|
4天前
|
机器学习/深度学习 存储 数据采集
【Python 机器学习专栏】PCA(主成分分析)在数据降维中的应用
【4月更文挑战第30天】本文探讨了主成分分析(PCA)在高维数据降维中的应用。PCA通过线性变换找到最大化方差的主成分,从而降低数据维度,简化存储和计算,同时去除噪声。文章介绍了PCA的基本原理、步骤,强调了PCA在数据降维、可视化和特征提取上的优势,并提供了Python实现示例。PCA广泛应用在图像压缩、机器学习和数据分析等领域,但降维后可能损失解释性,需注意选择合适主成分数量及数据预处理。
|
4天前
|
vr&ar Python
Python自激励阈值自回归(SETAR)、ARMA、BDS检验、预测分析太阳黑子时间序列数据
Python自激励阈值自回归(SETAR)、ARMA、BDS检验、预测分析太阳黑子时间序列数据
11 0
|
4天前
|
Python
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据|数据分享
10 0
|
4天前
|
机器学习/深度学习 Python
【Python机器学习专栏】时间序列数据的特征工程
【4月更文挑战第30天】本文探讨了时间序列数据的特征工程,强调其在捕捉季节性、揭示趋势、处理异常值和提升模型性能中的重要性。介绍了滞后特征、移动窗口统计特征、时间戳特征、频域特征和波动率特征等方法,并提供了Python实现示例。通过有效特征工程,可提高时间序列分析的准确性和预测可靠性。
|
4天前
|
机器学习/深度学习 计算机视觉 Python
【Python 机器学习专栏】图像数据的特征提取与预处理
【4月更文挑战第30天】本文探讨了图像数据的特征提取与预处理在机器学习中的重要性。图像数据具有大容量、信息丰富和冗余性高的特点。特征提取涉及颜色、纹理和形状特征;预处理包括图像增强、去噪和分割。Python的OpenCV和Scikit-image库在处理这些任务时非常有用。常见的特征提取方法有统计、变换和基于模型的方法,而预处理应注意保持图像真实性、适应性调整及验证评估。有效的特征提取和预处理能提升模型性能,Python工具使其更高效。
|
4天前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习专栏】文本数据的特征提取与表示
【4月更文挑战第30天】本文探讨了文本特征提取与表示在机器学习和NLP中的重要性。介绍了词袋模型、TF-IDF和n-gram等特征提取方法,以及稀疏向量和词嵌入等表示方式。Python中可利用sklearn和gensim库实现这些技术。有效的特征提取与表示有助于将文本数据转化为可处理的数值形式,推动NLP和机器学习领域的进步。