python3 列表/字典/集合推导式
'''各种推导式
列表推导式:[结果 for循环 if条件]
字典推导式:[k:v for循环 if条件]
集合推导式:{结果 for循环 if条件}
没有元组推导式:
生成器推导式:(结果 for循环 if条件)
'''
'''生成器表达式:(结果 for 循环 if 条件)''' g = (i * 2 for i in range(10) if i %2 == 0)
print(g) # 此时打印的就是一个生成器对象,并不是数据
print(list(g)) # list()函数可以把一个生成器拿空,并拿到列表[0, 4, 8, 12, 16]
'''迭代器:可以一个一个的拿到数据,具有__iter__和__next__方法
可迭代对象:具有__iter__的方法
通过__iter__可以拿到一个对象的迭代器
迭代器特点:
1.省内存(生成器)
2.惰性机制(不执行__next__不拿值)
3.只能向前,不能反复(拿光了就没了) for循环内部使用的就是迭代器。
当一个迭代器内的元素被拿空之后,继续执行__next__会报错:StopIteration 生成器本质就是迭代器。
生成器有两种创建方式:
1、生成器函数
2、生成器表达式 生成器函数:函数内部有yield语句就是生成器函数
'''
def gen():
print(111)
yield "apple"
g = gen() # 注意,这句话并没有执行gen()这个函数,而是通过gen函数创建了一个生成器
ret = g.__next__() # 此时才开始执行生成器,并返回yield后面的数据。 返回:111
print(ret) # apple
'''集合推导式{key for循环 if语句}'''
lst = [3, 5, 1, 5, 2, 1, 7]
s = {i for i in lst}
print(s) 返回结果:
{1, 2, 3, 5, 7}
'''字典推导式{key:value fox循环 if语句}'''
lst = ["apple", "orange", "banana"]
dic = {k:v for k,v in enumerate(lst)}
print(dic) 返回结果:
{0: 'apple', 1: 'orange', 2: 'banana'}
'''在[3,6,9]的基础上推到出[[1,2,3], [4,5,6],[7,8,9]]'''
print([[i-2, i-1, i] for i in [3, 6, 9]]) 返回结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 2, 3, 4, 25, 36, 49, 64, 81]
[25, 36, 49, 64, 81]
['apple', 'orange']
[1, 4, 9, 16, 25, 36]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
'''使用列表推导式得到[1, 4, 9, 16, 25, 36]'''
print([i*i for i in range(1, 7)])
'''列表生成式可以快速的创建一个列表'''
lst = [i*i for i in range(10)]
print(lst)
lst2 = [i if i < 5 else i*i for i in range(10)]
print(lst2)
lst3 = [i*i for i in range(10) if i >= 5]
print(lst3)
lst4 = [i for i in ["apple", "orange", "banana", "pear"] if i.endswith("e")]
print(lst4)
'''
列表推导式[结果 for 变量 in 可迭代对象 if 条件]
获取1-100内所有的偶数
'''
lst = [i for i in range(1, 101) if i % 2 == 0]
print(lst)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
'''生成器表达式:(结果 for 变量 in 可迭代对象)'''
gen = (i for i in range(10))
print(gen) # <generator object <genexpr> at 0x0000000007B28200>
print(list(gen)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object <genexpr> at 0x0000000007A8B728>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
生成器表达式:(结果 for 变量 in 可迭代对象 if条件)
获取1-100内能被3整除的数
'''
gen = (i for i in range(1, 100) if i %3 == 0)
print(gen) # <generator object <genexpr> at 0x0000000006085D58>
print(list(gen)) # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
<generator object <genexpr> at 0x0000000006085D58>
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
'''100以内能被3整除的数的平方'''
gen = (i**2 for i in range(1, 100) if i % 3 == 0)
print(gen) # <generator object <genexpr> at 0x0000000007A8B258>
print(list(gen))
<generator object <genexpr> at 0x0000000007A8B258>
[9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304, 2601, 2916, 3249, 3600, 3969, 4356, 4761, 5184, 5625, 6084, 6561, 7056, 7569, 8100, 8649, 9216, 9801]
'''(结果 for 变量1 in 可迭代对象 for 变量 in 变量1 if条件)
寻找名字中带有两个e的人的名字
'''
names = [["tom", "Billy", "Jefferson", "Andrew", "Wesley", "Steven", "Joe"],
["Alice", "Jill", "Ana", "Wendy", "Jennifer", "Sherry", "Eva"]]
gen = (name for name_lst in names for name in name_lst if name.count("e") > 1)
print(gen) # <generator object <genexpr> at 0x0000000006085CA8>
print(list(gen)) # ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
<generator object <genexpr> at 0x0000000006085CA8>
['Jefferson', 'Wesley', 'Steven', 'Jennifer']
'''生成器表达式和列表推导式的区别
1、列表推导式比较耗内存,一次性加载。生成器表达式几乎不占用内存,使用的时候才分配和使用内存。
2、得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器。
'''
'''生成器,取值的时候才拿值'''
def func():
print(111)
yield 222 g = func() # 生成器g
g1 = (i for i in g) # 生成器g1
g2 = (i for i in g1) # 生成器g2 print(list(g)) # 111 [222]
print(list(g1)) # []
print(list(g2)) # []
111
[222]
[]
[]
'''字典推导式{k:v for 变量 in 可迭代对象}'''
dic = {"a": 1, "b": 2}
new_dic = {dic[key]: key for key in dic}
print(new_dic) # {1: 'a', 2: 'b'} dic2 = {dic[k]:k for k in dic}
print(dic2) # {1: 'a', 2: 'b'}
{1: 'a', 2: 'b'}
{1: 'a', 2: 'b'}
'''一个列表元素作为键值,一个列表元素作为值'''
lst = ["apple" , "banana", "orange"]
lst2 = ["苹果", "香蕉", "桔子"]
dic = {lst[i]: lst2[i] for i in range(len(lst))}
print(dic) # {'apple': '苹果', 'banana': '香蕉', 'orange': '桔子'}
{'apple': '苹果', 'banana': '香蕉', 'orange': '桔子'}
'''
集合推导式: {结果 for 变量 in 可迭代对象}
取绝对值
'''
lst = [1, -1, 8, -8 , 12]
s = {abs(i) for i in lst}
print(s) # {8, 1, 12}
{8, 1, 12}
python3 列表/字典/集合推导式的更多相关文章
- Python迭代器生成器,私有变量及列表字典集合推导式(二)
1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...
- python数据类型详解及列表字典集合推导式详解
一.运算符 Python语言支持以下类型的运算符: 算术运算符 如: #!/usr/bin/env python # -*- coding:utf-8 -*- a = 5 b = 6 print(a ...
- Python的列表推导式,字典推导式,集合推导式使用方法
推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...
- python的各种推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式
一.生成器 1.1 生成器:就是(python)自己用代码写的迭代器,生成器的本质就是迭代器. 1.2 生成器函数 def func1(x): x += print() yield x print() ...
- Python基础8:列表推导式(list)字典推导式(dict) 集合推导式(set)
推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...
- python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- Python中的推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)
# 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...
随机推荐
- Django的模板系统
一.语法 关于模板渲染只需要记住两种特殊符号(语法): {{ }} 和 {% %} (变量相关用{{ }} 逻辑相关用{% %}) 二.变量 在Django的模板语言中按照{{ 变量名 }}来使用 ...
- Javascript URI 解析介绍
URI 在维基百科中对于URI的解释是这样子的: 在计算机术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识 ...
- iphone屏幕镜像怎么用 手机投屏电脑
手机看视频有的时候总会感觉到累,屏幕太小看的不够爽又或者用手一直拿着手机看累得慌.我就就喜欢看电视因为电视屏幕大看的爽,而且现在很多手机视频都可以往电视上投影视频,那么iphone屏幕镜像怎么用? 使 ...
- Ubuntu-Tweak 安装
Ubuntu Tweak 是中国人开发的一款专门为Ubuntu准备的配置.调整工具,类似与compiz,界面更友好. 下面是安装命令: 第一步:添加tweak源 sudo add-apt-re ...
- Implemented the “Importance Sampling of Reflections from Hair Fibers”
Just the indirect specular pass by importance sampling. With all layers. Manually traced by 3D Ham ...
- 在插件中得到,调用 插件的id
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- git 入门教程之里程碑式标签
"春风得意马蹄疾,一日看尽长安花",对于项目也是如此,最值得期待的恐怕就要数新版本发布的时刻了吧?每当发布新版本时要么是版本号命名(比如v0.0.1)或者代号命名(比如Chelse ...
- MySQL优化技巧【持续更新】
前言 应用程序或web网页有时慢的像蜗牛爬似的,可能是网络原因,可能是系统架构原因,还有可能是数据库原因.那么如何提高数据库SQL语句执行速度呢?下面是积累的一些优化技巧,望对君有用. 正文 1.比较 ...
- MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例
上周,以前公司的同事朋友找我帮忙,看看能否帮忙恢复一个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不清楚),也不清楚具体的数据库引擎; 没有数据库备份,只剩下数据库下面 ...
- [20170612]FOR ALL COLUMNS SIZE repeat(12c).txt
[20170612]FOR ALL COLUMNS SIZE repeat(12c).txt --//昨天看了https://jonathanlewis.wordpress.com/2017/06/0 ...