【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象
函数名可以像变量一样进行使用
1.赋值
def func(): print("你吃了么?") # print(func) # a = func # 函数名就是一个变量 # print(a) # func() # a() # 就是一个函数的调用 def a(): print("我吃了") func = a func()
2.作为list元素
a = 8 b = 7 c = 1 d = 3 lst = [a, b , c, d] print(lst) def f1(): print("我是马化腾") def f2(): print("我是马云") def f3(): print("我是马赛克") def f4(): print("我是马蔚华") lst = [f1(), f2(), f3(), f4()] print(lst)
3.作为参数
# 还可以作为函数的参数 def func(food): print("吃", food) a = "火锅" func(a) def func(fn): fn() def gn(): print("我是火锅, 刚才有人要吃我") func(gn) # 可以把函数作为参数, 传递给另一个函数
4.作为返回值
def func(): def inner(): print("火锅不让吃了. 吃了上火") return inner ret = func() # 这里func()执行之后获取到的是inner函数 ret() # 这里是让inner函数执行
2, 闭包
内部函数访问外部函数的局部变量.
好处:
1.安全
2.常驻内存. 提高效率
name = "wusir" # 变量写在全局是不安全的 def abc(): global name name ="呵呵" abc() def func(): name = "alex" # 常驻内存 防止其他程序改变这个变量 def inner(): print(name) # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存 return inner ret = func() ret() # 执行的是inner() ret() ret() ret() ret()
# 闭包的好处 from urllib.request import urlopen def but(): content = urlopen("http://www.h3c.com/cn/").read() def inner(): print("你好啊") # return content # 在函数内部使用了外部的变量 . 闭包 print(inner.__closure__) # 查看inner是否是闭包, 如果有东西就是闭包, 没东西就不是闭包 return inner print("加载中........") fn = but() # 这个时候就开始加载校花100 的内容 # 后⾯需要⽤到这⾥⾯的内容就不需要在执⾏⾮常耗时的⽹络连接操作了 content = fn() # 获取内容 print(content) content2 = fn() # 重新获取内容 print(content2)
3, 迭代器
可迭代对象(Iterable):内部包含__iter__().
迭代器(Iterator): 内部含有__iter__() __next__()
str, list, tuple, set, dict
f, range
s = "北京欢迎您" for c in s: print(c) for i in 123: print(i) # 可迭代对象: str, list, tuple, set, f, dict # 所有的以上数据类型中都有一个函数__iter__(), 所有包含了__iter__()的数据类型都是可迭代的数据类型 Iterable # dir()来查看一个对象,数据类型中包含了哪些东西 lst = [1,2,3] # list # print(dir(lst)) s = "王尼玛" print("__iter__" in dir(s)) print("__iter__" in dir(lst)) print("__iter__" in dir(123)) list是一个Iterable.可迭代的 lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"] 获取迭代器 it = lst.__iter__() # 迭代器往外拿元素. __next__() print(it.__next__()) # 皇阿玛 print(it.__next__()) # 皇额娘 print(it.__next__()) # 容嬷嬷 print(it.__next__()) # 紫薇 print(it.__next__()) # 迭代到最后一个元素之后. 再进行迭代就报错了 lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"] # 模拟for循环 it = lst.__iter__() while True: try: name = it.__next__() print(name) except StopIteration: # 拿完了 break lst = [1, 2, 3] from collections import Iterable # 可迭代的 from collections import Iterator # 迭代器 # isinstence(对象, 类型) 判断xx对象是否是xxx类型的 print(isinstance(lst, Iterable)) print(isinstance(lst, Iterator)) it = lst.__iter__() print(isinstance(it, Iterable)) # 判断是否是可迭代的 迭代器一定是可迭代的 print(isinstance(it, Iterator)) # 迭代器里面一定有__next__(), __iter__() print("__iter__" in dir(lst)) # 确定是一个可迭代的 print("__next__" in dir(lst)) # 确定不是一个迭代器 f = open("01 今日内容大纲",mode="r", encoding="utf-8") print(isinstance(f, Iterable)) print(isinstance(f, Iterator))
迭代器的特点:
1.省内存
2.惰性机制
3.只能向前.
lst = ["哈哈", "呵呵"] it = lst.__iter__() it.__next__() print(it.__next__()) print("我要吃黄瓜") print(it.__next__())
【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器的更多相关文章
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- 跟着太白老师学python day11 函数名的应用 globals(), locals()
1. 函数名就是内存地址 def func(): ') print(func) >>>> <function func at 0x00000000003DC1E0> ...
- day 12 函数名的应用 闭包 迭代器
今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...
- 学习笔记《简明python教程》
学习笔记<简明python教程> 体会:言简意赅,很适合新手入门 2018年3月14日21:45:59 1.global 语句 在不使用 global 语句的情况下,不可能为一个定义于函数 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
随机推荐
- python 使用dir() help() 查看一个对象所有拥有的方法和属性
可以使用python 的内置方法 dir() 或者help() 查看 某个对象所拥有的方法和属性, 二者间的区别是: dir() : 只是得到方法或者属性的名称 help():不但可以得到对象的方法和 ...
- django url 路由设置技巧
Django的url使用方法 利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 ...
- Binary Search Tree-530. Minimum Absolute Difference in BST
Given a binary search tree with non-negative values, find the minimum absolute difference between va ...
- xss跨站脚本攻击汇总
- Unity色子的投掷与点数的获得(详解)
前几天需要一个色子的投掷并且获得朝上点数的Unity脚本,在网上找了很多,都是一个模子刻出来的. 对于2018版的我来说,网上找的都是很早就弃用了的老版本. 好不容易能运行了,结果并不理想,于是又突发 ...
- POJ 1067
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...
- js02--对象、函数、switch、for、异常、表单验证
现在我们接着来继续学习有关js的一些基础. 1.undefined与null undefined:当变量声明但尚未赋值时,它的类型就是undefined null:表示一个不存在的对象,它 ...
- 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 1、经常提及的问题
Frequently Asked Questions Congratulations to be part of the first class of the Deep Learning Specia ...
- 【转】linux下杀死进程(kill)的N种方法
转载一篇,最原始的出处已不可考,望见谅! 常规篇: 首先,用ps查看进程,方法如下: $ ps -ef ……smx 1822 1 0 11:38 ? 00:00:4 ...
- spring boot整合RabbitMQ(Fanout模式)
1.Fanout Exchange介绍Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略. 如上图所示, ...