[Python3] 020 借函数,谈一谈变量的作用域
1. 概述
- 从“变量作用域”这个词不难看出:变量有作用范围限制
2. 分类
- 按照作用域分类
- 全局(global):在函数外部定义
- 局部(local):在函数内部定义
3. 变量的作用范围
- 全局变量:在整个全局范围都有效
- 全局变量在局部可以使用(即,在函数内部可以使用在函数外部定义的变量)
- 局部变量:仅在特定的局部范围内有效
- 局部变量在出了自己的范围后就无法使用
- LEGB 原则
- L(Local)局部作用域
- E(Enclosing function locale)外部嵌套函数作用域
- G(Global module)函数定义所在模块作用域
- B(Builtin):python 内置模块的作用域
- LEGB 规定了查找一个名称的顺序为:local-->enclosing function locals-->global-->builtin
少废话,上例子
# 例1
num1 = 100 # 全局变量
def func():
print("num1 =", num1)
num2 = 99 # 局部变量
print("num2 =", num2)
return None
print("num1 =", num1)
func()
print("num2 =", num2)
- 运行结果
num1 = 100
num1 = 100
num2 = 99---------------------------------------------------------------------------
NameError……name 'num2' is not defined
4. 将局部变量提升为全局变量
- 使用 global
少废话,上例子
# 例2
def func():
global num1
num1 = 100
print("num1 =", num1)
num2 = 99
print("num2 =", num2)
return None
func()
print("num1 =", num1)
- 运行结果
num1 = 100
num2 = 99
num1 = 100
5. 内建函数 globals() 与 locals()
- 通过 globals() 和 locals() 可以显示出全局变量和局部变量
少废话,上例子
# 例3
num1 = 1
num2 = 2
def func(n1, n2):
n3 = 666
print("Local s= {0}".format(locals()))
print("Globals = {0}".format(globals()))
return None
func(11, 22)
- 运行结果
Locals = {'n1': 11, 'n2': 22, 'n3': 666}
Globals = {'name': 'main', 'doc': None, 'package': None, 'loader': <_frozen_importlib_external.SourceFileLoader object at 0x000001C21D86E940>, 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>, 'file': '.\globals & locals.py', 'cached': None, 'num1': 1, 'num2': 2, 'func': <function func at 0x000001C21D82C2F0>}
6. 邪恶的 eval() 与 执行者 exec()
(1) eval()
- 把一个字符串当成一个表达式来执行, 返回表达式执行后的结果
- 示例
# 例4 eval(string_code, globals=None, locals=None)
num1 = 100
num2 = 200
num3 = num1 + num2
num4 = eval("num1+num2")
print(num3)
print(num4)
- 运行结果
300
300
(2) exec()
- 跟 eval() 功能类似, 但 exec() 不返回结果
- 示例
# 例5 exec(string_code, globals=None, locals=None)
num1 = 100
num2 = 200
num3 = num1 + num2
num4 = exec("print('num1 + num2 =', num1+num2)")
print(num3)
print(num4)
- 运行结果
num1 + num2 = 300
300
None
7. 递归函数
(1) 概述
- 简单地说,就是“我调用我自己”
- 优点:简洁,容易理解
- 缺点:对递归深度有限制,消耗资源大
- python 对递归深度有限制,超过限制报错
- 也可以手动更改递归深度
- 写递归程序时,要注意结束条件
(2) 少废话,上例子
# 例6 错误示范
num = 0
def func(): # 会暴走的
global num
num += 1
print(num)
func() # 调用自己
return None
func()
- 运行结果
先是像 excel 一样,纵向数字累加,然后抛出异常。
RecursionError……maximum recursion depth exceeded while calling a Python object
递归错误:调用 python 对象时超过了最大递归深度。
# 例7 斐波那契额数列
# 数学公式为: f(1) = 1, f(2) = 1, ... f(n) = f(n-1) + f(n-2)
def fib(n): # n 表示斐波那契数列的第 n 个数
if n == 1 or n ==2: # or 表示或者
return 1
return fib(n-1) + fib(n-2)
print(fib(10))
- 运行结果
55
[Python3] 020 借函数,谈一谈变量的作用域的更多相关文章
- 『无为则无心』Python函数 — 30、Python变量的作用域
目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作 ...
- C++拷贝函数的小结,关于变量的作用域等---ShinePans
#include <iostream> using namespace std; class circle { private: double r0; public: circle(dou ...
- Python 学习 第七篇:函数1(定义、调用和变量的作用域)
函数是把一些语句集合在一起的程序结构,用于把复杂的流程细分成不同的组件,能够减少代码的冗余.代码的复用和修改代码的代价. 函数可以0个.1个或多个参数,向函数传递参数,可以控制函数的流程.函数还可以返 ...
- 转: 谈JAVA_OPTS环境变量不起作用
谈JAVA_OPTS环境变量不起作用 2016-6-14 11:12 最近在处理运行一个java应用时,老是出现java.lang.OutOfMemoryError: Java heap space. ...
- python3 速查参考- python基础 6 -> 函数编程之参数、变量、作用域、递归、匿名函数 lambda
函数基础 1. 速查笔记 #-- 函数相关的语句和表达式 myfunc('spam') # 函数调用 def myfunc(): # 函数定义 return None # 函数返回值 global a ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- python3内置函数大全(顺序排列)
python3内置函数大全 内置函数 (1)abs(), 绝对值或复数的模 1 print(abs(-6))#>>>>6 (2)all() 接受一个迭代器,如果迭代器的所有 ...
- python3内置函数大全
由于面试的时候有时候会问到python的几个基本内置函数,由于记不太清,就比较难受,于是呕心沥血总结了一下python3的基本内置函数 Github源码: https://github. ...
- python3入门之函数
相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...
随机推荐
- 2019 ACM/ICPC 全国邀请赛(西安)J And And And (树DP+贡献计算)
Then n - 1n−1 lines follow. ii-th line contains two integers f_{a_i}(1 \le f_{a_i} < i)fai(1≤fa ...
- socket客户端怎么判断http响应数据的结束
前言 原文地址:https://blog.csdn.net/nimasike/article/details/81122784 http连接 短连接 定义:http头不包含Connection: Ke ...
- DevExpress v18.2版本亮点——Office File API 篇
行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Office File API v18.2 的版本亮点,新版30天免费试用!点击下载> ...
- Django【第24篇】:JS实现的ajax和同源策略
JS实现的ajax和同源策略 一.回顾jQuery实现的ajax 首先说一下ajax的优缺点 优点: AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器 ...
- 【bzoj4552】【Tjoi2016&Heoi2016】【NOIP2016模拟7.12】排序
题目 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次 ...
- Spring read-only="true" 只读事务的一些概念
概念:从这一点设置的时间点开始(时间点a)到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!(查询中不会出现别人在时间点a之后提交的数据) 应用场合: 如果你一次执行单条查询语句,则没有必 ...
- POJ 1742 Coins ( 经典多重部分和问题 && DP || 多重背包 )
题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法. 如果之前有接触过背包DP的可以自然想到 ...
- 6.20校内考试整理——大美江湖&&腐草为萤&&锦鲤抄题解
先安利一下题目作者:一扶苏一 先看第一题: 这道题就是一道简单的模拟题,只要不管一开始的位置,模拟移动与格子对应的触发事件就行了.话不多说,看代码: #include<iostream> ...
- LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)
传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...
- abc136
第一次打ABC 题目简单,但我菜 E - Max GCD 可以任选两个数,一个减去1,一个加上1,可以操作$0,\cdots,K$次,求操作后数组最大GCD 枚举数组之和的因子,试图找到符合题意的最大 ...