前言

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

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. JavaSE20-线程&同步

    1.线程 1.1 基本概念 线程的概念 线程(Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并 ...

  2. Java中多线程安全问题实例分析

    案例 1 package com.duyang.thread.basic.basethread; 2 3 /** 4 * @author :jiaolian 5 * @date :Created in ...

  3. vue中的样式绑定

    样式绑定 样式绑定有class绑定和style绑定,这里我们分别说说 class绑定 class样式绑定与有两种语法:对象语法(v-bind:class='{active:isActive}').数组 ...

  4. 多任务-python实现-进程,协程,线程总结(2.1.16)

    @ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...

  5. SQL注入练习第一天

    MySQL 相关知识 在MySQL中,把[INFORMATION_SCHEMA] 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的 ...

  6. Linux下源码安装方式安装MySQL

    1.下载安装包:https://downloads.mysql.com/archives/community/  2.安装开发工具和安装包 因为要把源码编译成二进制数据,所以必须要有编译器和解释器 g ...

  7. 【命令】htop命令

    一.Htop的使用简介 大家可能对top监控软件比较熟悉,今天我为大家介绍另外一个监控软件Htop,姑且称之为top的增强版,相比top其有着很多自身的优势.如下: 两者相比起来,top比较繁琐 默认 ...

  8. idea提交svn不显示新建文件

    在idea中,使用svn提交时可能会出现 预期文件没出现在提交目录里. 是因为没有把新建文件添加到版本控制里. 解决办法:右键选择文件→subversion→add to  vcs. 自动把新文件添加 ...

  9. C# ——获取各国时间

    DateTime dt = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, TimeZoneInfo.Local); DateTime dt1 = TimeZo ...

  10. [标签] Java学习日报7.28

    package minG;import java.util.*;public class MinG { public static void main(String[] args) { // TODO ...