1.全局变量和局部变量

  一般定义在程序的最开始的变量称为函数变量,在子程序中定义的变量称为局部变量,可以简单的理解为,无缩进的为全局变量,有缩进的是局部变量,全局变量的作用域是整个程序,而局部变量的作用域是子程序内部,当程序运行时,首先会找程序内部有没有局部变量,如果有,则调用,如果没有,才会去调用全局变量。如下:

  1. name="czp"            #全局变量
  2. def func():
  3. name="czp1"         #局部变量
  4. print(name)
  5. func()
  6. 运行结果:
  7. czp1              调用func()函数,程序会先在函数内部找有没有name这个变量,如果有,就会调用该name的值,而如果没有定义局部变量的话,函数会去找全局name

  可以通过global关键字,通过局部变量修改全局变量,如下所示:

  1. name="czp"          #定义全局变量
  2. def func():
  3. global name       在函数内部,通过global关键字,通过局部变量修改全局变量的值
  4. name="czp1"
  5. print(name)
  6. func()            打印局部变量中name的值
  7. print(name)         打印全局变量中name的值
  8. 运行结果:
  9. czp1
  10. czp1             在运行结果中可以明显看出,通过global,在定义局部变量的同时,也修改了全局变量的值

  global与nonlocal的区别:

  python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量

  global关键字用来在函数或局部作用域中使用全局变量,并通过glabal关键字在局部作用域中修改全局变量(一般不推荐这么做)

  nonlocal关键字用来在函数或局部作用域使用外层(非全局)变量。

2.递归函数

  在一个函数的内部,可以调用其他的函数,如果某一个函数在内部调用的函数仍然是自身,这个函数就可以称为递归函数。

  1. def calc(n):
  2. print(n)
  3. if int(n/2)==0:
  4. return n
  5. return calc(int(n/2))        在calc函数中,反复调用calc自身,这样的函数就是递归函数
  6. calc(10)
  7. 运行结果:
  8. 10
  9. 5
  10. 2
  11. 1

  注意:在递归函数中,并不是可以让自身永远的循环下去,递归函数中必须定义一个明确的结束条件,每进行更深一次的递归,解决问题的规模必须要较上一层有所减少,

  递归函数常用来进行二分查找。。

3.匿名函数

  匿名函数其实就是不需要指定显示的函数。用lambda关键字定义,通常我们定义一个函数用这种形式:

  1. def calc(x):
  2. return x+1
  3. print(calc(2))
  4. 运行结果:
  5. 3

  而上段代码 用匿名函数使用的话,就可以使用如下的方式,通过lambda关键字,传入一个形参x,用冒号隔开,后面加入return的值。

  1. res=lambda x:x+1
  2. print(res(2))
  3. 运行结果:
  4. 3

  匿名函数单独这么用意义不大,但是和其他函数一起用的时候,功能就显现的很明显了。如下面的例子

  1. res=map(lambda x:x**2,[2,4,6,])
  2. for i in res:
  3. print(i)
  4. 运行结果:
  5. 4
  6. 16
  7. 36

  我会在接下来写内置方法的时候具体的展示出使用匿名函数的好处。

4.高阶函数

  高阶函数的特点如下:1)函数接收的参数是一个函数 ;2)函数的返回值是一个函数

  1. 将函数作为参数传给另一个函数
    def foo(n):  
  2. print(n)
  3. def bar(name):
  4. print("my name is %s"%name)
  5. print(foo(bar("尼古拉斯赵四")))
  6. 运行结果:
  7. my name is 尼古拉斯赵四
  8. None
  9. None                    返回两个None,因为在foo()和bar()函数中我没有定义retturn。默认返回None
  1. 将函数作为另一个函数的返回值
    def bar():
  2. print("from bar")
  3. def foo():
  4. print("from foo")
  5. return bar
  6. foo()()
  7. 运行结果:
  8. from foo
  9. from bar

4.内置函数

  首先我先介绍3个比较重要,也是比较常用的内置函数,map;reduce,filter3个内置函数

  1.map:

    将函数作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。

    模拟一下这个需求:有一个列表[1,2,3,4],我要让列表中的每一个元素自增1,然后打印出来,这个程序可以这样写:

  1. name=[1,2,3,4]        
  2. res=[]                  定义一个空列表,用来接收自增一后的值
  3. def calc(array):
  4. for i in array:           使用for循环,遍历传入列表中的每一个元素
  5. res.append(i+1)        
  6. return res
  7. print(calc(name))
  8. 运行结果:
  9. [2, 3, 4, 5]

  那如果 我想要的需求是让列表自减1,自乘呢,难道要把这段代码重复写一段,只是改一句res.append(i-1),或者更高级一点,我们在定义一个函数:

  1. def increase(x):
  2. return x-1               定义一个自减1的函数
  3. name=[1,2,3,4]
  4. res=[]
  5. def calc(func,array):           在这里定义两个形参,一个用来传入函数increase,一个用来传入列表name
  6. for i in array:
  7. res.append(increase(i))    
  8. return res
  9. print(calc(increase,name))
  10. 运行结果:
  11. [0, 1, 2, 3]

  更高级一点呢?我们用map+上面提到的匿名函数,可以很好的完成这样的需求:

  1. name=[1,2,3,4]
    print(list(map(lambda x:x+1,name)))
    运行结果:
    [2,3,4,5]

  ok,上面写了那么多,两行代码搞定。

  2.reduce:

  reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。可以简单的理解为,map接受一个列表,返回的仍然是一个列表,而reduce会进行计算,返回一个值

  1. from functools import reduce 必须导入reduce方法
  2. name=[1,2,3,4]
  3. print((reduce(lambda x,y:x+y,name)))      函数必须传入两个参数,然后传入list
  4. 运行结果:
  5. 10

  reduce还有一个默认参数 ,就是可以在list后再传入一个初始值。

  1.  def reduce(function, sequence, initial=None) 这个初始值默认为None
  1. from functools import reduce
  2. name=[1,2,3,4]
  3. print((reduce(lambda x,y:x+y,name,5)))     还是上面的例子,我在最后加了初始值5(默认是none
  4. 运行结果:
  5. 15

  3.filter

   filter读入iterable所有的项,判断这些项对function是否为真,返回一个包含所有为真的项的迭代器。如果function是None,返回非空的项。

  1. name=["czp","cc","zp1"]
  2. print(list(filter(lambda n:n.endswith("c"),name)))    通过匿名函数判断条件,返回值为真,就会打印成列表的形式
  3. 运行结果:
  4. ['cc']

  在下一篇文章中,我会介绍其他的常用内置函数

Python函数篇(2)-递归函数、匿名函数及高阶函数的更多相关文章

  1. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  2. Python小白学习之路(十四)—【作用域】【匿名函数】【编程方法论】【高阶函数】

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

  3. Python实用笔记 (12)函数式编程——高阶函数

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...

  4. Python小世界:匿名函数、高阶函数、推导式

    前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...

  5. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  6. Python高阶函数和匿名函数

    高阶函数:就是把函数当成参数传递的一种函数:例如 注解: 1.调用add函数,分别执行abs(-8)和abs(11),分别计算出他们的值 2.最后在做和运算 map()函数 python内置的一个高阶 ...

  7. Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器

    迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...

  8. python开发基础04-函数、递归、匿名函数、高阶函数、装饰器

    匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函 ...

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

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

  10. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

随机推荐

  1. 脱壳第三讲,UPX压缩壳,以及补充壳知识

    脱壳第三讲,UPX压缩壳,以及补充壳知识 一丶什么是压缩壳.以及壳的原理 在理解什么是压缩壳的时候,我们先了解一下什么是壳 1.什么是壳 壳可以简单理解为就是在自己的PE文件中包含了代码.而有不影响我 ...

  2. 小程序组件之picker和range-key的用法

        因为在微信小程序的官网上并没有range-key的例子以及实际用法,所以好多人不知道具体如何使用.然后我在这里对其进行一个简单的实现,并记录一些注意事项. 以下是官网给的说明:   具体的用法 ...

  3. BabeLua常见问题

    BabeLua常见问题 来源: http://blog.csdn.net/babestudio/article/details/27228865 怎样升级BabeLua? https://babelu ...

  4. 数位DP按位枚举模板

    借鉴:http://www.cnblogs.com/xz816111/p/4809913.html // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位 ...

  5. Power Strings(KMP)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 45008   Accepted: 18794 D ...

  6. 2016年中国大学生程序设计竞赛(杭州)1006 Four Operations

    Four Operations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. Linux系统安装_Centos6.9

    第1章 虚拟机安装  1.1 镜像下载 1.1.1 新版本下载 http://mirrors.aliyun.com  #阿里云官方镜像站点 1.1.2 旧版本下载 http://vault.cento ...

  8. Log4.Net 在Winfrom、MVC、ashx程序里的使用,ashx程序里使用异步

    最近做一个双11活动的,是一套相关的H5页面.本来以为难度不大,但是做下来几天还是遇到些问题.就总结一下吧,还是有收获的. 1.在H5页面中,有一个遮罩层,还是挺有意思的.直接用div+css控制遮罩 ...

  9. 针对数据量较大的表,需要进行跨库复制,采用navcat 实现sqlite数据库跨数据库的数据表迁移 [转载]

    2014年12月13日 14:36 新浪博客 (转自http://www.cnblogs.com/nmj1986/archive/2012/09/17/2688827.html) 需求: 有两个不同的 ...

  10. [ASP.NET Core 2.0 前方速报]Core 2.0.3 已经支持引用第三方程序集了

    发现问题 在将 FineUIMvc(支持ASP.NET MVC 5.2.3)升级到 ASP.NET Core 2.0 的过程中,我们发现一个奇怪的现象: 通过项目引用 FineUICore 工程一切正 ...