1,函数名的运用

2.闭包

3.迭代器

一.函数名的运用

1.函数名的命名规范和变量是一样的

 函数名其实就是变量名

(1)函数名的内存地址

例:

  1. def func():
  2. print("alex")
  3. print(func)
  4. #<function func at 0x0000000002033E18>

(2)函数名可以赋值给其他变量

例:

  1. def func():
  2. print("呵呵")
  3. print(func)
  4. a = func # 把函数当成一个变量赋值给另一个变量
  5. a()
  6. # 函数调用 func()
  1. 函数名可以作为参数传递给函数
  2. def my():
  3. print("我是my")
  4. def proxy(fn): # 代理模式. 装饰器
  5. print("在处理之前")
  6. fn()
  7. print("在处理之后")
  8. proxy(my) #把函数名作为参数传递给另一个函数

a = 10   b =a(赋值操作)    print(b)

(3)函数名可以作为列表的元素进行存储.

例:

  1. def func1():
  2. pass
  3. def func2():
  4. pass
  5. lst = [func1, func2]
  6. for el in lst:
  7. el()

(4)函数名可以作为参数传递给函数.

例:

def func(): pass def proxy(fn): fn() proxy(func)

  1. def func1():
  2. print("我是func1")
  3. def func2():
  4. print("我是func2")
  5. def func(fn, gn): # 函数名可以作为参数进行传递
  6. print("我是func")
  7. fn()
  8. gn()
  9. print("哈哈哈")
  10. func(func1, func2)

(5)函数名可以作为函数的返回值

例:

def func(): def inner(): pass return inner func()()

  1. def func():
  2. print("我是func")
  3. a = 10 # 变量
  4. def inner():
  5. print("我是inner")
  6. return inner
  7. # ret = func() #(最后一行的转化过程源头)
  8. # ret() #(最后一行的转化过程源头)
  9. func()() # 先运行func() 然后在返回值上加()
  1. def func_1():
  2. print("这里是函数1")
  3. def func_2():
  4. print("这里是函数2")
  5. print("这里是函数1")
  6. return func_2
  7. fn = func_1() # 执行函数1. 函数1返回的是函数2, 这时fn指向的就是上面函数2
  8. fn() # 执行上面返回的函数

二.闭包

闭包:内层函数, 对外层函数(非全局)的局部变量的引用

写法:

  1. def outer():
  2. a = 10
  3. def inner():
  4. print(a)
  5. return inner

例:

  1. def func1():
  2. name = "alex"
  3. def func2():
  4. print(name) # 闭包
  5. func2()
  6. func1()
  7. 结果:
  8. alex

闭包的作用;

(1) 保护你的变量不受侵害.

例:

  1. a = 10 # 不安全的
  2. def outer():
  3. global a #如果没有global 就无法引用外部变量,保证内部变量不外泄.不被侵犯
  4. a = 20
  5. def outer_2():
  6. global a
  7. a = 30
  8. outer_2()
  9. outer()
  10. print(a)

(2)可以让一个变量常住内存.供后面的程序使用.

例:

  1. def outer():
  2. a = 10 # 常驻内存, 为了inner执行的时候有值.
  3. def inner():
  4. print(a) #
  5. return inner
  6. fn = outer()
  7. print("fdsafasd")
  8. print("fdsafasd")
  9. print("fdsafasd")
  10. fn() # 调用的时机是不定的.

简易爬虫实例  涛哥珍藏校花美女大全

例:

  1. # 超简易爬虫
  2. from urllib.request import urlopen
  3. def outer():
  4. # 常驻内存
  5. s = urlopen("http://www.xiaohua100.cn/index.html").read()
  6. def getContent(): # 闭包
  7. return s
  8. return getContent
  9. print("爬取内容.....")
  10. pa = outer()
  11. ret = pa()
  12. print(ret)
  13. # (过段时间)
  14. ret = pa()
  15. print(ret)
  16. # (又过一段时间调用)
  17. ret = pa()
  18. print(ret)
  19. # (又又过一段时间调用)
  20. ret = pa()
  21. print(ret)
  22. # ...............(此处省去 N + 1 次)

(3)如何查看是否闭包.

方法: 我们可以使用__closure__来检测函数是否是闭包. 使用函数名.__closure__返回cell就是闭包. 返回None就不是闭包.

例:

  1. def func1():
  2. name = "alex"
  3. def func2():
  4. print(name) # 闭包
  5. func2()
  6. print(func2.__closure__)
  7. func1()
  8.  
  9. # (<cell at 0x10c2e20a8: str object at
  10. 0x10c3fc650>,)
  1. def func():
  2. a = 10
  3. def inner():
  4. print(a)
  5. print(inner.__closure__) # 如果打印的是None. 不是闭包. 如果不是None, 就是闭包
  6. func()
  7.  
  8. #(<cell at 0x00000000026465B8: int object at 0x000000005286B560>,)

三.迭代器.

使用dir来查看该数据包含了那些方法

用来遍历列表,字符串,元祖....可迭代对象

可迭代对象: Iterable, 里面有__iter__()可以获取迭代器, 没有__next__()

迭代器: Iterator, 里面有__iter__()可以获取迭代器, 还有__next__()

数据必须是可迭代的

例:

  1. # 对的
  2. s = "abc"
  3. for c in s:
  4. print(c)
  5.  
  6. # 错的
  7. for i in 123:
  8. print(i)
  9. 结果:
  10. Traceback (most recent call last):
  11. File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 8, in
  12. <module>
  13. for i in 123:
  14. TypeError: 'int' object is not iterable

迭代数据类型和迭代器

(1)可迭代对象可以使用__iter__()来获取到迭代器

(2)迭代器里面有__next__()

例:

  1. s = ''
  2. for i in s:
  3. print(i)
  4. print(dir(str)) # dir查看xx类型的数据可以执行哪些方法, __iter__ iterable
  5. print(dir(list)) # __iter__
  6. print(dir(int)) # 没有__iter__
  7. # 所有的带__iter__可以使用for循环的, 可迭代对象
  8.  
  9. 结果:
  10. 1
  11. 2
  12. 3
  13. ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
  14. ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
  15. ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

查看一个对象是否是可迭代对象的方法:

(偏方)

  1. print("__iter__" in dir(it))
  2. print("__next__" in dir(it))
  3. 可以通过dir来判断数据是否是可迭代的, 以及数据是否是迭代器

(官方方法)

from collections import Iterable # 可迭代对象    from collections import Iterator # 迭代器

迭代器的特点:

1. 只能向前.

2. 几乎不占用内存, 节省内存(需要明天生成器)

3. for循环

4. 惰性机制 (面试题,难度系数比较高)

例:

  1. s = "石可心喜欢赵一宁"
  2. it = s.__iter__() # 获取迭代器
  3. print(dir(it)) # 迭代器里有__iter__ 还有__next__
  4.  
  5. print(it.__next__()) # 石
  6. print(it.__next__()) # 可
  7. print(it.__next__())#
  8. print(it.__next__())#
  9. print(it.__next__())#欢
  10. print(it.__next__())#赵
  11. print(it.__next__())#
  12. print(it.__next__())#

重点: 迭代器模拟for循环(使用while循环+迭代器来模拟for循环(必须要掌握))

for循环的内部机制.

  1. 首先获取到迭代器.

  2. 使用while循环获取数据

  3. it.__next__()来获取数据

  4. 处理异常 try:xxx          except StopIteration:

写法:

  1. it = lst.__iter__() # 获取迭代器
  2. while 1:
  3. try: # 尝试执行
  4. el = it.__next__() # 获取下一个元素
  5. print(el)
  6. except StopIteration: # 处理错误
  7. break
  8.  
  9. ##### ( 重 点 ) #####

python全栈 函数名 闭包及迭代器的更多相关文章

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

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

  2. python基础 (函数名,闭包,和迭代器)

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

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

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

  4. python中的函数名,闭包,迭代器

    一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...

  5. Python全栈开发之4、迭代器、生成器、装饰器

    一.迭代器 1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依 ...

  6. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  7. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  8. python全栈开发之匿名函数和递归函数

    python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...

  9. python全栈开发从入门到放弃之迭代器生成器

    1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable  可迭代的 可迭 ...

随机推荐

  1. ROS 进阶学习笔记(13) - Combine Subscriber and Publisher in Python, ROS

    Combine Subscriber and Publisher in Python, ROS This article will describe an example of Combining S ...

  2. docker私有仓库pull/push

    相关条件: 登录 配置秘钥

  3. <转载>ant使用指南详细入门教程 http://www.jb51.net/article/67041.htm

    这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装.验证安装.使用方法.使用实例.ant命令等内容,需要的朋友可以参考下 一.概述 ant 是一个将软件编译.测试.部署等步骤联系在一起 ...

  4. SPARK快学大数据分析概要

    Spark 是一个用来实现快速而通用的集群计算的平台.在速度方面,Spark 扩展了广泛使用的MapReduce 计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理.在处理大规模数据集时,速 ...

  5. 在keil调用Notepad++

    先打开keil, 新建一个 取名为notepad 选择notepad++的安装路径 设置参数 保持后可以看多了notepad的选项 运行当前的文件在notepad++打开

  6. linux集群时间同步搭建

    http://xstarcd.github.io/wiki/sysadmin/ntpd.html http://www.voidcn.com/blog/xuxudede1989/article/p-4 ...

  7. js event

    event jquery获取: 在jquery中调用函数中最多只能有event这一个参数,所有的值在event.data中可以获取. $('select').click(function(event) ...

  8. UI5-学习篇-7-Postman测试SAP OData Services

    1.Postman简介 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具. postman ...

  9. BlockingQueue之DelayQueue的学习使用

    DelayQueue 是一中阻塞队列,需要实现接口Delayed定义的方法.做下使用记录和心得吧, @Datapublic class DelayQueueExample implements Del ...

  10. C#反射机制详解

    反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包 ...