友情提示:这节内容比较多
-
一键理解 局部变量 和 全局变量
有时候,我们再定义一个函数的时候,如果想给定义在函数外的变量赋值,我们就需要用到 『global』 ,告诉它,这是一个全局变量,而不再是局部变量。
比如说下列代码:
>>> count = 5
>>> def MyFun():
count = 10
print(count)
>>> MyFun()
10
>>> count
5
这段代码中我们并没有用到 global ,所以当我们调用 MyFun() 函数的时候,我们打印出的 count 是在 MyFun() 函数内部的,我们称之为 『局部变量』,但如果我们利用了 global ,我们就可以将 局部变量 变成 『全局变量』,count 会由原先定义好的 5 变成 10
>>> count
5
>>> def MyFun():
global count
count = 10
print(count)
>>> MyFun()
10
>>> count
10
我们再来深入了解一下局部变量,请看下行代码:
>>> def Fun1():
x = 5
def Fun2():
x *= x
return x
return Fun2()
>>> Fun1()
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
Fun1()
File "<pyshell#50>", line 6, in Fun1
return Fun2()
File "<pyshell#50>", line 4, in Fun2
x *= x
UnboundLocalError: local variable 'x' referenced before assignment
我们本来的意愿是返回 x的平方值,但是事与愿违,很遗憾的告诉你,这里报错了。
那我们该怎么解决这个问题呢?
我们可以有两种方法:
一、我们可以利用 『列表』 (因为列表中的内容是不存在 栈 里的)
二、我们可以利用 『nonlocal』(目的是告诉编译器这不是局部变量)
小二,上代码!~
—— 采用列表:
>>> def Fun1():
x = [6]
def Fun2():
x[0] *= x[0]
return x[0]
return Fun2()
>>> Fun1()
36
—— 采用 nonlocal:
>>> def Fun1():
x = 6
def Fun2():
nonlocal x
x *= x
return x
return Fun2()
>>> Fun1()
36
-
匿名函数
使用 『lambda 表达式』 即可得到一个匿名函数
为什么要有 匿名函数?(学习时多问问为什么)
- 可以不用给只用一两次的函数起名字
- 简化代码的可读性
比如我们要写两个数字的和的函数,我们可以直接用 lambda 表达式,一行就完成了
>>> g = lambda x,y : x+y
>>> g(1,2)
3
-
介绍两个牛逼的 BIF
有请加冰 —— filter!(不就是个过滤器嘛→_→)
filter 有什么作用呢?它的作用就是过滤掉 False 的东东,得到 True 的东东
filter用两个参数:
第一个参数 可以是一个函数 也可以为空
第二个参数 是 iterable,也就是 可迭代的数据
举个栗子你就明白了~
>>> list(filter(None,[1,0,False,True]))
[1, True]
如果我们在第一个参数里头放个函数,那么是酱紫的:~)
>>> def odd(x):
return x % 2
>>> temp = range(10)
>>> show = filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
这段代码的意思是 筛选出 0 ~9 中的奇数
接下来有请加冰 —— map!
学过 Java 的童鞋想必很熟悉 map 是什么, map 是映射,他也有两个参数
第一个参数 可以是一个函数 也可以为空
第二个参数 是 可迭代的序列
>>> list(map(lambda x : x+2,range(10)))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]