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()` 函数时,生成器函数会从上次暂停的位置继续执行,并返回下一个生成的值。
生成器函数非常有用,特别是在处理大量数据或需要逐步生成结果的情况下。通过使用生成器函数,可以减少内存消耗,并且可以在需要时按需生成值,而不必一次性生成所有的值。
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
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
函数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)
思路:
创建一个空列表 lst 用于存储二进制表示的位。
进入一个循环,直到 value 的值为 0。
在循环中,检查 value 是否为奇数(通过取模运算 value % 2 == 1)。如果是奇数,将字符 '1' 添加到列表 lst 中,表示当前位为 1;否则,将字符 '0' 添加到列表 lst 中,表示当前位为 0。
将 value 的值除以 2(通过整除运算 value // 2),以便在下一次循环中处理下一个位。
循环结束后,反转列表 lst 的顺序,以得到正确的二进制表示。
使用 ''.join(lst) 将列表中的字符连接成一个字符串,表示整数的二进制形式。
返回二进制字符串。
tips:
`value = value >> 1` 是一个位运算操作,用于将变量 `value` 的值向右移动一位。
具体而言,`>>` 是右移位运算符,它将二进制数向右移动指定的位数。在这种情况下,`value` 的值被向右移动一位,相当于将其二进制表示的所有位向右移动一位,并将最右边的位丢弃。
例如,如果 `value` 的初始值为 10,其二进制表示为 `1010`。执行 `value = value >> 1` 后,`value` 的值将变为 5,其二进制表示为 `0101`。
这种右移位操作可以理解为将一个数除以 2(向下取整),因为向右移动一位等于将所有位向右移动一位,并在最左边添加一个零。在二进制中,向右移动一位相当于将数值除以 2。