前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入


1.Pythonic - 很Python

写一段代码生成1到100之间的数字的平方的列表,答案是:

1,4,9,16...

如果你这样写,你就不Pythonic了:

nums = []
for i in range(1,101):
nums.append(i*i)
print(nums)

正确的写法是使用Python的推导式:

nums = [i*i for i in range(1,101)]

2.带条件的推导式

生成一个列表,包含1到100之间是3的倍数的数字的方法:

9,36,81...

代码:

nums = [i*i for i in range(1,101) if i%3==0]

3.带条件的表达式

生成一个列表,如果是3的倍数就用平方,否则就用是数字本身:

1,2,9,4,5,36...

代码:

nums = [i*i if i%3==0 else i for i in range(1,101)]

结合上面的3个例子,来看一下推导式总结:

  • 推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
  • 推导式可以加推导条件,只对符合条件的元素推导
  • 要推导出的元素使用表达式生成,可以用if else生成不同元素
[表达式 if 表达式条件 else 分支 for i in 序列 if 推导条件]

4.使用函数

如果推导条件或者表达式特别复杂怎么办?可以使用函数。

推导所有1-100之间的所有质数:2,3,5,7...

def is_prime(num):
if num == 1:
return False
for i in range(2,num):
if (num % i) == 0:
return False
else:
return True p_nums = [i for i in range(1,100) if is_prime(i)]
print(p_nums)

把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。

同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。

推导1900到2021年之间所有的年份,标记出闰年,生成结果:

1900, 1901, 1902, 1903, '闰1904'

代码:

def is_run(year):
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
return True # 整百年能被400整除的是闰年
else:
return False
else:
return True # 非整百年能被4整除的为闰年
else:
return False ryears = [f'闰{y}' if is_run(y) else y for y in range(1900, 2021)]
print(ryears)

5.嵌套表达式 - 不推荐使用

从2000年到2021年,生成每个月份:'2000年:1月', '2000年:2月', '2020年:3月', ..., '2021年:12月'

monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]

这里有两个for循环,类似于:

monthes = []
for y in range(2000, 2022):
for m in range(1,13):
monthes.append(f'{y}年:{m}月')

6.推导巨大的列表 - 不要这么干!

推导出1到100亿之间的数字的平方,代码如下:

nums = [i*i for i in range(1,10000000000)]

但是这段代码很可能会卡死你的电脑,除非你的电脑是超级计算机。因为它要在内存中做100亿次计算,然后保存这100亿个数字。

7.使用生成器

这种情况下,我们应该使用推导生成器,用法很简单:

  • 把方括号改成圆括号就可以了
nums = (i*i for i in range(1,10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))

打印出来是一个生成器:

<generator object <genexpr> at 0x7fa0b422feb0>
1
4
9

这是一个生成器,它不会一次性生成100亿个数字,只有调用next()的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。

8.推导字典

推导字典的方式和推导列表很相似,只不过:

  • 使用大括号
  • 使用键值对
    推导一个包含数字和数字平方组成的字典,结果是这样的:
{1: 1, 2: 4, 3: 9, ..., 100: 10000}

代码:

nums_dict = {n:n*n for n in range(1,101)}
print(nums_dict)

反过来,平方在前面,数字在后面:

nums_dict = {n*n:n for n in range(1,101)}
print(nums_dict)

给下面的字典按照分数排序:

{'麦叔':59, '张三':87, 'FGA':78, '石石':100, '莫名':90}

排序结果:

{'石石': 100, '莫名': 90, '张三': 87, 'FGA': 78, '麦叔': 59}

代码:

scores = {'麦叔':59, '张三':87, 'FGA':78, '石石':100, '莫名':90}
sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)}
print(sored_scores)

1.先把字典scores变成一个元组列表:scores.items()
2.用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1], reverse=True)
3.排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是第一列。
4.指定倒着排序,也就是分数高的在前面:reverse=True
5.使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in ... }

9.推导集合Set

推导集合的方式和列表是一样的,区别在于:

1.使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
2.集合会自动过滤掉重复的元素。
下面的名字列表,去掉前后空格后去掉重复的名字:

[ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]

推导结果:

{'石石', 'FGA', '张小三', '莫名', '张三', '麦叔'}

代码:

names = [ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]
new_names = {n.strip() for n in names}
print(new_names)

奇技淫巧,还是正统功夫? - Python推导式最全用法的更多相关文章

  1. python推导式pythonic必备【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  2. python推导式pythonic必备

    编程规范 今天公司新出了一套Python编程规范2.0,一直觉得自己写代码路子有点野,所以仔细的看了下. 多数的内容在网上都能搜到,但有几点需要说说 让我觉得羞愧的注释率 公司要求代码注释行,占代码总 ...

  3. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...

  4. Python推导式

    Python推导式 推导式:是Python中提供的一个非常方便的功能,可以通过一行代码实现创建 list.dict.tuple.set的同时初始化一些值. 1.列表推到式 # -*- coding: ...

  5. python推导式与海象运算符

    背景:介绍两种python用于语句优化的用法 一.推导式 1.推导式简介: Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体. 支持:列表(list).元 ...

  6. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  7. python 推导式和迭代器、生成器

    1.常用推导式 推导式是从一个或者多个迭代器快速简洁创建数据结构的一种方法. 1.1 _ 列表推导式 最简单的形式:  [exprssion for item in iterable] 示例:  nu ...

  8. python 推导式

    推导式又称解析式,是Python的一种独有特性.目的是可以从一个数据序列推导出另一个数据序列,适用于python 的list ,dict 和集合 list中的推导式: _list=[i for i i ...

  9. Python 推导式、迭代器、生成器、模块和包

    一.推导式 (一).列表推导式(集合推导式也同理于此) 利用列表推导式,取出1-20内所有偶数 li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一 ...

随机推荐

  1. easyui form提交时验证必填,打开时不显示必填提示

    给textbox添加required:true属性后,打开页面时整个表单都是红的,需要将其设置为提交时再验证. 解决方法:通过textbox的novalidate属性来控制是否开启验证 <inp ...

  2. jmeter__问题记录,中文乱码问题(json参数化)

    这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...

  3. Docker(一):Docker安装

    简介   Docker是dotcloud公司开源的一款产品,主要基于PAAS平台为开发者提供服务.是解决运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术. Docker组件 ...

  4. mysql-创建用户报错ERROR 1396 (HY000): Operation CREATE USER failed for 'XXXX'@'XXXX'

    创建用户: create user 'test'@'%' identified by 'test'; 显示ERROR 1396 (HY000): Operation CREATE USER faile ...

  5. css 08-CSS属性:定位属性

    08-CSS属性:定位属性 CSS的定位属性有三种,分别是绝对定位.相对定位.固定定位. position: absolute; <!-- 绝对定位 --> position: relat ...

  6. 个人微信公众号搭建Python实现 -个人公众号搭建-处理消息和事件(14.3.4)

    @ 目录 1.消息处理 2.事件处理 3.返回处理 关于作者 1.消息处理 现在只处理text文本消息 没有关键字的就交给qingyunke机器人去应付,这是一个免费的对话api 从配置文件中读取关键 ...

  7. php 文件上传错误

    假设文件上传字段的名称img,则: $_FILES['img']['error']有以下几种类型 1.UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功. 2.UPLOAD_ERR_I ...

  8. CentOS7下常用安装软件服务rpm方式的介绍

    简介:介绍rpm软件包的管理 rpm安装:安装别人编译好的软件包,rpm即Redhat Package Manager,是Redhat的软件包管理方式   rpm安装优点: 软件已经编译打包,所以传输 ...

  9. Windows 64位下安装Redis 以及 可视化工具Redis Desktop Manager的安装和使用

    二.下载Windows版本的Redis 由于现在官网上只提供Linux版本的下载,所以我们只能在Github上下载Windows版本的Redis Windows版本的Redis下载地址:https:/ ...

  10. 解决qt程序运行时的cannot create Qt for Embedded Linux data directory: /tmp/qtembedded-0

    方法1: 1.mkdir /tmp 2.挂载 mount -t tmpfs -o size=32m none /tmp 方法2: 上面的user 0h说明你是以root用户的身份运行.可以尝试切换一下 ...