测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》
坚持原创输出,点击蓝字关注我吧
作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
目录
- 一、列表推导式
- 二、字典推导式
- 三、2种方式创建生成器
- 1.生成器表达式
- 2.函数里面,通过 yield 定义生成器
一、列表推导式
推导式可以帮助我们快速创建列表、创建字典。比如现在要创建一个列表。
做自动化测试的时候,比如创建个 url 列表,url 列表里面可能是存储了网站的页数:
一直到 100,生成 100 个页面,但是这 100 个页面有规律,url 地址,前面这一部分是不变的,只有后面的 1,2,3,4 这部分的变化。
如果去生成这样一个列表,不用列表推导式,用之前的方法的话,可以这样做,先定义一个空列表:
urls = []
然后来个 for 循环 set 100 个:
for i in range(1,101):
前面字符串这部分是确定的,比如说一个 page,后面这部分不确定,就来个format()
给它填进去。
url = 'page{}'.format(i)
通过append()
把 url 加进去。
# url = ['page1','page2']
urls = []
for i in range(1,101):
url = 'page{}'.format(i)
urls.append(url)
print(urls)
能够生成 1-100 个页面。
推导式有个优势,一行就能解决。推导式可以看成 for 循环的一个解体。
写起来特别简单,同样的功能,推导式可以这样写:
# 列表推导式
urls1 = [i for i in range(1,101)]
print(urls1)
这段列表推导式代码解释是:
for
循环,i
从 range
里面循环,循环出来拿出一个 i
,然后往前面放到这个列表里面。
再拿出一个 i
放到这个列表里面,这样重复(拿出一个 i
放到列表里面),直到把 for
循环遍历完。
将里面所有的元素都拿出来放到列表里面,最后生成一个新的列表,这就是列表推导式。
里面是 1-100 个数字:
如果用列表推导式生成这个 page1,到 100 页。代码就修改成这样:
urls1 = ['page{}'.format(i) for i in range(1,101)]
print(urls1)
'page{}'.format(i)
format()
格式化字符串的函数。
# 列表推导式
urls1 = ['page{}'.format(i) for i in range(1,101)]
print(urls1)
简而言之,就是遍历出来的元素放到这个前面就行了。然后在前面,你可以做其它操作。
以上,这就是用列表推导式快速生成一个列表。
二、字典推导式
字典推导式和列表推导式,它的原理是一样的。都用 for 循环去遍历,然后拿出对应的值在前面,生成对应的值。
每遍历一轮,会把前面你写的内容放到字典里面去。前面写个键,键就是遍历出来的i
,对应的值就是i+1
。
dict1 = {i:i+1 for i in range(10)}
print(dict1)
键就是遍历出来的i
,值就是键的基础上加 1。每循环遍历一轮,这个就生成一个键值对。
推导式可以推导出字典,也可以推导出列表。大括号、中括号、花括号都可以。
推导式改成小括号后是什么?
中括号是列表,花括号是字典,小括号是元组。
推导式改成小括号后,不再是个元组了,是个生成器。
# () 生成器表达式
tu = (i for i in range(10)) #生成器对象
print(tu)
三、2种方式创建生成器
1.生成器表达式
1.1 什么是生成器?
这里有很多数据,可以把它装到一个 “就像自动取筷盒,拿出一双筷子,自动下来一双筷子”,就是你要用的时候,它给你生成一个出来。
生成器不像列表,比如创建个列表,比如列表里面有一千个元素,创建列表的时候,那么这一千个元素已经被创建好放在列表里面了。生成器不是这样,它内部只保留了一个生成器计算的规则。
1.2 使用生成器的好处
生成器要生成一千个元素,这样:
tu = [i for i in range(1000)]#生成器对象
直接生成一千个元素的列表。改成生成器,这个生成器对象里面存储的是一个计算公式,并没有存储这一千条数据啊。
使用生成器来存储这些数据的话,相对于列表的优势是:不那么占内存。
一千条数据可能看不出效果,如果是一千万条数据往列表里面一放,那得占用多大的内存啊。如果是个生成器,里面就是个计算的规则,就是个生成的规则,没有那么多数据,节约内存,可以提高代码的性能。
1.3 拿生成器里面的数据,也可以一个一个得拿,怎么拿呢?
生成器表达式,打印出来是个生成器。
当然,可以通过list
把它转换成一个列表。
tu = (i for i in range(1000))#生成器对象
print(list(tu))
它可以把生成器里面所有的元素都拿出来转换成列表。
通过生成器表达式来定义生成器,一次想拿一个元素,怎么拿呢?
Python 里面有个内置的函数,叫做next()
。把生成器对象放进去,得到一个结果:
# () 生成器表达式
tu = (i for i in range(1000))#生成器对象
a = next(tu)
print(a)
print(next(tu))
交互环境中可以看到:
它依次生成,要的时候,从生成器里面拿一个出来就行了。你要用的时候就去拿,它就一直生成,它就把里面所有的元素都取出来。
1.4 所有的元素都取出来之后,我又拿了一次,它会出现什么情况呢?
会报错。
生成器可以用来节约内存,提高代码性能。生成器在于你什么时候用,你什么时候去取值。
2.函数里面,通过 yield 定义生成器
除了生成器表达式可以创建生成器,还有另外一个方式。Python 关键字里面有个yield
参数。
yield
这个关键字是用在函数里面的,这个关键字只能在函数里面用。
函数定义完之后,只要在函数里面调用函数,那就会执行函数里面的代码。
def gen_fun():
print('清菡 加油')
gen_fun()
如果当一个函数里面,有yield
这个关键字:
def gen_fun():
yield
print('清菡 加油')
gen_fun()
这个时候再去运行这个函数,这个函数不会立即运行。
2.1 为什么不会立即运行呢?
这个函数运行的时候,默认是没有写return
的。
def gen_fun():
# yield
print('清菡 加油')
res = gen_fun()
print(res)
如果函数里面出现了yield
这个关键字,这个时候再看下。
函数没有写return
,调用函数,它里面,代码没有执行,但是有返回结果,返回的结果是:
返回的是一个生成器。
通过yield
定义出来的这个函数,是个生成器函数。
调用这个函数的时候,它会给你返回一个生成器对象。既然它是一个生成器对象,那么就可以通过next()
来对它进行取值。
运行结果如下:
# 通过yield定义生成器
def gen_fun():
yield
print('清菡 加油')
res = gen_fun() #返回生成器对象
print(next(res))
你看到输出结果是:None
2.2 为什么是 None 呢?
生成器生成的元素在yield
关键字后面。
# 通过yield定义生成器
def gen_fun():
yield 100
print('清菡 加油')
res = gen_fun() #返回生成器对象
print(next(res))
再写 2 个yield
:
# 通过yield定义生成器
def gen_fun():
yield 100
print('清菡 加油')
yield 1000
yield 100100
res = gen_fun() #返回生成器对象
print(next(res))
生成器函数: 只有通过next()
取值的时候,它才会执行函数里面的代码。
next()
一次,就运行到第一个yield
这里,把这个结果返回出来。然后到这个地方,暂停了不动了,不会往下走了。
如果在下面再next()
,从生成器里面再获取一个元素:
print(next(res))
直到等到下一个next()
取值。当你下一次从生成器函数里面取值的时候,才会触发下一个yield
。
# 通过yield定义生成器
def gen_fun():
yield 100
print('清菡 加油')
yield 1000
yield 100100
res = gen_fun() #返回生成器对象
print(next(res))
print(next(res))
print(next(res))
但是如果全部都生成完了,再去取一次,就会报错:
因为里面已经没有元素了。
以上,生成器只有通过这 2 种方式定义。
公众号 「清菡软件测试」 首发,更多原创文章:清菡软件测试 108+原创文章,欢迎关注、交流,禁止第三方擅自转载。
测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》的更多相关文章
- 【Java_多线程并发编程】基础篇—线程状态及实现多线程的两种方式
1.Java多线程的概念 同一时间段内,位于同一处理器上多个已开启但未执行完毕的线程叫做多线程.他们通过轮寻获得CPU处理时间,从而在宏观上构成一种同时在执行的假象,实质上在任意时刻只有一个线程获得C ...
- JS中检测数据类型的几种方式及优缺点【转】
1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string&quo ...
- JS中检测数据类型的几种方式及优缺点
1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string&quo ...
- JS中检测数据类型的四种方式及每个方式的优缺点
//1.typeof 用来检测数据类型的运算符 //->typeof value //->返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number". ...
- HBase读写的几种方式(三)flink篇
1. HBase连接的方式概况 主要分为: 纯Java API读写HBase的方式: Spark读写HBase的方式: Flink读写HBase的方式: HBase通过Phoenix读写的方式: 第一 ...
- 【Spark篇】---SparkSQL初始和创建DataFrame的几种方式
一.前述 1.SparkSQL介绍 Hive是Shark的前身,Shark是SparkSQL的前身,SparkSQL产生的根本原因是其完全脱离了Hive的限制. SparkSQL支持查询原 ...
- 测开之Python自动化全栈工程师+性能专项(送思维导图)
测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...
- ArcEngine开发之Command控件使用篇
转自原文 ArcEngine开发之Command控件使用篇 在ArcEngine类库中有大量的Command控件用来与地图控件进行操作和交互.比如有一系列的地图浏览控件.地图查询控件.图斑选取控件.编 ...
- 测开新手:从0到1,自动化测试接入Jenkins学习
大家好,我叫董鑫,一个在测试开发道路上的新手,之前一直从事手工功能测试,前段时间抽空又温习了一遍老师全栈测开训练营中自动化测试.CICD的知识,最近公司正好有一个项目可以实践练手,趁热打铁,将自动化测 ...
随机推荐
- 云服务器-Ubuntu更新系统版本-更新Linux内核-服务器安全配置优化-防反弹shell
购入了一台阿里云的ESC服务器,以前都用CentOS感觉Yum不怎么方便,这次选的Ubuntu16.04.7 搭好服务之后做安全检查,发现Ubuntu16.04版本漏洞众多:虽然也没有涉及到16.04 ...
- 如何突出显示PDF文档中的一些重要文本信息
PDF文档中如果存在着太多的文字时,阅读者会容易遗漏很多重要的信息.但如果,文档中存在着一些特殊标记的文字时,比如标黄.标红文本时,很多人都会给予特别关注. 因此,当大家在使用pdfFactory专业 ...
- 如何修改IDM下载器的临时文件夹位置
所有的应用程序在下载时,都会有一些默认的选项.比如产生的临时文件存放在C盘目录下,或者定期自动更新等设置.那么当我们的计算机上安装了很多程序之后,C盘的空间就会渐渐地变小了,从而有了空间不足等等情况, ...
- [COCI2016-2017#1] Mag 结论证明
结论:最多包含一个 \(2\),并且不在链的两端点. 证明:我们问题分成两个 \(\texttt{pass}\). \(\texttt{pass 1}\):\(\forall u,s.t.x_{u}\ ...
- 【微信开发】缓存的asscess_token过期
开发中有遇到这样一个问题,我们一般会将从微信拿到的寿命2个小时的access_token缓存起来,业务里这个缓存的时间是90分钟, 90分钟之后缓存过期,会重新请求新的access_token使旧的a ...
- zk特性
看了又忘系列: 1.zk会将全量的数据存储在内存中,以此来实现提高服务器吞吐,减少延迟的目的. 2.集群中每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相互保持着通信.只要集群中存在超过 ...
- Tiops评测
一.前言 前几天参加了一个新钛云服公有课,才了解到这家公司有发布自己产品Tiops云运维堡垒机. 在此之前有了解过JumpServer,可以完美支持windows和linux server运维管理,以 ...
- 适合 JS 新手学习的开源项目——在 GitHub 学编程
作者:HelloGitHub-小鱼干 这里是 HelloGitHub 的<GitHub 上适合新手的开源项目>系列的最后一篇,系列文章: C++ 篇 Python 篇 Go 篇 Java ...
- Fiddler 4的安装
1.双击FiddlerSetup_2.0.20194.413.exe安装包 2点击同意 3.傻瓜式安装即可 4.安装完就是这个样子 5.然后点这个 然后不管出现什么都点yes(或者是),最后点击ok ...
- NOIp2020游记
Day 1 考点还是在南航,第三次去已经没有什么新鲜感了,满脑子都是NOIp能不能考好.考前奶了一波这次必考最短路,于是在试机的时候打了一遍Dij和SPFA的板子,信心满满的上场了. 考试右后方是Ki ...