python基础学习Day11 函数名的应用、闭包、迭代器
一、函数名的应用
1、函数名就是函数的内存地址
def func():
print(666)
func()
print(func) #函数的内存地址
2、函数名可以作为变量
def func1():
print(666)
f1 = func1
f2 = f1
f2() #执行结果为 666
3、函数名可以作为函数的参数
def func1():
print(666)
def func2(x):
x()
func2(func1)
4、函数名可以作为函数的返回值
def wraaper():
def inner():
print('in the inner')
return inner
ret = wraaper()
ret()
5、函数名可以作为容器类类型的元素
def func1():
print('in zhe func1')
def func2():
print('in the func2')
def func3():
print('in the func3')
def func4():
print('in the func4')
l1 = [func1,func2,func3,func4]
for i in l1:
i()
以上函数名这种为:第一类对象
1、可以运行期创建
2、可用作函数参数或返回值
3、可以存入变量的实体
globals() # 返回全局变量的一个字典
locals() # 返回当前位置的局部变量的字典
def func1():
a = 2
b = 3
print(globals())
print(locals())
def inner():
c = 5
d = 6
print(globals()) # 全局变量的字典
print(locals()) # {'b': 3, 'a': 2}
inner()
print(globals()) # 全局变量的字典
print(locals()) # {'d': 6, 'c': 5}
func1()
二、闭包
2.1 闭包的作用:当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间.如果函数内部形成了闭包,那么他就不会随着函数的结束而消失。
举例爬虫闭包:
from urllib.request import urlopen
def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read
return get
xiaohua = index() # get
content = xiaohua() # get()
2.2 什么是闭包? 内层函数对外层函数的变量(非全局变量)的引用,并返回。这样就形成了闭包
def wraaper():
name = 'alex' # 引用非全局变量
def inner():
print(name)
print(inner.__closure__) # (<cell at 0x00000223146565E8: str object at 0x000002231461A768>,)
inner() # 说明是一个闭包
return inner
wraaper()
name = 'alex' # 引用全局变量
def wraaper():
def inner():
print(name)
print(inner.__closure__) # None,引用了全局变量,所以不是闭包
inner()
return inner
wraaper()
三、迭代器
3.1.1 可迭代对象
for i in 'abc':
print(i)
for i in 123:
print(i) #'int' object is not iterable 整数不是可迭代对象
注:可迭代对象:str、list、dict、tuple、set、rang()
3.1.2 判断一个对象是否是可迭代对象:
第一种方法:
s1 = [1,2,3]
print('__iter__'in dir(s1)) # True
第二种方法:
from collections import Iterable
print(isinstance('alex',Iterable)) # True
引导:这个方法还可以判断数据是什么数据类型
from collections import Iterable
print(isinstance('alex',str)) # True
3.2.1迭代器
判别方法:对象内部含有__iter__方法且含有__next__方法就是迭代器。
f = open('regsiter',encoding='utf-8')
print('__iter__' in dir(f)) # True
print('__next__' in dir(f)) # True
f.close()
3.2.2 可迭代对象——>>(转化成)迭代器
lis = [1,2,3] # 可迭代对象
itel = lis.__iter__() # 迭代器<list_iterator object at 0x0000020750163DD8>
# itel = iter(lis) # 迭代器<list_iterator object at 0x0000020750163DD8>
print(itel)
3.2.3 迭代器如何取值? next一次,取一个值
lis = [1,2,3] # 可迭代对象
itel = lis.__iter__() #(转化成)迭代器
print(itel.__next__()) print(itel.__next__()) print(itel.__next__())
3.2.4 可迭代对象与迭代器的区别
1、可迭代对象不能取值,迭代器是可以取值的
2、迭代器非常节省内存。
3、迭代器每次只会取一个值。
4、迭代器是单向的,一条路走到头
3.2.5 while 循环模拟for循环
for 循环
l1 = 'abcdefg'
for i in l1:
print(i)
while 循环模拟for循环
l1 = 'abcdef'
l = l1.__iter__() # 将可迭代对象转换成迭代器
while :
try:
print(l.__next__()) # 调用__next__()方法取值
except StopIteration: # 利用异常处理停止报错
break
python基础学习Day11 函数名的应用、闭包、迭代器的更多相关文章
- Python基础学习四 函数
1.内置函数 Python内置了很多有用的函数,是可以直接调用的. 参考链接:https://docs.python.org/3/library/functions.html 调用函数的时候,如果传入 ...
- python基础学习Day9 函数的初识,实参、形参、
1.函数 def my_len(): l = [,,,,,,] count = for i in l: count += print(count) my_len() 定义的my_len()方法时,其结 ...
- 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
- python基础学习之函数进阶【匿名函数、作用域关系、闭包、递归】
匿名函数 lambda的用法: lambda x:x+1 解释,同等于以下函数 def test(x): return x+1 因为没有函数名,所以称为匿名函数 只适用于简易的逻辑,复杂逻辑无法实现 ...
- python基础学习之函数基础和部分内置函数
在函数调用的时候,必备参数必须要传入 函数定义: def 函数名: 代码块pass return 返回值 函数名命名规则: 字母.数字和下划线组成,和变量命名规则一致 pass在这里表示什么都没有 ...
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- day 12 函数名的应用 闭包 迭代器
今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...
- python基础学习2 函数变量与赋值
学习的第一步,就是通常的输出函数:print() 1.基础主要学习了变量的赋值,变量名可以疑字母.数字.下划线(_)进行命名,但是不能以数字开头 变量的赋值:变量名 = 变量值 2.模块的导入,和调用 ...
- python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal
一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...
随机推荐
- CS229 6.11 Neurons Networks implements of self-taught learning
在machine learning领域,更多的数据往往强于更优秀的算法,然而现实中的情况是一般人无法获取大量的已标注数据,这时候可以通过无监督方法获取大量的未标注数据,自学习( self-taught ...
- 「2017 山东一轮集训 Day5」距离
/* 写完开店再写这个题目顿时神清气爽, 腰也不疼了, 眼也不花了 首先考虑将询问拆开, 就是查询一些到根的链和点k的关系 根据我们开店的结论, 一个点集到一个定点的距离和可以分三部分算 那么就很简单 ...
- Python: json模块实例详解
ref:https://www.jianshu.com/p/e29611244810 https://www.cnblogs.com/qq78292959/p/3467937.html https:/ ...
- 500 Internal Privoxy Error
打开网站突然发现网站无法打开了,一脸懵逼,服务器重启也不行,明明能ping通,网上查的答案千奇百怪的 500 Internal Privoxy Error Privoxy encountered an ...
- 图算法之——dijkstra算法
一.算法特点 目标:找出加权图中前往X的最短路径 适用于:无环有向加权图,且各边的权值为正 二.算法思路 三.算法示例演示 如下图,请找出结点v1到其他各个结点的最短路径: 首先创建一个字典(散列表) ...
- WPF DataGrid多表头/列头,多行头,合并单元格,一列占据多行
先上效果图: 思路说明:这是两个DataGrid,没有嵌套,位置和高度保持一致,在加上ScrollViewer滚动条,这就像是在一个DataGrid中. 缺点: 因为最外层有透明的Border,所以没 ...
- day2----python的基本类型
本文档的大致内容:(python使用版本3.6.4) 1 数字--int 2 布尔--bool 3 字符串--str 4 元祖--() 5 列表---['a','b'] 6 字典--{} 运算符: ...
- 遇到的问题&思考
MYSQL需要批量修改表前缀: http://jingyan.baidu.com/article/11c17a2c742561f446e39d2f.html Select CONCAT( 'ALTER ...
- springboot工程的添加方式
1.将spring boot做为父工程 <parent> <groupId>org.springframework.boot</groupId> <artif ...
- 《算法》第六章部分程序 part 4
▶ 书中第六章部分程序,包括在加上自己补充的代码,利用后缀树查找最长重复子串.查找最大重复子串并输出其上下文(Key word in context,KWIC).求两字符串的最长公共子串 ● 利用后缀 ...