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

def number_generator():
    yield 1
    yield 2
    yield 3

# 创建一个生成器对象
generator = number_generator()

# 通过调用 next() 函数获取生成器的下一个值
print(next(generator))  # 输出: 1
print(next(generator))  # 输出: 2
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。

你可能感兴趣的:(Python150题,python)