一、函数名的应用

函数名类似于特殊的变量,打印函数名就是打印函数的内存地址

① 函数名就是函数的内存地址

def func():
pass >>>func
<function func at 0x000001C0BDDAF400>

② 函数名可以作为变量

def func():
print(666) f = func
f() # f() == func()

③ 函数名可以作为函数的参数传入

def func1():
print(666) def func2(x):
x() # x() == func1() func2(func1)

④ 函数名可以当作函数的返回值

def fun1():
def fun2():
print(666)
return fun2 f = fun1() # f = fun2
f() # f() == fun2()

⑤ 函数名可以作为容器类类型的元素

def func1():
print(111) def func2():
print(222) def func3():
print(333) li = [func1,func2,func3]
for i in li:
i() # func1(),func2(),func3()

Python中一切皆对象,函数名就是第一类对象

global()    #  将所有全局变量以字典的形式返回

a = 1
b = 2
c = 3
print(globals()) # 结果
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001F867E586A0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Day11/exercise.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3}

locals()      # 将当前作用域(当前位置)的局部变量以字典的形式返回

def func():
a = 1
b = 2
c = 3
print(locals()) >>>func()
{'c': 3, 'b': 2, 'a': 1}

LEGB

二、闭包

装饰器的本质就是闭包

面试题:闭包在哪里使用?(爬虫和装饰器会用到闭包)

定义:内层函数对外层函数的变量(非全局变量)的引用,并将函数名返回,这样就形成了闭包。

子函数对父级函数的变量进行引用,并且返回函数名,就是闭包。

函数内部定义的函数称为内部函数,内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数

def wraaper():
name = 'xiaoming'
def inner():
print(name)
inner()
return inner
wraaper() # 结果
xiaoming

函数名.__closure__

name = 'xiaoming'
def wraaper(args):
def inner():
print(args)
inner()
print(inner.__closure__)
return inner wraaper(name) # 结果
xiaoming
(<cell at 0x000001CAD4F678B8: str object at 0x000001CAD4E40A30>,)

返回None就不是闭包

name = 'xiaoming'
def wraaper():
def inner():
print(name)
inner()
print(inner.__closure__)
return inner wraaper() # 结果
xiaoming
None

闭包的作用:

  当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,叫局部名称空间,随着函数的结束而消失。

  如果这个函数内部形成了闭包,那么它就不会随着函数的结束而消失,在内存中会一直存在。

三、迭代器

可迭代对象:对象内部含有__iter__方法就是可迭代对象

可迭代对象:str(字符串)、list(列表)、dict(字典)、tuple(元组)、set(集合)、range()

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

判断对象是否可迭代对象的方法:

① 判断__iter__是否在对象的方法中,用dir()

dir() 查看对象内的所有属性和方法

s = 'abcde'
print('__iter__'in dir(s)) # dir() 查看对象内的所有属性和方法 # 结果
True

②  isinstance() 判断是否可迭代对象

iisinstance() 判断是否属于某个已知类型,sinstance() 能判断从属于哪种类型,type()判断哪种基本数据类型

from collections import Iterable
li = [1,2,3,4,5]
print(isinstance(li,Iterable)) # 判断对象是否可迭代对象

迭代器:对象内部含有__iter__方法且含有__next__方法就是迭代器

判断对象是否迭代器

① 对象是否含有__iter__和__next__方法

li = [1,2,3,4,5]
print('__iter__' in dir(li))
print('__next__' in dir(li)) # 结果
True
False

② isinstance 判断是否迭代器

from collections import Iterator
dic = {'a':1 ,'b':2 ,'c':3}
print(isinstance(dic,Iterator)) # 结果
False

可迭代对象是不能取值,迭代器就是通过__next__方法可以一个一个取值。

for循环可迭代对象是for循环内部做了优化才能取值,for含有__next__方法,因为可迭代对象没有__next__方法

四、可迭代对象可以转化为迭代器

转化方法一:__iter__() 方法

from collections import Iterator
dic = {'a':1 ,'b':2 ,'c':3}
itel = dic.__iter__() # 转化为迭代器
print(itel) # 打印是否迭代器
print(isinstance(itel,Iterator)) # 判断对象是否迭代器 # 结果
<dict_keyiterator object at 0x000002049DC76868>
True

转化方法二: iter() 方法

from collections import Iterator
li = ['a','b','c',1,2,3]
itel = iter(li) # 转化为迭代器
print(itel) # 打印是否迭代器
print(isinstance(itel,Iterator)) # 判断对象是否迭代器 # 结果
<list_iterator object at 0x0000016BEA6F7748>
True

五、迭代器的取值

迭代器的取值方式:通过__next__()方法取值,next一次取一个值

Iterator.__next__()

li = ['a','b','c',1,2,3]
itel = iter(li) # 转化为迭代器
i = itel.__next__() # 通过__next__()方法取值
print(i)
i = itel.__next__() # 通过__next__()方法取值
print(i) # 结果
a
b

六、迭代器的好处:

① 可迭代对象不能取值,迭代器是可以取值的

② 迭代器非常节省内存 (__next__()一次就加载一个,加载下一个元素后,上一个元素就会释放掉,跟for的机制相似)

③ 迭代器每次在内存中只会取一个值(一个 next 对应取一个值)

④  迭代器单向的,不反复,一条路走到头。next下一个就找不到上一个了,只能全部取完再重新找

迭代器的使用:

① 迭代器没索引,为了取值

② 数据量大的时候

for 循环机制:

① 将可迭代对象转化为迭代器

② 调用__next__()方法取值

③ 利用异常处理停止报错

while 循环模拟for循环的机制

s1 = 'abcdefghijklmn'
iter = s1.__iter__() while 1:
try:
print(iter.__next__())
except StopIteration:
break

文件就是迭代器

Python函数Day3的更多相关文章

  1. Python 函数 day3

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...

  2. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  3. python笔记 - day3

    python笔记 - day3 参考:http://www.cnblogs.com/wupeiqi/articles/5453708.html set特性: 1.无序 2.不重复 3.可嵌套 函数: ...

  4. python s12 day3

    python s12 day3   深浅拷贝 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  5. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  6. Python函数讲解

    Python函数

  7. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  8. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  9. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

随机推荐

  1. CentOS7下yum安装Redis

    (1).Redis概述 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value(键值型)数据库(非关系型数据库),并提供多种语言的API. Redi ...

  2. ABAP函数篇2 测试DATE_CONVERT_TO_FACTORYDATE

    DATE_CONVERT_TO_FACTORYDATE   根据日期返回工厂日历日期 函数功能说明: 标出工作日的计算方法 输入传输 CORRECT_OPTION = '+'如果指定的日期不是工作日, ...

  3. 海康威视实时预览回调PS流用EasyRTMP向RTMP服务器推流中视频数据处理的代码

    在上一篇方案<EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)>我们介绍了将海康安防摄像机进行互联网直播的整体方案流程,其中有一个 ...

  4. HDU1237 简单计算器 栈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...

  5. windows7 + iis7 + fastcgi + php5 + netbeans + xdebug 调试 php

    Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. windows7 + iis7 + fastcgi + php5 + netbe ...

  6. 最新 博盾习言java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 博盾习言等10家互联网公司的校招Offer,因为某些自身原因最终选择了 博盾习言.6.7月主要是做系统复习.项目复盘.Le ...

  7. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  8. 学习笔记:oracle学习三:SQL语言基础之sql语言简介、用户模式

    目录 1.sql语言简介 1.1 sql语言特点 1.2 sql语言分类 1.3 sql语言的编写规则 2.用户模式 2.1 模式与模式对象 2.2 实例模式scott 本系列是作为学习笔记,用于记录 ...

  9. spring 整合guava

    一.ApplicationContext.xml中的配置 <!--开启缓存注解--> <cache:annotation-driven /> <bean id=" ...

  10. Quartz.Net—Calendar

    动态的排除一些触发器的时间. DailyCalendar-天日历 定义: This implementation of the Calendar excludes (or includes - see ...