Python 五点搞定作用域
转: http://www.pythontab.com/html/2016/pythonjichu_0908/1063.html
1、块级作用域
想想此时运行下面的程序会有输出吗?执行会成功吗?
1
2
3
4
5
6
7
8
9
10
11
12
|
#块级作用域
if 1 = = 1 :
name = "lzl"
print (name)
for i in range ( 10 ):
age = i
print (age)
|
我们先看下执行结果
1
2
3
|
C: /Users/L/PycharmProjects/s14/preview/Day8/ 作用域 /main .py
lzl
9
|
Process finished with exit code 0
代码执行成功,没有问题;在Java/C#中,执行上面的代码会提示name,age没有定义,而在Python中可以执行成功,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;
2、局部作用域
回顾之前学过的知识,我们学函数的时候,函数是个单独的作用域,Python中没有块级作用域,但是有局部作用域;看看下面的代码
#局部作用域
1
2
3
4
|
def func():
name = "lzl"
print (name)
|
运行这段代码,想想会不会有输出?
1
2
3
4
|
Traceback (most recent call last):
File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py" , line 23, in <module>
print(name)
NameError: name 'name' is not defined
|
运行报错,我相信这个大家都能理解,name变量只在func()函数内部中生效,所以在全局中是没法调用的;对上面代码做个简单调整,再看看结果如何?
1
2
3
4
5
6
7
|
#局部作用域
def func():
name = "lzl"
func() #执行函数
print (name)
|
对之前的代码添加了一句代码,在变量name打印之前,执行了一下函数,此时打印会不会有变化?
1
2
3
4
|
Traceback (most recent call last):
File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py" , line 23, in <module>
print(name)
NameError: name 'name' is not defined
|
执行依然报错,还是回到刚才那句话:即使执行了一下函数,name的作用域也只是在函数内部,外部依然无法进行调用;把前两个知识点记住,接下来要开始放大招了
3、作用域链
对函数做下调整,看看下面的代码执行结果如何?
1
2
3
4
5
6
7
8
9
10
|
#作用域链
name = "lzl"
def f1():
name = "Eric"
def f2():
name = "Snor"
print (name)
f2()
f1()
|
学过函数,肯定知道最后f1()执行完会输出Snor;我们先记住一个概念,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
4、终极版作用域
好,铺垫了够了,终极版的来了~~
1
2
3
4
5
6
7
8
9
10
11
12
|
#终极版作用域
name = "lzl"
def f1():
print (name)
def f2():
name = "eric"
f1()
f2()
|
想想最后f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#终极版作用域
name = "lzl"
def f1():
print (name)
def f2():
name = "eric"
return f1
ret = f2()
ret()
#输出:lzl
|
执行结果为“lzl”,分析下上面的代码,f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,name=“lzl”与f1()在一个作用域链,函数内部没有变量是会向外找,所以此时变量name值为“lzl”;理解了这个,那么刚才没给出答案的那个终极代码你也知道答案了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#终极版作用域
name = "lzl"
def f1():
print (name)
def f2():
name = "eric"
f1()
f2()
# 输出:lzl
|
是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了
5、新浪面试题
1
|
li = [ lambda :x for x in range ( 10 )]
|
判断下li的类型?li里面的元素为什么类型?
1
2
3
4
5
|
print ( type (li))
print ( type (li[ 0 ]))
# <class 'list'>
# <class 'function'>
|
可以看到li为列表类型,list里面的元素为函数,那么打印list里面第一个元素的返回值,此时返回值为多少?
1
2
3
4
5
6
7
8
|
#lambada 面试题
li = [ lambda :x for x in range ( 10 )]
res = li[ 0 ]()
print (res)
#输出:9
|
li第一个函数的返回值为9还不是0,记住:函数在没有执行前,内部代码不执行;博客里面的代码可以自己练练,加深下印象
Python 五点搞定作用域相关推荐
- python内置作用域_python内置金融数据Python 五点搞定作用域
1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗?#块级作用域 if 1 == 1: name = "lzl" print(name) for i in range( ...
- python pdf转word 表格_太赞了!Pdf转Word,我用Python 轻松搞定表格和水印!
原标题:太赞了!Pdf转Word,我用Python 轻松搞定表格和水印! 继上一次为大家推出了将pdf转word之后(卧槽!Pdf转Word用Python轻松搞定!),引起了大家的热烈讨论,我也总结了 ...
- 再见PDF提取收费!我用100行Python代码搞定!
点上方"菜鸟学Python",选择"星标" 第471篇原创干货,第一时间送达 大家在日常的工作和学习过程中,都少不了与PDF文件打交道,很多的小伙伴都面临着将P ...
- About 一行Python代码搞定局域网内文件共享与传输
一行Python代码搞定局域网内文件共享与传输 前提:环境中有Python安装,并配置环境变量. 1.共享目录:Windows下,在要共享文件目录下,shift+鼠标右键,在此处打开命令行窗口(CMD ...
- 女朋友让我深夜十二点催她睡觉,我用Python轻松搞定!
事情是这样的:昨天晚上,女朋友让我十二点催她睡觉. 不过,可是我实在太困了,熬不下去-- 是吧?女朋友哪有睡觉重要? 但,女朋友的命令,我是不敢违抗的-- 但是睡觉也不能缺! 这时候我们该怎么办呢?是 ...
- 神器!用Python轻松搞定验证码!
转自:大邓和他的Python 大家好,今天给大家介绍一款通用验证码识别OCR库的神器,项目地址:https://github.com/sml2h3/ddddocr.市场上常见的点选类验证码图片如下图所 ...
- python 训练识别验证码_用Python机器学习搞定验证码
原标题:用Python机器学习搞定验证码 写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字.字母的组合,国内也 ...
- [python]一行搞定字符串排序
[python]一行搞定字符串排序 本文最初发表于恋花蝶的博客(http://blog.csdn.net/lanphaday),欢迎转载,但请保留本声明. 一般情况下,python中对一个字符串排序相 ...
- 60行Python代码搞定,王者荣耀雷达图!
点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 现有以下表格,我需要画成第二张图中的雷达图(类似fifa足球.王者荣耀里面 ...
最新文章
- python 多线程和协程结合_一文讲透 “进程、线程、协程”
- 【最新】南京大学人工智能学院《模式识别》课程PPT
- table 锁定表头
- BZOJ 1269: [AHOI2006]文本编辑器editor Splay
- 子类怎么继承父类方法中的变量_JavaOOP_04 封装 继承
- msys2软件包管理工具pacman常用命令
- db2如何锁定一张表_DB2数据库为单个会话锁定的技巧
- 字典的增删改查 daty 5
- Visual Studio 最常用的13个快捷键
- C++语音识别接口快速入门(Microsoft Speech SDK)
- ubuntu下安装万能五笔
- 固态硬盘安装Win7双系统
- 曾经排名第一的安全软件,为啥会变成流氓软件?
- Cocos Creator:高效率内容生产,引领全平台制霸!
- 根据ID从FASTA文件中批量提取序列【Python】
- 【Python课程作业】食物数据的爬取及分析(详细介绍及分析)
- Pandas 元素选取
- DevEco IDE 华为全系列远程真机免费调测
- iOS 支付宝集成随手记
- Go并发编程--通过channel实现流水线作业模型