前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​测试开发进阶-2.数据类型及推导式、迭代器和生成器

​测试开发进阶-2.数据类型及推导式、迭代器和生成器

作者头像
ITester软件测试小栈
发布2019-11-14 17:06:52
2310
发布2019-11-14 17:06:52
举报
文章被收录于专栏:全栈测试全栈测试

结构化工程

https://pythonguidecn.readthedocs.io/zh/latest/writing/structure.html

  • readme:对项目的整体介绍,同时也是一份使用手册
  • LICENS:阐述该项目的许可说明和授权
  • setup.py:通过setup把核心代码打包
  • api_test:存放项目的核心代码
  • requirements.txt:项目依赖的第三方库
  • docs:包的参考文档
  • tests:代码的测试
  • makefile:同于项目的管理,根据项目需求添加其他的文件和目录

数据类型扩展

基本数据类型

数值

  • 整数
  • 浮点数
  • 布尔类型
  • decimal
  • 复数

序列类型

  • 字符串
  • 元组
  • 列表

元组在定义的时候就确认了存放的空间,内存固定,占用空间较小 列表的空间可以动态变化,内存占用的空间比元组大的多 在数据固定的情况下使用元组

散列

  • 字典
  • 集合

命名元组

代码语言:javascript
复制
from collections import namedtuple

普通元组:

代码语言:javascript
复制
tu = ('zx', '1994', '男')
print(tu[0])

命名元组:

使用namedtuple相当于创建了一个类,s1相当于实例话了一个包含name,age,gender三个属性的类。

__main__:当前模块下

代码语言:javascript
复制
from collections import namedtuple

student = namedtuple('Student', ['name', 'age', 'gender'])
print(type(student)) # <class 'type'> 一个类    

s1 = student('zx', '1994', '男')
print(type(s1)) # <class '__main__.Student'>
print(s1.name) # zx
print(s1[0]) # zx

推导式

列表推导式

普通列表创建

代码语言:javascript
复制
l = [1, 2, 3, 4]

urls = []
for i in range(0,101,10):
    urls.append(f'http://....?page={i}')
print(urls)
"""
['http://....?page=0', 'http://....?page=10', 'http://....?page=20', 'http://....?page=30', 'http://....?page=40', 'http://....?page=50', 'http://....?page=60', 'http://....?page=70', 'http://....?page=80', 'http://....?page=90', 'http://....?page=100']
"""

列表推导式

代码语言:javascript
复制
urls = [f'http://....?page={i}' for i in range(0,101,10)]
print(urls)
"""
['http://....?page=0', 'http://....?page=10', 'http://....?page=20', 'http://....?page=30', 'http://....?page=40', 'http://....?page=50', 'http://....?page=60', 'http://....?page=70', 'http://....?page=80', 'http://....?page=90', 'http://....?page=100']
"""

三目运算

代码语言:javascript
复制
a = 10
if a > 5:
    print(5)
else:
    print(0)
代码语言:javascript
复制
a = 4
res = 5 if a > 5 else 0 # (判断语句成立)if(判断语句)else(判断语句不成立)
print(res) # 0
res = 5 if a > 5 else ('=' if a > 5 else "!")
print(res) # !

结合列表推导式

代码语言:javascript
复制
[i for i in range(10) if i % 2 == 0] # [0, 2, 4, 6, 8]
[i if i % 2 == 0 else -1 for i in range(10) ] # [0, -1, 2, -1, 4, -1, 6, -1, 8, -1]
字典推导式
代码语言:javascript
复制
dic = {i for i in [1, 2, 3]} 
# 集合{1, 2, 3}

dic = {i: 1 for i in [1, 2, 3]} 
# 字典{1: 1, 2: 1, 3: 1}

dic = {k: v for k in [1, 2, 3] for v in [3, 2, 1]}
# {1: 1, 2: 1, 3: 1} 错误 ❌❌❌
dic = {k: v for k, v in zip([1, 2, 3], [3, 2, 1])}
# {1: 3, 2: 2, 3: 1} 正确 ✅✅✅
# 其实就是:
dict(zip([1, 2, 3], [3, 2, 1]))
生成器表达式
代码语言:javascript
复制
tu = (i for i in range(5))
# <generator object <genexpr> at 0x11433d138>
next(tu) # 0
next(tu) # 1
next(tu) # 2
next(tu) # 3
next(tu) # 4
next(tu) 
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/02/0807_2.py", line 33, in <module>
    print(next(tu))
StopIteration
"""

迭代器和生成器

生成器的作用:当我们要存储大量数据的时候,使用生成器可以节约内存

创建生成器的方式:

  1. 生成器表达式
  2. yield

只能用于函数中,当一个函数中出现yield这个关键字,那么这个函数就是一个生成器函数。

代码语言:javascript
复制
# yield 后面不写东西
def gen():
    for i in range(100000):
        yield
res = gen() # <generator object gen at 0x114203138>    
next(res) # None
代码语言:javascript
复制
# yield 后面写i
def gen1():
    for i in range(100000):
        yield i
res = gen()
next(res) # 1
next(res) # 2
代码语言:javascript
复制
def gen3():
    for i in range(100000):
        print(f'{i}--*******')
        yield i
        print(f'{i}--#######')
res = gen3()
print(res)
print(next(res))
"""
第一次next打印内容
0--*******
0
"""
print(next(res))
"""
第一次next打印内容
0--*******
0
第二次next打印内容
0--#######
1--*******
1
"""
可迭代对象和迭代器
  • 可迭代对象

对象内部实现了迭代协议的称之为可迭代对象 迭代协议:该对象实现了__iter__

  • 可迭代对象都可以使用for循环进行遍历
  • 能够使用for循环进行遍历的都是可迭代对象
代码语言:javascript
复制
li = [11, 22, 33, 44]
for i in li:
    print(i)
  • 迭代器

要求:

  1. 对象实现了迭代协议
  2. 内部还要实现_next方法

next()方法 通过iter()可以将可迭代对象转化为迭代器

生成器是一种特殊的迭代器

代码语言:javascript
复制
li = [11, 22, 33, 44]
item = iter(li)
print(item) # <list_iterator object at 0x1032c8390>
print(next(item)) # 11

迭代器和生成器的区别:

生成器相比迭代器多了三种方法:send(),close(),throw()

  • send():与生成器内部进行数据交互
代码语言:javascript
复制
def gen():
    i = 0
    while i < 10:
        j = yield i
        print(j)
        i += 1


g = gen()
print(g) # <generator object gen at 0x114203138>
print(next(g)) # 0
print(next(g)) # None 1
print(g.send(8)) # 8 2
代码语言:javascript
复制
def gen1():
    i = 0
    while i < 10:
        j = yield i
        if j is not None:
            i = j
        i += 1
g = gen1()
print(next(g)) # 0
print(g.send(8)) # 9
print(g.send(5)) # 6
print(g.send(10))
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/02/0807_5.py", line 26, in <module>
    print(g.send(10))
StopIteration
"""
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ITester软件测试小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结构化工程
  • 数据类型扩展
    • 基本数据类型
      • 命名元组
        • 推导式
          • 列表推导式
          • 字典推导式
          • 生成器表达式
        • 迭代器和生成器
          • 可迭代对象和迭代器
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档