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个例子,来看一下推导式总结:

  1. 推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
  2. 推导式可以加推导条件,只对符合条件的元素推导
  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. 使用大括号
  2. 使用键值对

推导一个包含数字和数字平方组成的字典,结果是这样的:

{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', '张小三', '莫名', '张三', '麦叔'}

代码:文章来源地址https://www.toymoban.com/news/detail-849687.html

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

到了这里,关于Python推导式 - 最全用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】PIL给图片添加水印最全代码解释

    以下是一个添加水印的方法,你可以将其放在一个单独的 Python 文件中,然后在需要添加水印的地方调用该方法即可: 该方法接受五个参数: image_path :需要添加水印的图片路径; text :水印文本; font_path :字体文件路径; font_size :字体大小,默认为 40; fill :水印颜色,

    2024年02月05日
    浏览(46)
  • 研究一段WPF 3D 机械臂代码

    网上下一段代码,运行如下;显示了一个3D机械臂;      xmlns=\\\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\\\",这是WPF命名空间,一般写在xaml头部,它的是这样的,Viewport3D xmlns=\\\"......;     代码的大段有:相机,变换,ModelVisual3D.Children里面有2个ModelVisual3D,第一个ModelVisual3

    2023年04月09日
    浏览(36)
  • 用HTML写一段3D动态圣诞树代码

    你好! 这是一段用HTML写的3D动态圣诞树的代码: 这段代码会创建一个500x500像素的3D圣诞树,树干是棕色的,树枝是绿色的。树干和树枝会不断旋转360度,形成动画效果。希望这能帮到你!

    2024年02月03日
    浏览(60)
  • Python turtle.shape()用法及代码示例

    在turtle中默认的鼠标形状 可以使用shape()方法来更改他的形状,它总共有以下五种形状: 此函数用于将 turtle 形状设置为具有给定名称的形状,或者,如果未提供名称,则返回当前形状的名称。 用法: turtle.shape(name=None) 带有名称的形状必须存在于Turtle Screen的形状字典中。最初

    2024年04月08日
    浏览(82)
  • Java Stream 最全操作用法合集

    Java 8 引入了Stream流的操作,让我们在开发的过程中感受到了很多的便利,小宋我也花时间总结了下关于Stream的堪称最全的使用方法,话不多说,直接放大招。 Java 8提供了两种方式去创建流: 1、stream stream是串行的,可以理解为它的执行是 按顺序执行 的。 2、parallelStream par

    2024年02月16日
    浏览(51)
  • ScrapeKit库中Swift爬虫程序写一段代码

    以下是一个使用ScrapeKit库的Swift爬虫程序,用于爬取网页视频的代码: 注意:在实际使用中,可能需要根据实际情况对代码进行适当的修改和调整。此外,爬虫程序的使用需要遵守相关法律法规,并尊重网站的使用政策和规定。```

    2024年02月06日
    浏览(49)
  • 微信小程序如何延时定时后执行一段代码

    微信小程序中可以使用setTimeout()函数来实现延时执行代码的功能,语法如下: 其中,第一个参数是需要延时执行的代码,可以是一个函数或者一段代码;第二个参数是延时的时间,单位为毫秒。 例如,延时1秒后执行一段代码: 定时执行代码可以使用setInterval()函数,语法如

    2024年02月03日
    浏览(55)
  • python global函数用法及常用的 global函数代码

      Python中的 global函数是用于在程序中定义变量的函数,在我们实际的开发中,我们可能会用到 global函数来定义变量,但是我们在这里就不具体介绍它的用法了。 global函数定义变量的方法: global函数使用参数a来指定变量在程序中的地址。 参数b表示该变量在程序中的地址。

    2024年02月05日
    浏览(42)
  • 如何在fastadmin的html模板中,循环一段自定义表单模板代码?

    在FastAdmin的HTML模板中,可以使用模板引擎语法和JavaScript代码来实现自定义表单模板代码的循环。具体步骤如下: 在HTML模板中,定义一个占位符,用来显示循环后的自定义表单模板代码。例如: 在JavaScript代码中,获取自定义表单模板代码,并循环生成表单。具体代码如下所

    2024年02月02日
    浏览(39)
  • 【计算几何】判断一条线段和一段圆弧是否相交 & C++代码实现

    最近做项目,需要判断一条线段是否和一段圆弧相交,网上也没找到很好的解答(最主要是没有直接可以搬来用的代码,或者思路写得太过高深,我看不懂),于是决定自己想一个方法,写一个博客,将实现思路和完整代码都分享出来 线段可用两个点表示,点的对象如下所示

    2024年02月01日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包