写一段代码生成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 Truep_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))

打印出来是一个生成器: at 0x7fa0b422feb0>149

这是一个生成器,它不会一次性生成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)先把字典scores变成一个元组列表:scores.items()

用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1], reverse=True)

排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是第一列。

指定倒着排序,也就是分数高的在前面:reverse=True

使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in ... }

9 推导集合Set

推导集合的方式和列表是一样的,区别在于:使用大括号,类似于推导字典,但它是单个元素,而不是键值对。

集合会自动过滤掉重复的元素。

下面的名字列表,去掉前后空格后去掉重复的名字:[ '麦叔', '张三', ' 麦叔 ', 'FGA ', '张小三', 'FGA', '石石',' 莫名','莫名' ]

推导结果:{'石石', 'FGA', '张小三', '莫名', '张三', '麦叔'}

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

python同或符号_奇技淫巧,还是正统功夫? - Python推导式最全用法相关推荐

  1. python交并补符号_三种方式实现 Python 中的集合的交、并、补运算-阿里云开发者社区...

    三种方式实现 Python 中的集合的交.并.补运算 一 背景 集合这个概念在我们高中阶段就有所了解,毕业已多年,我们一起回顾一下几个集合相关的基本概念吧? 集合是指具有某种特定性质的具体的或抽象的对 ...

  2. python标示注释符号_【填空题】Python使用符号( ) 标示单行注释 (5.0分)

    [填空题]Python使用符号( ) 标示单行注释 (5.0分) 更多相关问题 [单选题]效率比率是反映( )关系的财务比率. [单选题]在OSPF网络中,一个区域与另一个区域相连接的路由器是( ). ...

  3. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  4. python代码编写工具_编写更好的Python代码的终极指南

    python代码编写工具 Despite its 尽管它 downsides, Python remains the king of today's programming world. Its ve ...

  5. math python 向上取整_计算机等级考试二级Python语言模拟试卷单选解答详解第1期...

    模拟试卷单选题20题 有粉丝私信希望增加一些针对国家二级Python考级的小练习和答题详解.所以就有了模拟试卷的题目讲解. 第1题:下面的程序运行结果是( ) 解答: 这是一个变量作用域的问题,变量分 ...

  6. python find不区分大小写_牛鹭学院:Python基础了解

    本文来自牛鹭学院学员:田雨 python初印象 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言. Python 是交互式语言: 在一个 Python ...

  7. python数据分析模块包括_数据开发必会 | Python数据分析模块

    作为数据开发,Python强大的数据分析模块还是必须要会的,横向拓展数据分析与挖掘技术栈也是很有必要的.本文将对Pandas.NumPy.SciPy.Matplotlib等分析挖掘库的安装和使用进行简 ...

  8. python语言属于什么_最近很火的Python是什么?属于什么语言?

    Python是一种脚本语言,可以直接运行后,消除编译和链接的麻烦.初学者来说需要更多的动手实践,减少错误的机会.和Python也有一个互动的方式.如果它是一个简单的小程序,甚至可以保存编辑器,它可以直 ...

  9. python扩展c教程_使用C/C++扩展Python

    如果你会用C,实现Python嵌入模块很简单.利用扩展模块可做很多Python不方便做的事情,他们可以直接调用C库和系统调用. 为了支持扩展,Python API定义了一系列函数.宏和变量,提供了对P ...

最新文章

  1. [原] Android中怎么将图片平铺
  2. 怎样让你的安全预算更具战略性?
  3. python打开word并在前台显示_Python自动化办公之Word,全网最全看这一篇就够了
  4. 设计模式之一:单例模式(Singleton Pattern)
  5. 考研英语一2011年翻译真题详解
  6. 从源码层面带你实现一个自动注入注解
  7. html定义字体纵向对齐,HTML5 Canvas的文本如何实现垂直对齐
  8. 解决win2003不支持FLV播放的方法
  9. UVA12771 LA6528 Disjoint water supply【并查集+DAG】
  10. 用python画漂亮图-python如何画出漂亮的地图?
  11. php常用mysql语句_PHP中常用到的一些MySQL语句
  12. AIML应答机器人(一)aiml简介
  13. python 双冒号_python双冒号
  14. 每日案例(第五期):智慧金融11-12 | 知识图谱实践案例集(速读版)
  15. wishbone协议(B.3)下载地址
  16. 一篇文章带你搞定 SpringBoot 配合 SpringSecurity 实现自动登录功能
  17. canvas 系列学习笔记二《绘制图形》
  18. 福昕PDF不可编辑解决方法
  19. 树莓派软路由Openwrt
  20. java基础(三) IDEA使用与多线程编程

热门文章

  1. html5移动端开发(rem和媒体查询@media)
  2. android在github上调用aar文件
  3. ios 网络状态获取_Network Kit X——网络检测工具箱
  4. python映射的主要特点_30 个 Python 语言的特点技巧
  5. 二年级计算机认识键盘教案,认识计算机键盘教案.doc
  6. Unity中Light Probe详解
  7. 面试java常问的问题_java面试官常问的问题
  8. 使用YOLO Core ML模型构建对象检测iOS应用(七)
  9. 项目内出现广告位引争议,开源如何持续健康运营?
  10. 要不要引入新技术?先思考这几个问题