返回顶部
首页 > 资讯 > 后端开发 > Python >初学python之解析式
  • 210
分享到

初学python之解析式

python 2023-01-31 06:01:56 210人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

解析式 其目的主要用来减少编程行数,并减少栈帧从而达到代码优化的效果 In [6]: [i ** 2 for i in range(11)]Out[6]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 


解析式

 

其目的主要用来减少编程行数,并减少栈帧从而达到代码优化的效果

 

In [6]: [i ** 2 for i in range(11)]

Out[6]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

将生产环节元素表达式放在最前面

 

列表解析语法

[返回值 for 元素 可迭代对象if条件]

 

使用中括号表示,内部for为循环跟if条件可选,返回一个新的列表

这样可以简化编程中书写并且减少了栈帧,从而达到优化效果

 

例:对i进行取模

In [23]: [ i for i in range(1,10) if i % 2 == 0]

Out[23]: [2, 4, 6, 8]

 

解析式中不能使用else 和 elif 所以需要用or 和 and来代替

In [4]: [i for i in range(20) if i %2 == 0 and i%3 == 0]

Out[4]: [0, 6, 12, 18]

 

使用or/ not

In [5]: [i for i in range(20) if i %2 == 0 or noti % 2== 0]

Out[5]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12, 13, 14, 15, 16, 17, 18, 19]

 

使用and / not

In [11]: [i for i in range(20) if i % 2 ==0 andnot i % 3]

Out[11]: [0, 6, 12, 18]

可以理解为:

In [13]: [i for i in range(20) if i % 2 ==0 andnot i % 3 != 0]

Out[13]: [0, 6, 12, 18]

 

推导式的多重过滤

使用and进行代替多个if:if:if,对多重邓加进行代替

 

 

for i in iter1:

    for j in iter2:

        lst.append(expr)

 

等价于:

In[14]: [expr for i in iter1 for j in iter2]

 

 

例:

1.  

In [14]: [ (x,y) for x in 'abc' for y in range(3)]

Out[14]:

[('a', 0),

('a', 1),

('a', 2),

('b', 0),

('b', 1),

('b', 2),

('c', 0),

('c', 1),

('c', 2)]

 

等价于:

In [21]: for i in 'abc':

    ...:     fory in range(3):

    ...:         lst.append((i,y))

  

 

In [26]: [{x:y} for x in "abcde" for yin range(3)]

Out[26]:

[{'a': 0},

{'a': 1},

{'a': 2},

{'b': 0},

{'b': 1},

{'b': 2},

{'c': 0},

等价于:

In [34]: for i in "abc":

    ...:     forx in range(3):

    ...:         lst.append({i:x})

 

 

在语句上第三个最方便,但是第一条最容易理解:

In [36]: [ (i,j) for i in range(7) if i > 4for j in range(20,25) if j > 23   ]

Out[36]: [(5, 24), (6, 24)]

 

In [37]: [(i,j) for i in range(7) for j inrange(20,25) if i > 4 if j > 23]

Out[37]: [(5, 24), (6, 24)]

 

In [39]: [(i,j) for i in range(7) for j inrange(20,25) if i > 4 and  j > 23]

Out[39]: [(5, 24), (6, 24)]

 

求99乘法表

 

[print ('{}*{}={:<3}{}'.fORMat(j,i,i*j,'\n' ifi == j else ''),end = "") for i in range(1,10) for j in range(1,i+1)]

 

 


生成器表达式

与解析式一样,只不过将中括号改为小括号

In [2]: a = (n for n in range(10))

In [3]: a

Out[3]: <generator object <genexpr> at 0x7fed4ea1cfc0>

 

In [5]: next(a)

Out[5]: 0

In [6]: next(a)

Out[6]: 1

In [7]: next(a)

Out[7]: 2

 

迭代中,只能使用一次,当获取后则直接将其销毁,不再保留至内存空间中

使用next(a)的方法,必须一定是可迭代对象

 

 

使用生成器的好处:

   ·延迟计算

   ·返回迭代器,可以进行迭代

   ·从签到后走完一遍,不能回头

 

 

例:

使用print进行观察

In [8]: a = (print("{}".format(i+1))  for i in range(2))

In [9]: print(a)

<generator object <genexpr> at0x7fed51641f10>

 

In [10]: b = next(a)

1

In [11]: b = next(a)

2

In [12]: b = next(a)

---------------------------------------------------------------------------

StopIteration                             Traceback(most recent call last)

<ipython-input-12-78fca016cc6c> in<module>()

----> 1 b = next(a)

StopIteration:

 

 

 

生成器和列表解析式对比

 

立即生成和延后计算,可以嵌套在列表解析式中从返回值来讲,更节省内存,生成器则全部生成并返回

生成器没有数据,占用内存极少,使用的时候逐个返回

列表需要占用更多的内存

 

计算速度

生成器耗时间非常短,列表解析消耗时间略长

生成器本身是一个迭代器

 

速度对比

In[14]: %timeit [x for x in range(500)]

18 μs ± 102 ns per loop (mean± std. dev. of 7 runs, 100000 loops each)

In[15]: %timeit (x for x in range(500))

741 ns± 7.58 ns perloop (mean ± std. dev. of 7 runs, 1000000 loops each)

 

 

 

集合解析式

将返回值for作为可迭代对象通过if条件换位,

将括号换至为大伙靠,生成后立刻返回一个集合

In [19]: {(x,x+1) for x in range(10)}

Out[19]:

{(0, 1),

(1, 2),

(2, 3),

(3, 4),

(4, 5),

(5, 6),

(6, 7),

(7, 8),

(8, 9),

(9, 10)}

 

 

字典解析式:

In [25]: {chr(0x41+x):x**2 for x in range(10) }

Out[25]:

{'A': 0,

'B': 1,

'C': 4,

'D': 9,

'E': 16,

'F': 25,

'G': 36,

'H': 49,

'I': 64,

'J': 81}

 

In [26]: {str(x):y for x in range(3) for y inrange(4)}

Out[26]: {'0': 3, '1': 3, '2': 3}

 

 

 

 

内建函数

 

iter 将一个可迭代对象封装为一个迭代器

a = iter(range(5))

 

迭代器对象,迭代器本身是可迭代的,所以说可以通过iter方法将可迭代对象封装为迭代器然后通过next方法进行迭代

 

zip 拉链函数

将多个可迭代函数合并在一起,返回一个迭代器,将每次不同对象中取到的元素合并到一个元组中

In [40]: list(zip(range(10),range(10)))

Out[40]:

[(0, 0),

(1, 1),

(2, 2),

(3, 3),

(4, 4),

(5, 5),

(6, 6),

(7, 7),

(8, 8),

(9, 9)]

 

 

zip为木桶原理,取当前最短的,并不再继续

In [41]: list(zip(range(10),range(10),range(5)))

Out[41]: [(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3,3), (4, 4, 4)]

 

 

如果某一个值超出,则只选择最短的值,不会再进行多次选取

In [42]: list(zip(range(10),range(10),range(50)))

Out[42]:

[(0, 0, 0),

(1, 1, 1),

(2, 2, 2),

(3, 3, 3),

(4, 4, 4),

(5, 5, 5),

(6, 6, 6),

(7, 7, 7),

(8, 8, 8),

(9, 9, 9)]

 

In [43]: list(zip(range(10),range(10),range(3)))

Out[43]: [(0, 0, 0), (1, 1, 1), (2, 2, 2)]

 


--结束END--

本文标题: 初学python之解析式

本文链接: https://lsjlt.com/news/190366.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 初学python之解析式
    解析式 其目的主要用来减少编程行数,并减少栈帧从而达到代码优化的效果 In [6]: [i ** 2 for i in range(11)]Out[6]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100] ...
    99+
    2023-01-31
    python
  • python初学之一
    说明:    学习python也有些日子,但从未真正用过,己经在心里谴责了N次了,终于下决定将自己学习的过程记录下来,虽然我这个人没有什么优点,但一坚持万一变成优点了呢!一、实现一个函数isDuplicate(s),接受一个字符串,判断这个...
    99+
    2023-01-31
    python
  • Python学习之初识Python
    Python作为一种面向对象,解释型的程序语言。拥有简洁(通过缩进来区别不同的语句块),丰富强大的库。可以将多个模块导入使用的特性又被称之为脱水语言。Django可作为Python的Web开发框架语句块:   Python通过相同的缩进来确...
    99+
    2023-01-31
    Python
  • Python学习之初识
    第一章 1.1 typora 的安装与使用 1.1.1 标题的创建: 方法一:用 ###+空格 表示标题,几个#就是几级标题 方法二:菜单栏——》段落——》选择标题 1.1.2 有序列表与无序列表 菜单栏——》段落——》可以选择有序列表o...
    99+
    2023-01-31
    Python
  • 初学Python之一:Python的安装
    本次安装基于Windows系统。 下载Python2.7和3.6: http://www.python.org/ 下在2.7最新版本。 由于官方大力推广3.x版本,所以今后学习以3.x版本为主 第一步: 选择第一个选...
    99+
    2023-01-31
    Python
  • 初学Python
    1.了解Python   python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作 为ABC语言的一种继承。最新的TIOB...
    99+
    2023-01-30
    Python
  • 如何解析初学Python时的注意事项
    如何解析初学Python时的注意事项,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。初学Python时需要注意相关事项,首先初学Python时要先知道什么是Pyt...
    99+
    2023-06-17
  • Android初学 二之 TextView
    TextView在Android中一般用来显示文本,今天学习一下,如何利用TextView来实现我们制作我们想要的文本效果(下划线、中划线、跑马...
    99+
    2022-06-06
    Android
  • Python深度学习之Pytorch初步使用
    目录一、Tensor二、Pytorch如何创建张量2.1 创建张量2.2 tensor与ndarray的关系2.3 常用api2.4 常用方法三、数据类型3.1 获取数据类型四、tensor的其他操作4.1 相加4....
    99+
    2022-06-02
    Python Pytorch python深度学习
  • Python学习之路-随笔01 初识py
    由于学习过其他编程语言(C/C++/java),所以记录的话除了一些差异点和遇到的问题,尽可能的简洁,以达到最佳的记录作用,方便以后的复习和形成体系。 1.数字类型   包括integer,long,float,complex(复杂整数...
    99+
    2023-01-30
    之路 随笔 Python
  • 深度学习详解之初试机器学习
    机器学习可应用在各个方面,本篇将在系统性进入机器学习方向前,初步认识机器学习,利用线性回归预测波士顿房价; 原理简介 利用线性回归最简单的形式预测房价,只需要把它当做是一次线性函数y...
    99+
    2024-04-02
  • python学习之新式类和旧式类讲解
    目录object新式类旧式类新式类和旧式类的区别重点Python 2.x 中声明类旧式类新式类Python 3.x 中声明类object object 是 Python 为所有对象提...
    99+
    2024-04-02
  • 初学python数学建模之数据导入(小白篇)
    目录1. 数据导入是所有数模编程的第一步2. 在程序中直接向变量赋值2.1 为什么直接赋值?2.2 直接赋值的问题与注意事项例程 1:将数据导入作为单独的函数例程 2:将数据导入集中...
    99+
    2024-04-02
  • python机器学习密码之初来乍到
    机器学习近来火得可谓人尽皆知。其实楼主现在的研究方向是椭圆曲线密码的硬件实现。so,我一直以为这跟Python,神经网络啥的确是八竿子打不着,然而,这个世界上就是不缺那种能开先河能摆证据撂服众生的大神。举个栗子这篇文章learing the...
    99+
    2023-01-31
    初来乍到 机器 密码
  • C++学习之初始化列表详解
    目录前言一、类的初始化表二、initializer_list前言 本文主要介绍C++中地初始化列表 目前对初始化列表应该有两个方面的定义,一个是类的构造函数中使用的那个初始化表,另一...
    99+
    2023-03-19
    C++初始化列表 C++ 列表
  • Python学习笔记之解析json的方法分析
    本文实例讲述了Python解析json的方法。分享给大家供大家参考,具体如下: 刚学习到Python中解析json的方法,觉得有必要在这里坐下笔记。 我是在python的内部环境中看的 Encoding b...
    99+
    2022-06-04
    学习笔记 方法 Python
  • NCCL深度学习之初始化及ncclUniqueId的产生源码解析
    目录NCCL然后看下ncclInit首先执行initEnv,设置环境变量开始初始化通信网络首先执行ncclNetIb的init函数,就是ncclIbInit然后开始生成UniqueI...
    99+
    2023-05-16
    NCCL初始化ncclUniqueId产生 NCCL ncclUniqueId
  • Angular.js基础学习之初始化的示例分析
    这篇文章将为大家详细讲解有关Angular.js基础学习之初始化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、绑定初始化,自动加载通过绑定来进行angula...
    99+
    2024-04-02
  • python初学者学习笔记
    python开发:   a.Python基础   b.网络编程   c.web框架 —用于写网站   d.设计阶段+算法   e.项目阶段 开发:   开发语言:高级语言:python/Java/PHP/C#/Go/ruby/c++......
    99+
    2023-01-30
    初学者 学习笔记 python
  • Web开发初学分析
    本篇内容介绍了“Web开发初学分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前端VS后端或许你会觉得最...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作