初学python之路-day14
一、带参装饰器
# 通常,装饰器为被装饰的函数添加新功能,需要外界的参数 # -- outer参数固定一个,就是func # -- inner参数固定同被装饰的函数,也不能添加新参数 # -- 可以借助函数的嵌套定义,外层给内层传参 def wrap(info): def outer(func): # info = 0 def inner(*args, **kwargs): print('新:拓展的新功能,可能也需要外界的参数%s' % info) res = func(*args, **kwargs) return res return inner return outer @wrap('外部参数') def fn(): pass
# 系统的wraps带参装饰器:改变inner的假指向,本质外界使用的还是inner,但是打印显示的是wraps中的函数 from functools import wraps def outer(func): @wraps(func) def inner(*args, **kwargs): res = func(*args, **kwargs) return res return inner @outer def fn(): pass
二、迭代器
# 迭代器对象: 可以不用依赖索引取值的容器 # 可迭代对象:可以通过某种方法得到迭代器对象 # 迭代器优点:可以不用依赖索引取值 # 迭代器缺点:只能从前往后依次取值
三、可迭代对象
# 可迭代对象:有__iter__()方法的对象是可迭代对象,可迭代对象调用__iter__()得到迭代器对象 ls = [4, 1, 5, 2, 3] res = ls.__iter__() # => 可迭代对象 print(res) # <list_iterator object at 0x000002732B0C7470>
四、迭代器对象
# 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行取值 with open('1.txt', 'rb') as f: res = f.__next__() # 文件中的第一行内容 print(res) res = f.__next__() # 文件中的第二行内容 print(res)
五、for循环迭代器
# 直接用while True循环在迭代器对象中通过 __next__() 取值,终究会有取空的时候,取空再取值,报StopIteration异常 ls = [3, 1, 2, 3, 5] iterator = ls.__iter__() while True: try: print(iterator.__next__()) except StopIteration: # print('取空了') break # for循环就是对while取迭代器对象的封装 for v in ls: print(v) for v in ls.__iter__(): # 可迭代对象.__iter__() => 迭代器对象 print(v) iterator = ls.__iter__() for v in iterator: # 迭代器对象.__iter__() => 自身 print(v)
# for循环迭代器的工作原理: # for v in obj: pass # 1)获取obj.__iter__()的结果,就是得到要操作的 迭代器对象 # 2)迭代器对象通过__next__()方法进行取值,依次将当前循环的取值结果赋值给v # 3)当取值抛异常,自动处理StopIteration异常结束取值循环
六、枚举对象
# 给可迭代器对象及迭代器对象添加迭代索引 s = 'abc' for v in enumerate(s): print(v) # (0 'a') | (1 'b') | (2 'c')
七、生成器
# 生成器:自定义的迭代器对象 # -- 就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有多少变化 # 总结:有yield关键字的函数,函数名() 不是调用函数,而是生成得到 生成器对象,生成器对象就是迭代器对象,可以通过 __next__() 进行取值 # 执行流程: def fn(): yield 1 yield 3 yield 5 obj = fn() obj.__next__() # 从开始往下执行,遇到第一个yield停止,拿到yield的返回值 obj.__next__() # 从上一次停止的yield往下执行,在再遇到的yield时停止,拿到当前停止的yield的返回值 # ... # 以此类推,直到无法获得下一个yield,抛StopIteration异常 # 可以直接被for循环遍历 for v in fn(): print v
# 案例一:创建生成器,从其取值,依次得到1! 2! 3! ... def jiecheng(): ji = 1 count = 1 while True: ji *= count yield ji count += 1 obj = jiecheng() print(obj.__next__()) print(obj.__next__()) print(obj.__next__()) # 可以无限取
# 案例二: def jiecheng_num(num): ji = 1 for i in range(1, num + 1): ji *= i yield ji # ... obj = jiecheng_num(3) print(obj.__next__()) print(obj.__next__()) print(obj.__next__()) print(obj.__next__()) # 有异常了 for v in jiecheng_num(5): print(v) # 会自动处理异常停止
# 案例三: def my_range(num): # => [0, 1, 2, ..., num - 1] count = 0 while count < num: yield count count += 1 for v in my_range(10): print(v, end=' ') print(list(my_range(10)))
初学python之路-day14的更多相关文章
- Python之路,Day14 - It's time for Django
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django ...
- 初学python之路-day12
本篇补上字符串的比较:按照从左往右比较每一个字符,通过字符对应的ascii进行比较 一.函数默认值的细节 # 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值 a ...
- 初学python之路-day10
基础部分先告一段落,今天开始学习函数. 一.函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数 -- 现实中:很多问题要通过一些工具进行处理 => ...
- 初学python之路-day08前期总结
# 1# 计算机原理:控制器 运算器 存储器 input设备 output设备 IO流# 三大核心:CPU 内存 硬盘 # 内存分布:栈区 与 堆区# 如二进制与十进制的转换,如1111转成十进制为1 ...
- 初学python之路-day08
#学习了编码后,还要了解三种字符串.# 一.# 普通字符串:u''以字符作为输出单位,# print(u'abc') # 用于显示abc# # 二进制字符串:b'' 二进制字符串以字节作为输出单位# ...
- 初学python之路-day07-字符编码
今天的博客主要关于字符编码,并对前几天学习的数据类型做些总结. 学习字符编码的目的:解决乱码问题. 应用程序打开文本文件的三步骤 1.打开应用程序 2.将数据加载到内存中 3.cpu将内存中的数 ...
- 初学python之路-day04
每天一篇总结,今天学习的是有关于流程控制的知识. 流程控制,顾名思义,在计算机运行中,程序是被某种控制方式按照某种流程或者规律来执行的.而python程序的运行,肯定也是按照某种规律在执行.这些规律可 ...
- 初学python之路-day03
我在前面的文章提到了变量的概念,这里详细介绍下变量的命名.变量名,只能是字母.数字及下划线 "_" 任意组成,而且不能以数字开头.在命名变量时,尽量避免与系统关键词重名,如:'an ...
- 初学python之路-day02
python,诞生于1989年的圣诞,Guido van Rossum为了打发无聊,因此发明了python,并且开放了其源代码,使得这门语言在随后的几十年的发展的越来越广.现今,2.x版本已经在2.7 ...
随机推荐
- Newtonsoft.Json 的基本用法
Ø 前言 说起 C# 对 JSON 的操作(序列化与反序列化),大家都会想到 JavaScriptSerializer.DataContractJsonSerializer 与 Newtonsoft ...
- MVC入门教程
MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...
- 一款好用的wangEditor编辑器
文档:https://www.kancloud.cn/wangfupeng/wangeditor3/332599
- php的2种域名转向写法
第一种 echo '<meta http-equiv="Refresh" content="0;url=' . $url . '">' ; 第二种 ...
- 往github上传代码忽略node_modules文件夹
首先必须在你初始化 git 仓库的那个文件夹建立 .gitigonre 文件,在这个文件夹里面写入下面代码 node_modules npm-debug.log package-lock.json ...
- javascript 的类式继承(构造函数)
<script type="text/javascript"> //类式继承(构造函数) var father = function(){ this.age = 52; ...
- 【mmall】Jackson序列化时isSuccess()方法的注意点
参考链接:遭遇fastjson的一个坑
- 线程池-Executors
合理使用线程池能够带来三个好处 减少创建和销毁线程上所花的时间以及系统资源的开销 提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行 提高线程的客观理性.线程是稀缺资源,如果无限制的创 ...
- img大小和background-size
img 不设置img标签的width和height,将显示图片真实大小 只设置width或height,另一个将按比例自动缩放 设置了width和height,将按设置的大小来显示 img图片自适应( ...
- Python换行符问题:\r\n还是\n?
今天写一个Python脚本去读取一个txt文件时,发现一个很有趣的现象: 如果这个文件是用atom编辑器写的,发现换行符是'\r'.这样一来去逐行读取数据就失效了,因为用open函数 去打开该文件re ...