吧啦吧啦内心戏
在没有具体学作用域之前,我在之前的学习笔记中就有提到
我开始以为是自己自创的词儿
没想到这个词早已经存在(手动捂脸)
真是个无知的小火锅(不知者无罪)
我发现自己最擅长做的事情,就是给自己找个台阶,然后很快顺势滑下来

一、作用域

先来一段代码分析一波吧

 name = 'xhg'
def name1():
name = 'aa'
def name2():
name = 'bb'
print(name)
return name2
a = name1()
print(a)
a() #执行结果
<function name1.<locals>.name2 at 0x004D94B0>
bb

有很多人会有疑问,最后一行代码 a() 的作用域是第一层,我在之前的学习笔记中也是这么理解的
既然他的作用域是第一层,则执行 print(name) 的时候,结果不应该是 xhg 吗?怎么是  bb
原来我之前对作用域的理解有些误会

'''
#分析代码执行过程
1.name = 'xhg' 定义全局变量
2.def name1(): 定义了函数name1,在内存中开辟了空间,但函数内部具体内容不执行
3.a = name1() 执行name1函数,并将其结果赋值给变量a
4.name = 'aa' 定义了局部变量
5.def name2(): 定义了函数nam2,在内存中开辟了空间,但函数内部具体内容不执行
6.return name2 返回一个函数name2,则返回函数的执行结果,该结果为name2的内存地址,所以变量a的值为name2的内存地址
7.a() 实质为执行函数name2
8.name = 'bb' 定义了局部变量
9.print(name) 在该作用域中找变量的值,所以打印结果为 bb
'''

结论:

  • 函数的运行与其申明定义的作用域有关,与其执行的作用域(调用的)无关

    • 函数一旦定义成功,其相对作用域已经确定
    • 所以在上一段程序代码中,a() 虽然和 name = 'xhg' 看上去为一个作用域,但实质上,a() 的作用域为函数 name2
  • return +函数名          返回的是该函数的内存地址

    • eg. renturn name1
  • return +函数名()        递归调用
    • eg. renturn name1()
  • 对于一个函数的执行结果其实就是return返回的值

再看两段代码

#代码一:
name = 'xhg'
def name1():
name = 'aa'
def name2():
name = 'bb'
def name3():
name = 'cc'
print(name)
return name3
return name2
a = name1()
b = a()
print(b()) #代码二:
name = 'xhg'
def name1():
name = 'aa'
def name2():
name = 'bb'
def name3():
name = 'cc'
print(name)
return name3
return name2
print(name1()()()) #执行结果相同,都为
cc
None

说明     print(name1()()())   等同于   a = name1() ;b = a() ;print(b())

二、匿名函数

语法结构(由四部分构成)lambda关键字  +  匿名函数的形参 +  冒号:+  该函数的操作(子代码)

  • 第四部分的作用相当于return,直接返回了一个值
  • 不可以是复杂的逻辑判断,直接来个操作就ok了
  • 加载完之后释放,需要保存就附一个值
  • 匿名函数与其他函数联合使用,通常情况下不会单独存在

关键字 lambda

  • 用来标识匿名函数
def calc(x):
return x + 1
a = calc(10)
print(a)

用匿名函数来实现上述程序的功能

a = lambda x : x + 1
print(a(10))

如果形参为多个参数,应该用括号将匿名函数的第四部分括起来
(因为在使用return返回多个参数时,系统默认加了括号)

def test(x,y,z):
return x + 1, y + 1, z + 1
a = test(1,2,3)
print(a)

用匿名函数来实现上述程序的功能 a = lambda x, y, z : (x + 1, y + 1, z + 1) #如果不加括号会报错
print(a(1, 2, 3))

三、编程的方法论

有三种,分别是:面向过程编程、函数式编程、函数式编程

面向过程编程

  • 是一种以事件为中心的编程思想。
  • 就是分析出解决问题的步骤,然后用方法(函数)去实现这些步骤
  • 使用的时候按照步骤顺序依次调用。
  • 面对要实现的功能,找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程
  • 面向过程是一种自顶向下的编程

函数式编程

  • 就是先定义一个数学函数,按照数学模型用编程语言去实现它

举例:现在有这样一个数学表达式:y = 2 * x + 1

#面向过程式的编程:
def cal(x):
a = 2 * x
a += 1
return a
print(cal(10)) #函数式编程:
def cal(x):
return 2 * x + 1
print(cal(10))

面向对象编程

  • 是一种线性的思维。
  • 与面向过程是相辅相成的。
  • 面向对象就是将构成问题的事务分解抽象成各个对象。
  • 建立对象的目的不是为了完成某个步骤,而是叙述某个事务在整个解决问题的步骤中的行为。
  • 面向对象是将事物高度抽象化。

四、高阶函数

定义(满足其中一个条件即可)

  • 函数接受的参数是一个函数名
  • 返回值中包含函数

举例一:函数接受的参数是一个函数名

def name1(n):      #n的值为函数name2的返回值none,所以不是高阶函数
print(n)
def name2(name):
print('my name is %s' %name)
name1(name2('xhg'))
#执行结果
my name is xhg
None def name1(n): #n的值为函数name2,所以是高阶函数
print(n)
def name2(name):
print('my name is %s' %name)
name1(name2) #执行结果
<function name2 at 0x021594B0>

举例二:返回值中包含函数

def name1():
print('from name1')
def name2():
print('from name2')
return name1 #返回值中包含函数,所以为高阶函数
n = name2()
n() #执行结果
from name2
from name1 def name1():
print('from name1')
def name2():
print('from name2')
return name1() #递归调用
n = name2()
print(n) #执行结果
from name2
from name1
None

由于   return name1   和 return name1()   就差一个括号,导致结果不同
虽然差别小,可是有本质的区别,要注意
return name1 是将函数name1的地址赋值给n
return name1() 必须先执行函数name1,将函数name1执行结束后的值由return返回给n(函数name无返回值,所以其结果为none)

写在后面的话:

今天下午有点累

中午没有休息好

长大以后,才发现一个人能做到换位思考真的不是很容易

保持一颗善良的心看待这个世界

因为抱怨会让自己变得消极

全世界我最可爱(自己鼓励自己呗,开开心心才能好好学习)

Python小白学习之路(十四)—【作用域】【匿名函数】【编程方法论】【高阶函数】的更多相关文章

  1. Python3学习之路~3.2 递归、函数式编程、高阶函数、匿名函数、嵌套函数

    1 递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. def calc(n): print(n) if int(n / 2) == 0: return n r ...

  2. Python小白学习之路(四)——第一次练习题

    写在前面: 今天下雪了呢!连着两天都没有更新学习记录. 我没有偷懒呢.做了一天的练习题,昨天学的内容还没总结完,太累了就回去睡觉了 连续一周早起,强大的内心也无法支撑我疲惫的身体 今天早起做了整理.加 ...

  3. Python小白学习之路(二十四)—【装饰器】

    装饰器 一.装饰器的本质 装饰器的本质就是函数,功能就是为其他函数添加附加功能. 利用装饰器给其他函数添加附加功能时的原则: 1.不能修改被修饰函数的源代码        2.不能修改被修饰函数的调用 ...

  4. 小白的Python之路 day3 函数式编程,高阶函数

    函数式编程介绍   函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  5. Learning Python 012 函数式编程 1 高阶函数

    Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...

  6. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  7. 『无为则无心』Python函数 — 33、高阶函数

    目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...

  8. Python小白学习之路(十五)—【map()函数】【filter()函数】【reduce()函数】

    一.map()函数 map()是 Python 内置的高阶函数 有两个参数,第一个是接收一个函数 f(匿名函数或者自定义函数都OK啦):第二个参数是一个 可迭代对象 功能是通过把函数 f 依次作用在 ...

  9. python函数式编程之高阶函数学习

    基本概念 函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量.因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用.而允许使用 ...

随机推荐

  1. 2018.09.20 atcoder Painting Graphs with AtCoDeer(tarjan+polya)

    传送门 一道思维题. 如果没有环那么对答案有k的贡献. 如果恰为一个环,可以用polya求贡献. 如果是一个有多个环重叠的双联通的话,直接转化为组合数问题(可以证明只要每种颜色被选取的次数相同一定可以 ...

  2. 2018.07.12 atcoder Go Home(贪心)

    传送门 题意简述:大家在数轴上生活,公司在 s. 班车送所有人回家,有 n 个住处,第 i 个位置在 xi,居住了 pi 的人. 保证 xi 互不相同. 大家⼀起投票向前还是向后,如果票数相同就固定向 ...

  3. gj10 python socket编程

    10.1 HTTP.Socket.TCP这几个概念 五层网络模型 socket 不属于任何协议,是一个API,通过socket 可以和传输层的打交道,然后在之上可以实现自己的功能和协议 10.2 cl ...

  4. SessionCacheTest03.testLoad Unrooted Tests initializationError

    这个错误主要是没有加载@Test这个标签,就是把其转化为一个juit测试的类.增加之后就没有问题了,当然还有很多人说是自己的Juit的版本问题,那就改下版本,还有说是没有加载两个类包,为了完整我就把包 ...

  5. Redis Cluster原理初步

    目录 目录 1 1. 前言 1 2. 槽(slots) 1 3. 路由配置(node.conf) 1 4. 总slots数(cluster.h:16384) 2 5. key的路由 2 6. 将key ...

  6. idea 优化

    http://www.iyunv.com/thread-348537-1-1.html

  7. HDU1269 迷宫城堡 2016-07-24 13:47 84人阅读 评论(0) 收藏

    迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...

  8. 转 UNIGUI安装教程、使用例子

    转 UNIGUI安装教程.使用例子 http://my.oschina.net/u/582827/blog/203429?p={{currentPage-1}} 转 uniGui安装教程.使用例子 发 ...

  9. Python学习-37.Python中的正则表达式

    作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...

  10. Elasticsearch 的一些关键概念

    我更喜欢把 Elasticsearch 作为一种 nosql 去理解,它的一些开发概念和 MongoDB 以及 Redis 没有太大的区别,不过了解 Elasticsearch 中的一些核心概念对于你 ...