• python基础查漏补缺


    高级特性

    迭代

    如何判断一个对象是可迭代对象呢?

    方法是通过collections.abc模块的Iterable类型判断:

    1. >>> from collections.abc import Iterable
    2. >>> isinstance('abc', Iterable) # str是否可迭代
    3. True
    4. >>> isinstance([1,2,3], Iterable) # list是否可迭代
    5. True
    6. >>> isinstance(123, Iterable) # 整数是否可迭代
    7. False

    list对象转换成可迭代对象,进行对下标运算

    1. >>> for i, value in enumerate(['A', 'B', 'C']):
    2. ... print(i, value)
    3. ...
    4. 0 A
    5. 1 B
    6. 2 C

    上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

    1. >>> for x, y in [(1, 1), (2, 4), (3, 9)]:
    2. ... print(x, y)
    3. ...
    4. 1 1
    5. 2 4
    6. 3 9

    列表生成式

    利用列表函数进行生成

    1. >>> [x * x for x in range(1, 11)]
    2. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    还可以使用两层循环,可以生成全排列:

    1. >>> [m + n for m in 'ABC' for n in 'XYZ']
    2. ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

    ifelse写法

    正确

    1. >>> [x for x in range(1, 11) if x % 2 == 0]
    2. [2, 4, 6, 8, 10]

    错误,我们不能在最后的if加上else

    1. >>> [x for x in range(1, 11) if x % 2 == 0 else 0]
    2. File "", line 1
    3. [x for x in range(1, 11) if x % 2 == 0 else 0]
    4. ^
    5. SyntaxError: invalid syntax

    在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else

    例:

    1. >>> [x if x % 2 == 0 else -x for x in range(1, 11)]
    2. [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
    3. #等价于
    4. for x in range(1,11):
    5. if x % 2==0:
    6. x
    7. else:
    8. -x
    9. >>> L1 = ['Hello', 'World', 18, 'Apple', None]
    10. >>> [s.lower() if isinstance(s, str) else s for s in L1 if s!=None]
    11. #等价于
    12. for s in L1:
    13. if s!=None:# 过滤条件
    14. if isinstance(s, str):
    15. s.lower()
    16. else:
    17. s

    生成器

    列表生成器的缺陷:将数据全部生成浪费内存

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

    如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator

    方法一:将列表生成式的[]改成()

    1. >>> L = [x * x for x in range(10)]
    2. >>> L
    3. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    4. >>> g = (x * x for x in range(10))
    5. >>> g
    6. <generator object <genexpr> at 0x1022ef630>

    通过next()函数获得generator的下一个返回值:

    1. >>> next(g)
    2. 0
    3. >>> next(g)
    4. 1
    5. >>> next(g)
    6. 4
    7. >>> next(g)
    8. 9
    9. >>> next(g)
    10. 16
    11. >>> next(g)
    12. 25
    13. >>> next(g)
    14. 36
    15. >>> next(g)
    16. 49
    17. >>> next(g)
    18. 64
    19. >>> next(g)
    20. 81
    21. >>> next(g)
    22. Traceback (most recent call last):
    23. File "", line 1, in <module>
    24. StopIteration

    generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

    可以使用for进行调用

    1. >>> g = (x * x for x in range(10))
    2. >>> for n in g:
    3. ... print(n)
    4. ...
    5. 0
    6. 1
    7. 4
    8. 9
    9. 16
    10. 25
    11. 36
    12. 49
    13. 64
    14. 81

    另一种写法:yield关键字

    考虑斐波拉契数

    1. def fib(max):
    2. n, a, b = 0, 0, 1
    3. while n < max:
    4. print(b)
    5. a, b = b, a + b
    6. n = n
  • 相关阅读:
    rm -rf 真是删库跑路的一把好手
    Java后端同第三方服务建立Socket通信①Python编写脚本模拟第三方服务(基础版)
    QT学习_07_样式表的初步学习
    FM5889协议系列-识别加限流IC 多口USB超级充电器
    什么是网站SSL证书?SSL证书重要吗?
    C语言 | Leetcode C语言题解之第4题寻找两个正序数组的中位数
    重磅上市《精通Neo4j》
    网络安全(黑客)—2024自学
    【跟小嘉学 PHP 程序设计】一、PHP 开发环境搭建
    用户体验设计笔记(1-1)
  • 原文地址:https://blog.csdn.net/m0_73720982/article/details/126940360