1.函数名作用

函数名本质上就是函数的内存地址或对象。
  1.可以被引用
  2.可以被当作容器类型的元素
  3.可以当作函数的参数和返回值
  4.如果记不住的话,那就记住一句话,就当普通变量用

2.闭包

什么叫做闭包?
1.必须是嵌套函数
2.在嵌套函数的内部的函数可以使用外部的变量(非全局变量)
闭包的特性?
  1.python中的闭包会出现内存驻留,普通函数执行一次内存开辟的空间就销毁了。(此处记录一下:不是开辟的内存空间销毁了,是命名空间存放的变量名和值的映射关系销毁了,而开辟的空间的值还在!)
  2.闭包会出现内存泄漏的问题
  3.装饰器的本质就是闭包(面试必问)
闭包的常用场景?
  我们知道在函数内的变量在函数外访问的话,直接调用函数返回就好了,那么如果我们想在函数外部来调用内部的函数该怎么做那?
  直接在调用函数是返回函数的名字就可以了
闭包的优点:
  1.全局里存放会有污染和不安全的现象
复制代码
def wrapper():
money =10
def inner(num):
nonlocal money
money +=num
print(money)
print(inner.__closure__) #不返回none的话就是闭包
return inner
wrapper()(100)
复制代码

 3.迭代器

在以前都听过迭代对象,能被for循环的就是可迭代对象,包括字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的。
那我们要怎样证明那?
上面说,能被for循环的就是“可迭代的”,但是如果正着想,for怎么知道谁是可迭代的呢?
因为他们都遵循了可迭代协议,那什么又是可迭代协议呢?
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。(可迭代的对象内部必须含有一个__iter__方法,才能叫可迭代对象,也就能得到相应的迭代器) 查看一个数据类型是否是可迭代的方法:
  1.dir(li)
   li=[1,2,3]
   print(dir(li))
   如果里面包含__iter__方法就证明是可迭代对象,遵循可迭代协议
  2.
  l = [1,2,3]
  l_iter = l.__iter__()
  from collections import Iterable
  from collections import Iterator
  print(isinstance(l,Iterable)) #True #查看是不是可迭代对象
  print(isinstance(l,Iterator)) #False #查看是不是迭代器 通过"a = 对象.__iter__ # 创建一个迭代器",通过迭代器内部的__next__方法得到下一个迭代器元素,这就是for循环的工作机制! 使用while循环和迭代器来模拟for循环
lst = [6,5,4]
l = lst.__iter__() while True:
try:
i = l.__next__()
print(i)
except StopIteration:
break

注意: 迭代器不能反复,只能向下执行
  总结:
    Iterable: 可迭代对象. 内部包含__iter__()函数
    Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().
  迭代器的特点:
    1. 节省内存.
    2. 惰性机制
    3. 不能反复, 只能向下执行.  for循环本质:
  for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,
  然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了

 4.递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数(必须有跳出条件)。

  举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:
  fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
  所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
     于是,fact(n)用递归的方式写出来就是:
  def fact(n):
    if n==1:
      return 1
  return n * fact(n - 1) 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。
由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000)! 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 总结:
  使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
  针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
  Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。 应用场景:在不知道循环的具体次数的时候使用递归 调整递归最大深度
  import sys
  sys.setrecursionlimit(10000)

python基础 (函数名,闭包,和迭代器)的更多相关文章

  1. python之函数名,闭包、迭代器

    一.函数名的运用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1,函数名的内存地址: def func(): print("呵呵") pr ...

  2. Python基础之 函数名,闭包,和迭代器

    1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...

  3. python全栈 函数名 闭包及迭代器

    1,函数名的运用 2.闭包 3.迭代器 一.函数名的运用 1.函数名的命名规范和变量是一样的 函数名其实就是变量名 (1)函数名的内存地址 例: def func(): print("ale ...

  4. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  5. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  6. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  7. Python 嵌套函数和闭包

    Python 嵌套函数和闭包 1.函数嵌套 如果在一个函数内部定义了另一个函数,我们称外部的函数为外函数,内部的函数为内函数,如下代码: def out_func(): def inner_func1 ...

  8. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  9. Python基础-函数参数

    Python基础-函数参数 写在前面 如非特别说明,下文均基于Python3 摘要 本文详细介绍了函数的各种形参类型,包括位置参数,默认参数值,关键字参数,任意参数列表,强制关键字参数:也介绍了调用函 ...

随机推荐

  1. python对mysql进行简单操作

    python 连接MySQL数据库,进行简单操作 一.连接MySQL数据库,关闭连接 import pymysql db = pymysql.connect(host="xxx.xxx.x. ...

  2. 微服务架构基础之Service Mesh

    ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础. 那么到底什么是 Serv ...

  3. Idea spring 配置文件报红 URI is not registered

    把报错的加到如下忽略列表中

  4. Lua学习之加载其他lua文件

    Lua 中提供了模块的概念,模块类似一个封装库或者 C++ 中的一个类,可以将公用的部分提到一个文件中,以 API 的形式供其他 lua 文件调用. Lua 中的模块其实就是包含变量.函数等已知元素组 ...

  5. mount命令和自动挂载实例

    前言 介绍mount命令和一个实例. mount命令 作用 作用:挂载linux系统外的文件 命令格式 mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mou ...

  6. 【CZYZ 20160819】背包

    题目描述 蛤布斯有nn个物品和一个大小为mm的背包,每个物品有大小和价值,它希望你帮它求出背包里最多能放下多少价值的物品. 输入数据 第一行两个整数 n,mn,m. 接下来 nn 行每行两个整数 xi ...

  7. Linux命令:typeset

    语法 typeset [-afFgrxilnrtux] [-p] [name[=value] …] 说明 declare的同义词,提供它只是为了保持和ksh兼容.

  8. 百度地图点聚合MarkerClusterer性能优化

    公司要求做个百度地图点聚合的性能优化,需一次性加载9万条数据. 记录下自己的优化过程.(只想看优化代码的可直接移步:步骤三) 一.引入百度地图 vue项目中,在index.html文件中用script ...

  9. jsTree通过AJAX从后台获取数据

    页面代码: <div id="MenuTree"></div> javascript代码: $(document).ready(function ($) { ...

  10. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析

    (一)需求规格说明书github地址:https://github.com/gzyt/SRS (二)原型链接:http://www.cnblogs.com/lztxh/p/9011873.html ( ...