• Python150题day17


    3.9 enumerate

    enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中,下面是使用示例:

    lst = ['a', 'b', 'c']

    for index, item in enumerate(lst):

            print(index, item)

    程序输出:

    0 a

    1 b

    2 c

    仿造该功能实现下面的函数:

    def my_enumerate(lst):

            """

            实现和enumerate 类似的功能

            :param lst:

            :return:

            """

            pass

    代码:

    def my_enumerate(lst):

            for i in range(len(lst)):

                    yield i,lst[i]

    lst = ['a','b','c']

    for index,item in my_enumerage(lst):

            print(index,item)

    思路:

    这个函数需要对生成器有一定的理解和认识。一个函数里出现了yield关键字,那么这个函数就是生成器函数,该函数返回的是一个生成器。

    yield和return有着相似的功能,都会将数据返回给调用者,不同之处在于,return执行后,函数结束了,而yield执行后,会保留当前的状态,等到下一次执行时,恢复之前的状态,继续执行。

    在函数内部,使用for循环通过索引

    遍历lst,使yield返回索引和 索引位置上的元素

    tips:

    `yield` 是一个关键字,用于定义生成器函数。生成器函数是一种特殊类型的函数,它可以暂停执行并在需要时产生一个值(或一系列值),然后再继续执行。

    当在生成器函数中使用 `yield` 语句时,它会将一个值返回给调用者,并且当前的函数状态会被保存下来。下次调用生成器函数时,函数会从上次暂停的位置继续执行,而不是从头开始执行。这使得生成器函数能够逐步生成值,而不需要一次性计算和返回所有的值。以下是一个简单的示例,展示了生成器函数的使用:
     

    1. def number_generator():
    2.     yield 1
    3.     yield 2
    4.     yield 3
    5. # 创建一个生成器对象
    6. generator = number_generator()
    7. # 通过调用 next() 函数获取生成器的下一个值
    8. print(next(generator))  # 输出: 1
    9. print(next(generator))  # 输出: 2
    10. print(next(generator))  # 输出: 3

    在上面的示例中,`number_generator()` 是一个生成器函数,它通过 `yield` 语句逐步生成数字 1、2 和 3。每次调用 `next()` 函数时,生成器函数会从上次暂停的位置继续执行,并返回下一个生成的值。

    生成器函数非常有用,特别是在处理大量数据或需要逐步生成结果的情况下。通过使用生成器函数,可以减少内存消耗,并且可以在需要时按需生成值,而不必一次性生成所有的值。

    3.10 all

    all()函数用于判断给定的可迭代参数iterable中的所有元素是否都为True,示例代码如下:

    lst = [True, False, True]

    print(all(lst))

    返回结果为False,实现一个函数,完成类似的功能

    代码:

    def my_all(seq):

            for item in seq:

                    if not item:

                            return False

            return True

    思路:

    直接用for循环遍历,如果遍历到的元素有False则直接返回False,如果没有是False的,遍历结束返回True

    3.11 any

    any函数用于判断给定的可迭代参数 iterable 中的所有元素是否至少有一个为True

    lst = [True, False, False]

    print(any(lst)

    返回结果为True,实现一个函数,完成类似功能

    代码:

    def my_all(seq):

            for item in seq:

                    if item:

                            return True

            return False

    思路:

    类似all,遍历列表,如果有一个是True,则直接返回True,否则则是全不是True,循环结束返回False

    3.12 bin

    函数bin可以获得整数的二进制形式:

    print(bin(10))

    输出结果为 0b1010

    实现一个函数,完成相同功能,为了降低难度,只需要考虑正整数且不需要在开头加0b

    代码:

    def  my_bin(value):

            lst = []

            while value:

                    if value % 2 == 1:

                            lst.append('1')

                    else:

                            lst.append('0')

            value = value // 2    # 也可写成value = value >> 1

            

            lst = lst[::-1]

            return ''.join(lst)

    思路:

    1. 创建一个空列表 lst 用于存储二进制表示的位。

    2. 进入一个循环,直到 value 的值为 0。

    3. 在循环中,检查 value 是否为奇数(通过取模运算 value % 2 == 1)。如果是奇数,将字符 '1' 添加到列表 lst 中,表示当前位为 1;否则,将字符 '0' 添加到列表 lst 中,表示当前位为 0。

    4. 将 value 的值除以 2(通过整除运算 value // 2),以便在下一次循环中处理下一个位。

    5. 循环结束后,反转列表 lst 的顺序,以得到正确的二进制表示。

    6. 使用 ''.join(lst) 将列表中的字符连接成一个字符串,表示整数的二进制形式。

    7. 返回二进制字符串。

    tips:

    `value = value >> 1` 是一个位运算操作,用于将变量 `value` 的值向右移动一位。

    具体而言,`>>` 是右移位运算符,它将二进制数向右移动指定的位数。在这种情况下,`value` 的值被向右移动一位,相当于将其二进制表示的所有位向右移动一位,并将最右边的位丢弃。

    例如,如果 `value` 的初始值为 10,其二进制表示为 `1010`。执行 `value = value >> 1` 后,`value` 的值将变为 5,其二进制表示为 `0101`。

    这种右移位操作可以理解为将一个数除以 2(向下取整),因为向右移动一位等于将所有位向右移动一位,并在最左边添加一个零。在二进制中,向右移动一位相当于将数值除以 2。

  • 相关阅读:
    Spirng Cloud Gateway详解
    Java Fork/Join 并发编程
    平衡二叉树基本操作(AVL平衡二叉树)
    实时时钟 RTC
    (一)Lenet5 手写数字识别原理及代码解析
    深度学习 Day 20——优化器对比实验
    矩阵相乘
    新版本外国人永久居留身份证EST-100身份证阅读器接口更新
    如何查询文件夹中文本文件的内容 (LINQ) (C#)
    Ps:消除锯齿与修边
  • 原文地址:https://blog.csdn.net/qq_62928039/article/details/133748705