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)
思路:
- 创建一个空列表
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。