前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python中的推导式

python中的推导式

作者头像
阿黎逸阳
发布2020-09-08 16:24:25
6610
发布2020-09-08 16:24:25
举报

1. 首先看下运用推导式可以生成哪些有趣的代码

1.1 生成包含100以内所有勾股数(i,j,k)的列表

代码语言:javascript
复制
w = [(i,j,k) for i in range(1, 100) for j in range(1, 100) for k  in range(1,100) if k**2 == i**2 + j**2]
#把前21组勾股定理打印成金字塔的代码
max_level = 50
k = 0
for now_level in range(1,max_level+1):    
    for i in range(max_level-now_level):
        print(' ',end='    ')
    for j in range(now_level-10):
        if k <=20:
            print(w[k],end=' ')
            k += 1
        else:
            pass
    print(' ')

运行代码打印成金字塔的形状如下:

1.2 用推导式生成表白妈妈(mama)和爸爸(baba)的心形图案

代码语言:javascript
复制
print('\n'.join([''.join([('mam'[(x-y)%2]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))
print('\n'.join([''.join([('bab'[(x-y)%2]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))

运行代码得到的结果:

1.3 用推导式生成乘法口诀表

代码语言:javascript
复制
print('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))

运行代码得到的结果:

2. 接下来看下python中三种类型的推导式

2.1 列表推导式

[<表达式> for <变量> in <可迭代对象> if <逻辑条件>]

代码语言:javascript
复制
例子:[i*4 for i in range(10) if i>3]
代码语言:javascript
复制
结果:[16, 20, 24, 28, 32, 36]

代码解析:

首先看 for i in range(10):当 i 依次取 range(10) (0,1,2,3,4,5,6,7,8,9)时

接着看 if i>3 : 当 i 大于3时

最后看 i*4: 得到结果 i*4 的一个列表

可以自己试下下面这个两个例子,加深印象

代码语言:javascript
复制
[x*x for x in range(10) if x%2==0]
[x.upper() for x in [1, 'abc', 'xyz', True] if isinstance(x, str)]

2.2 字典推导式

{<键值表达式>:<元素表达式> for <变量> in <可迭代对象> if <逻辑条件>}

代码语言:javascript
复制
例子:{ 'k%d'  %(x) : x**3  for x in range(10) }
代码语言:javascript
复制
结果:
{'k0': 0,
 'k1': 1,
 'k2': 8,
 'k3': 27,
 'k4': 64,
 'k5': 125,
 'k6': 216,
 'k7': 343,
 'k8': 512,
 'k9': 729}

代码解析:

首先看 for x in range(10): 当 x 依次取 range(10) (0,1,2,3,4,5,6,7,8,9) 时

接着看 k%d : k 为固定值,%d 依次取x的值

最后看 %(x): 依次填充 x**3 的结果到 %(x) 中

可以自己试下下面这个两个例子,加深印象

代码语言:javascript
复制
{ 'k%d'  %(x) : x**2  for x in range(3, 10) }
{ 'k%d'  %(x) : x**2  for x in range(10) if x>5 }

2.3 集合推导式

{<元素表达式> for <变量> in <可迭代对象> if <逻辑条件>}

代码语言:javascript
复制
例子1:{x*x for x in range(-3,3)}
代码语言:javascript
复制
结果1:{0, 1, 4, 9}

代码解析:

首先看 for x in range(-3,3): 当 x 依次取 range(10) (-3,-2,-1,0,1,2) 时

接着看 x*x : 即集合中的原素依次为(9,4,1,0,1,4)

最后由高中所学集合的特性(非重复),可以得到最后结果

代码语言:javascript
复制
例子2:{x+y for x in range(5) for y in range(x)}
代码语言:javascript
复制
结果2:{1, 2, 3, 4, 5, 6, 7}

代码解析:

首先看 for x in range(-3,3): 当 x 依次取 range(10) (-3,-2,-1,0,1,2) 时

接着看 x*x : 即集合中的原素依次为(9,4,1,0,1,4)

最后由高中所学集合的特性(非重复),可以得到最后结果

可以自己试下下面这个两个例子,加深印象

代码语言:javascript
复制
{x+y for x in range(-1,5) for y in range(x)}
{x*x for x in range(10) if x%2==0}

本文是本人使用集合推导式后的一些见解,如有不当之处恳请指正。

参考文献:

1.https://blog.csdn.net/xiuxiu179/article/details/82969267

-end-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档