前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python学习笔记(第七章)

Python学习笔记(第七章)

作者头像
天钧
发布2019-07-26 17:14:47
4060
发布2019-07-26 17:14:47
举报
文章被收录于专栏:渗透云笔记渗透云笔记

函数与过程

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

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

代码语言:javascript
复制
>>> def name():
...     print("tianjun")
...
>>> name()
tianjun

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

代码语言:javascript
复制
>>> print(name())
tianjun
None

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

它是谁?

在不写return时,python 会贴心的给你加上return none,所以说Python的所有函数都是有返回值的

浅谈返回值

学过c语言的同学,最常见的返回值是这样的

代码语言:javascript
复制
return 0;

我们长谈返回值的类型是整型,我们的意思是指它会返回一个整型的值,前面提到Python会动态分配类型,这里也一样Python能动态的确定函数的类型,而且函数还能返回不同类型的值

代码语言:javascript
复制
>>> def name():
...     return 'wocao', 1 , 3.14
...
>>> name()
('wocao', 1, 3.14)
>>>

函数变量的作用域

变量可见性

嘿!听说过全局变量语言局部变量吗?

全局变量;定义在函数里,如函数内定义的变量不能被全局引用

局部变量;定义在函数外,可以被全局引用。

专业总结;在函数里定义的参数以及变量,都称为局部变量,出了这个函数,这些变量都是无效的,当执行完该函数后,函数所有的数据都是被自动删除的。所以在函数外边是无法访问到函数内部的局部变量,如下

代码语言:javascript
复制
>>> 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
>>>

或许这样表达还不清晰,那么这样呢?

代码语言:javascript
复制
>>> 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是定义在函数内部的函数外部无法引用,那么这样呢

代码语言:javascript
复制
>>> number(1,32)
33
[1, 2, 3, 4, 5]
>>> a = ("wocap")
>>>
>>> a
'wocap'

看见没有,在函数外我又定义了个元组a,在函数里的a 并没有受到影响,或许我可以更加直观的表达出来

代码语言:javascript
复制
>>> a = ("wocap")
>>>
>>> a
'wocap'
>>> number(12,342)
354
[1, 2, 3, 4, 5]
>>>

内嵌函数与闭包

喂喂喂,不要犯糊涂哦。看见了闭包有的同学是不是想到了这个呢def number(*params)咱们的收集函数,那是解包与打包。在这里又蹦出了个新名词闭包。

什么是闭包,不要着急,咱先看看咱的新朋友 global关键词

全局变量的作用域是整个模块,代码段里所有的函数内部都能够访问到全局变量,函数内部也可以,但是不建议在函数内去尝试修改人家,那样的h话Python就要给你上机制了,自动创建一个一模一样的变量名,从而不让你去影响到全局变量。

如下

代码语言:javascript
复制
>>> def number():
...     a = 10
...     print(a)
...
>>> a = 2
>>> a
2
>>> number()
10

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

global上场了。如下

代码语言:javascript
复制
>>> def number():
...     global a
...     a = 520
...     print(a)
...
>>> a
10
>>> number()
520
>>> a
520

内嵌函数

嘿!兄弟,看不懂标题,没关系,你知道C语言的嵌套循环吗?就是while里面还有个while,那样的,嘿嘿嘿,内嵌函数也是这样的,如下

代码语言:javascript
复制
>>> def number():
...     print("number正在存放数据")
...     def number1():
...             print("谁他妈的艾特我来着")
...     number1()
...
>>> number()
number正在存放数据
谁他妈的艾特我来着

闭包

重点

果然知识和知识的待遇是不一样的,至少从颜色就看出来了,咳咳现在开始介绍,最骚气的闭包。

代码语言:javascript
复制
闭包(closure)是词法闭包(lexical 
closure)的简称,是引用了自由变量的函数。
这个被引用的自由变量将和这个函数一同存在,
即使已经离开了创造它的环境也不例外。所以,有另一种说法
认为闭包是由函数和与其相关的引用环境组合而成的实体。

理解;如果在一个内部函数里,对在外部作用域的变量进行引用那么内部函数就被认为是闭包,其实就是内部函数的一种理解方式,如下

代码语言:javascript
复制
>>> def num1(x):
...     def num2(y):
...             return x * y
...     return num2
...

>>> num1(2)(3)
6

如果在内部函数里(num2)对一个外部作用域去的变量去引用(x),那么num2 就是闭包。

喜欢匿名的lambda

匿名函数!这是什么玩意。天钧在这里告诉大家,这是玩点,我认为这个是最有趣的,因为我实在是不喜欢def的去创建函数,可是还要玩这个,先看例子

代码语言:javascript
复制
>>> def name():
...     return "tianjun"
...
>>> name()
'tianjun'
>>> lambda:'tianjun'
<function <lambda> at 0x00BF32B8>

很好玩有没有,它运行了但是没有给我我想要的结果,这怎么办,等一下,先告诉你怎么玩

lambda语法;在冒号左边放原函数的参数,可以有多个参数用逗号隔开冒号右边是返回值,经典例子如下

代码语言:javascript
复制
>>> a = lambda x: 2 * 3 * x
>>> a(2)
12

好处;

增加可读性

更加精简

帅气(自己加的,嘿嘿嘿)

两个新同学:filter与map

fliter

过滤器

我们每天都会接受到大量的数据,有一个好的过滤器就显而易见的了。通过过滤器可以保留咱喜欢的信息先看一下Python的注释

代码语言:javascript
复制
>>> 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.

直接上例子好理解

代码语言:javascript
复制
>>> temp = filter(None,[1,0,False,True])
>>> list(temp)
[1, True]

咳咳,开始了啊,filter有俩个参数,第一个参数可以使一个函数也可以是None,如果是一个函数的话,则将第二个可迭代数据里的每一个元素作为函数的参数进行计算,把返回为True,的值筛选出来;如果第一个参数为None,则直接将第二个参数中为True的值筛选出来。

筛选奇书的例子

代码语言:javascript
复制
>>> def add(x):
...     return x % 2
...
>>> temp = filter(add,range(10))
>>> list(temp)
[1, 3, 5, 7, 9]
>>>

学了lambda后一行解决

代码语言:javascript
复制
>>> list(filter(lambda x: x % 2,range(10)))
[1, 3, 5, 7, 9]

map()

映射

将序列中的每一个元素作为函数的参数进行加工,返回加工后的新序列。

代码语言:javascript
复制
>>> list(map(lambda x: x * 2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>>

完事,睡觉,好困啊,又码到很晚。每天做递归的笔记,这么晚我应该给点福利才是。好吧,分享点好玩的 后台回复854获取《Python树莓派编程》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透云笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档