函数与过程
一般的认为函数是有返回值的,而过程是没有返回值的因为过程简单且特殊,简单来讲函数是干完活,然后跟领导报告一下,而过程却是完事后啪啪屁股走人的“小混蛋”
在Python严格的来讲是只有函数,没有过程,就是说不管是什么函数都会有返回值,提到返回值大家的脑海里一定是return,还理解不了的话就看例子吧!
>>> def name():
... print("tianjun")
...
>>> name()
tianjun
大家前面的教程中都是这个样子的,哪里有返回值,的确没有,但是看下面例子
>>> print(name())
tianjun
None
看出来有什么不同了吗?原本返回的值后面还跟了个陌生的“小家伙”,
它是谁?
在不写return时,python 会贴心的给你加上return none,所以说Python的所有函数都是有返回值的
浅谈返回值
学过c语言的同学,最常见的返回值是这样的
return 0;
我们长谈返回值的类型是整型,我们的意思是指它会返回一个整型的值,前面提到Python会动态分配类型,这里也一样Python能动态的确定函数的类型,而且函数还能返回不同类型的值
>>> def name():
... return 'wocao', 1 , 3.14
...
>>> name()
('wocao', 1, 3.14)
>>>
函数变量的作用域
变量可见性
嘿!听说过全局变量语言局部变量吗?
全局变量;定义在函数里,如函数内定义的变量不能被全局引用
局部变量;定义在函数外,可以被全局引用。
专业总结;在函数里定义的参数以及变量,都称为局部变量,出了这个函数,这些变量都是无效的,当执行完该函数后,函数所有的数据都是被自动删除的。所以在函数外边是无法访问到函数内部的局部变量,如下
>>> def jiafa(num1,num2):
... return num1 + num2
...
>>> jiafa(2,34)
36
>>> jiafa(21,4)
25
>>> num1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'num1' is not defined
>>>
或许这样表达还不清晰,那么这样呢?
>>> def number(num1,num2):
... print(num1 + num2)
... a = [1,2,3,4,5]
... print(a)
...
>>> number(1,32)
33
[1, 2, 3, 4, 5]
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>>
看样子,咱定义了个函数number在里面给a赋值了,输出的的时候也输出了a的值,但是却无法单独访问a。这就是局部变量,a是定义在函数内部的函数外部无法引用,那么这样呢
>>> number(1,32)
33
[1, 2, 3, 4, 5]
>>> a = ("wocap")
>>>
>>> a
'wocap'
看见没有,在函数外我又定义了个元组a,在函数里的a 并没有受到影响,或许我可以更加直观的表达出来
>>> a = ("wocap")
>>>
>>> a
'wocap'
>>> number(12,342)
354
[1, 2, 3, 4, 5]
>>>
内嵌函数与闭包
喂喂喂,不要犯糊涂哦。看见了闭包有的同学是不是想到了这个呢def number(*params)咱们的收集函数,那是解包与打包。在这里又蹦出了个新名词闭包。
什么是闭包,不要着急,咱先看看咱的新朋友 global关键词
全局变量的作用域是整个模块,代码段里所有的函数内部都能够访问到全局变量,函数内部也可以,但是不建议在函数内去尝试修改人家,那样的h话Python就要给你上机制了,自动创建一个一模一样的变量名,从而不让你去影响到全局变量。
如下
>>> def number():
... a = 10
... print(a)
...
>>> a = 2
>>> a
2
>>> number()
10
但是,咱要发扬黑客的作死精神,没事起来搞搞事情
global上场了。如下
>>> def number():
... global a
... a = 520
... print(a)
...
>>> a
10
>>> number()
520
>>> a
520
内嵌函数
嘿!兄弟,看不懂标题,没关系,你知道C语言的嵌套循环吗?就是while里面还有个while,那样的,嘿嘿嘿,内嵌函数也是这样的,如下
>>> def number():
... print("number正在存放数据")
... def number1():
... print("谁他妈的艾特我来着")
... number1()
...
>>> number()
number正在存放数据
谁他妈的艾特我来着
闭包
重点
果然知识和知识的待遇是不一样的,至少从颜色就看出来了,咳咳现在开始介绍,最骚气的闭包。
闭包(closure)是词法闭包(lexical
closure)的简称,是引用了自由变量的函数。
这个被引用的自由变量将和这个函数一同存在,
即使已经离开了创造它的环境也不例外。所以,有另一种说法
认为闭包是由函数和与其相关的引用环境组合而成的实体。
理解;如果在一个内部函数里,对在外部作用域的变量进行引用那么内部函数就被认为是闭包,其实就是内部函数的一种理解方式,如下
>>> def num1(x):
... def num2(y):
... return x * y
... return num2
...
>>> num1(2)(3)
6
如果在内部函数里(num2)对一个外部作用域去的变量去引用(x),那么num2 就是闭包。
喜欢匿名的lambda
匿名函数!这是什么玩意。天钧在这里告诉大家,这是玩点,我认为这个是最有趣的,因为我实在是不喜欢def的去创建函数,可是还要玩这个,先看例子
>>> def name():
... return "tianjun"
...
>>> name()
'tianjun'
>>> lambda:'tianjun'
<function <lambda> at 0x00BF32B8>
很好玩有没有,它运行了但是没有给我我想要的结果,这怎么办,等一下,先告诉你怎么玩
lambda语法;在冒号左边放原函数的参数,可以有多个参数用逗号隔开冒号右边是返回值,经典例子如下
>>> a = lambda x: 2 * 3 * x
>>> a(2)
12
好处;
增加可读性
更加精简
帅气(自己加的,嘿嘿嘿)
两个新同学:filter与map
fliter
过滤器
我们每天都会接受到大量的数据,有一个好的过滤器就显而易见的了。通过过滤器可以保留咱喜欢的信息先看一下Python的注释
>>> help(filter)
Help on class filter in module builtins:
class filter(object)
| filter(function or None, iterable) --> filter object
|
| Return an iterator yielding those items of iterable for which function(item)
| is true. If function is None, return the items that are true.
|
| Methods defined here:
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __iter__(self, /)
| Implement iter(self).
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
|
| __next__(self, /)
| Implement next(self).
|
| __reduce__(...)
| Return state information for pickling.
直接上例子好理解
>>> temp = filter(None,[1,0,False,True])
>>> list(temp)
[1, True]
咳咳,开始了啊,filter有俩个参数,第一个参数可以使一个函数也可以是None,如果是一个函数的话,则将第二个可迭代数据里的每一个元素作为函数的参数进行计算,把返回为True,的值筛选出来;如果第一个参数为None,则直接将第二个参数中为True的值筛选出来。
筛选奇书的例子
>>> def add(x):
... return x % 2
...
>>> temp = filter(add,range(10))
>>> list(temp)
[1, 3, 5, 7, 9]
>>>
学了lambda后一行解决
>>> list(filter(lambda x: x % 2,range(10)))
[1, 3, 5, 7, 9]
map()
映射
将序列中的每一个元素作为函数的参数进行加工,返回加工后的新序列。
>>> list(map(lambda x: x * 2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>>
完事,睡觉,好困啊,又码到很晚。每天做递归的笔记,这么晚我应该给点福利才是。好吧,分享点好玩的 后台回复854获取《Python树莓派编程》