Python学习笔记(第七章)

释放双眼,带上耳机,听听看~!

函数与过程

一般的认为函数是有返回值的,而过程是没有返回值的因为过程简单且特殊,简单来讲函数是干完活,然后跟领导报告一下,而过程却是完事后啪啪屁股走人的“小混蛋”

在Python严格的来讲是只有函数,没有过程,就是说不管是什么函数都会有返回值,提到返回值大家的脑海里一定是return,还理解不了的话就看例子吧!

>>> def name():...  print("tianjun")...>>> name()tianjun

大家前面的教程中都是这个样子的,哪里有返回值,的确没有,但是看下面例子

>>> print(name())tianjunNone

看出来有什么不同了吗?原本返回的值后面还跟了个陌生的“小家伙”,

它是谁?

在不写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>>> num1Traceback (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]>>> aTraceback (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>>> a2>>> number()10

但是,咱要发扬黑客的作死精神,没事起来搞搞事情

global上场了。如下

>>> def number():...  global a...  a = 520...  print(a)...>>> a10>>> number()520>>> a520

内嵌函数

嘿!兄弟,看不懂标题,没关系,你知道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树莓派编程》





长按识别二维码,了解更多





本文源自微信公众号:渗透云笔记

人已赞赏
安全工具

关于迭代与递归的补充

2019-10-16 17:18:56

安全工具

Python学习笔记(第六章)

2019-10-16 17:19:07

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索