【python】随笔 - 知识点小课堂 -3.python可迭代对象

前言

本文是关于python可迭代对象的一些习题的整理和讲解

3.12

已知vec =[[1,2],[3,4]],则表达式[[row[i]for row invec]for iin range(len(vec[8]))]的值为

列表推导式的基本结构

列表推导式是Python中一种简洁的构建列表的方法,其基本结构如下:

[expression for item in iterable if condition]
  • expression:对每个item执行的表达式。
  • item:来自iterable的元素。
  • if condition:(可选)一个过滤条件,只有满足此条件的item才会被包含在最终的列表中。

双层列表推导式

双层列表推导式包含两个嵌套的循环,外层和内层:

  1. 外层循环:控制整体的迭代逻辑,通常与内层循环的索引相关。

    [outer_expression for i in range(condition)]
    
    • outer_expression:外层循环中使用的表达式,通常依赖于i
    • range(condition):生成一个序列,用于外层循环的迭代。
  2. 内层循环:通常与iterable的元素直接相关。

    [inner_expression for each_item in iterable]
    
    • inner_expression:内层循环中使用的表达式,通常直接处理each_item

示例

考虑以下双层列表推导式:

[[row[i] for row in vec] for i in range(len(vec[0]))]
  1. 外层循环:由for i in range(len(vec[0]))构成,ivec中每个子列表的长度索引。
  2. 内层循环:由for row in vec构成,rowvec中的每个子列表。

执行过程

  1. 外层循环:迭代i0len(vec[0])-1
  2. 对于每个i
    • 内层循环:迭代vec中的每个row
    • 对于每个row,取出索引为i的元素。

结果

最终结果是一个列表,其中包含了vec中每个子列表在索引0len(vec[0])-1下的所有元素。

注意事项

  • 列表推导式可以包含多层嵌套,但通常建议不要超过两层,以保持代码的可读性。
  • 每一层的循环都是独立的,外层循环的迭代变量(如i)在内层循环中是不可见的,除非明确传递。

3.13

表达式{1,2,3}<{3,4,5}的值为

在Python中,集合(set)是比较唯一性的数据结构,它不允许有重复的元素。集合之间比较时,遵循以下规则:

  1. 集合之间的比较是基于它们的元素顺序进行的。在比较两个集合时,Python会按照元素在集合中的顺序(迭代的顺序)进行比较。

  2. 如果一个集合是另一个集合的子集,那么它在比较中被视为“更小”。

  3. 如果两个集合没有子集和超集的关系,那么比较是基于集合中元素的顺序。具体来说,如果两个集合的第一个不同元素中,一个集合的元素小于另一个集合的元素,那么这个集合在比较中被视为“更小”。

对于表达式 {1, 2, 3} < {3, 4, 5}

  • 集合 {1, 2, 3} 中的元素 1 在集合 {3, 4, 5} 中不存在,而集合 {3, 4, 5} 中的元素 3 在集合 {1, 2, 3} 中存在。
  • 根据上述规则,因为 1 小于 3,所以 {1, 2, 3} 在比较中被视为小于 {3, 4, 5}

因此,表达式 {1, 2, 3} < {3, 4, 5} 的值为 True

3.14

表达式[1,2,3].count(4)的值为

在Python中,count()方法用于返回某个元素在列表中出现的次数。如果该元素在列表中不存在,则count()方法返回0

对于表达式 [1, 2, 3].count(4)

  • 列表 [1, 2, 3] 中不包含元素 4

因此,调用 count() 方法来计算 4 在这个列表中出现的次数,结果将为 0

所以,表达式 [1, 2, 3].count(4) 的值为 0

3.17

单选题:已知 x={1:‘a’,2:‘b’,3:‘c’}和y={1,3,4},那么表达式 x.keys()-y的值为

在Python中,集合(set)对象有一个-运算符,它用于求差集。表达式x.keys() - y意味着从x的键集合中移除y中的所有元素。

已知:

x = {1: 'a', 2: 'b', 3: 'c'}
y = {1, 3, 4}

x.keys()将生成一个包含x字典所有键的集合,即{1, 2, 3}

然后,执行x.keys() - y操作,从{1, 2, 3}中移除{1, 3, 4}中的元素,由于4不在x.keys()中,它不会被包含在结果中。元素13将从x.keys()中移除,因为它们也存在于y中。

所以,结果将是:

{2}

表达式x.keys() - y的值为{2}

3.18

单选题:已知 x={1:3,2:1,3:1}和y={1,3,4},那么表达式x.values()-y的值为

这个错误是因为dict.values()返回的是一个字典值的视图(dynamic view),不是一个集合或列表,不能直接与set类型进行减法操作。

第一道题:

已知 x = {1: 'a', 2: 'b', 3: 'c'}y = {1, 3, 4},那么表达式 x.keys() - y 的值为:

x = {1: 'a', 2: 'b', 3: 'c'}
y = {1, 3, 4}
result = x.keys() - y
print(result)

Python 中 x.keys() 返回的是一个视图对象(dict_keys),它表现得很像一个集合,这样就可以对它进行集合操作。所以在这个情况下:

  • x.keys() 返回 dict_keys([1, 2, 3])
  • y 是一个集合 {1, 3, 4}

因此,x.keys() - y 就等价于 set([1, 2, 3]) - {1, 3, 4},结果是 {2}

所以,正确答案是:

  • A. {2}

第二道题:

已知 x = {1:3, 2:1, 3:1}y = {1, 3, 4},那么表达式 x.values() - y 的值为:

x = {1: 3, 2: 1, 3: 1}
y = {1, 3, 4}
result = x.values() - y
print(result)

在 Python 中,x.values() 返回的是一个视图对象(dict_values),它不直接支持集合运算,因此会报错。试图对 dict_values 对象进行集合操作会导致 TypeError。为了能够进行集合操作,要明确地将 x.values() 转换为集合:

result = set(x.values()) - y
  • x.values() 返回 dict_values([3, 1, 1])
  • 转换为集合后,set(x.values()) 结果是 {1, 3}

所以,set(x.values()) - y 就等价于 {1, 3} - {1, 3, 4},结果是 set(),即空集合。

在题目中, 如果直接使用 x.values() - y 而没有进行转换,会报错,这就解释了为什么两个表达式不一样:

  • 第一个表达式 x.keys() - y 可以直接计算,因为 x.keys() 返回的 dict_keys 可以像集合一样操作。
  • 第二个表达式 x.values() - y 会报错,因为 x.values() 返回的 dict_values 不支持直接进行集合操作,需要显式转换为 set

所以,正确答案应该是
表达式错误,无法计算

3.19

多选题:下面的列表方法中有返回值并且返回值不是空值None 的有

)。
A.sort()
B.poP()
C.index()D.reverse()

在Python中,列表(list)是一种可变的数据结构,它提供了多种方法来操作列表。

A. .sort():这个方法会对列表进行排序,并修改原列表。它没有返回值,或者说它的返回值是None

B. .pop():这个方法用于移除列表中的一个元素(默认是最后一个元素),并且返回被移除的元素。如果列表为空,会抛出一个IndexError异常。

C. .index():这个方法用于找出某个元素在列表中第一次出现的索引位置,并返回这个索引。如果没有找到元素,会抛出一个ValueError异常。

D. .reverse():这个方法会反转列表中的元素顺序,并修改原列表。它同样没有返回值,或者说它的返回值是None

根据题目要求,我们需要找出有返回值并且返回值不是None的方法。根据上述解释,.pop().index() 是满足条件的方法。因此,正确答案是 B 和 C。

3.21

这几个函数返回值是不是一定是空值。
A.insert()B.clear()
C.count()D.extend()

在Python中,列表的方法通常用于对列表进行操作,有些方法会返回值,有些则不会。

A. .insert(index, item):这个方法在指定位置index插入一个元素item。它没有返回值,即返回None

B. .clear():这个方法用于清空列表中的所有元素。它同样没有返回值,即返回None

C. .count(item):这个方法用于返回元素item在列表中出现的次数。它返回一个整数,所以返回值不是None

D. .extend(iterable):这个方法用于将一个可迭代对象(如另一个列表)的所有元素添加到列表末尾。这个方法没有返回值,即返回None

综上所述,A.insert()B.clear()D.extend() 这三个方法都没有返回值,或者说它们的返回值是None。而 C.count() 方法返回一个整数,不是None

3.22

多选题:下面的列表方法中不影响列表内存首地址的有(
X.sort()B.pop()C.index()
D. reverse()

在Python中,列表(list)是一个可变的数据结构,这意味着列表的内容可以被修改,而不需要创建新的对象。对于列表的内存首地址,它指的是列表对象在内存中的起始位置。列表的内存首地址通常在列表被创建时确定,并且只有在列表对象的内存被重新分配时才会改变。

对于列表方法是否影响内存首地址,关键在于这些操作是否会导致列表对象的内存被重新分配。以下是对每个方法的重新评估:

A. .sort():这个操作会就地对列表中的元素进行排序,不会创建一个新的列表对象。排序操作本身不会改变列表的内存首地址,因为这是在原列表上进行的。

B. .pop()pop() 方法移除列表中的一个元素(默认是最后一个),并返回它。这个操作通常不会改变列表的内存首地址,因为移除元素是在原列表上进行的,不需要重新分配内存。

C. .index():这个方法用于找出某个元素在列表中的索引位置。它不修改列表的内容,因此不会影响列表的内存首地址。

D. .reverse()reverse() 方法就地反转列表中的元素顺序。这个操作不会创建一个新的列表对象,而是直接修改原列表,因此不会影响列表的内存首地址。

综上所述,.sort().pop().index().reverse() 这四个方法都不会导致列表对象的内存被重新分配,因此它们都不会影响列表的内存首地址。这些方法都是就地修改列表,而不是创建一个新的列表对象。所以,正确答案是 A、B、C 和 D。

3.25

多选题:下面的列表方法中返回值一定为空值 None 的有(
在Python中,列表的insert()copy()remove()append()方法中,返回值的具体情况如下:

  1. .insert(index, item):这个方法用于在指定位置插入一个元素,它没有返回值,即返回None

  2. .copy():这个方法用于返回列表的一个浅拷贝,即返回一个新的列表对象,其中包含了原列表的所有元素。

  3. .remove(item):这个方法用于移除列表中第一个匹配的元素,并返回None。如果列表中没有该元素,则会抛出一个ValueError异常。

  4. .append(item):这个方法用于在列表末尾添加一个元素,它同样没有返回值,即返回None

根据这些方法的描述,insert()append() 方法的返回值一定是空值None。而copy()方法返回一个新的列表对象,不是Noneremove()方法虽然可能抛出异常,但如果成功移除元素,它返回的也是None

所以,返回值一定为空值None的方法是 insert()remove()append()

3.26

多选题:下面可以使用表示位置或序号的整数做下标访问其中元素的有

)。
A.列表B.元组
C.字典D.集合
E.字符串

在Python中,不同的数据结构支持不同的操作和访问方式。以下是对每个选项的解释:

A. 列表(List):可以使用整数下标来访问列表中的元素。列表是有序的,并且允许通过索引来访问、添加、删除元素。

B. 元组(Tuple):元组也是有序的,并且可以通过整数下标来访问其中的元素。元组一旦创建,其内容就不能被修改。

C. 字典(Dictionary):字典不支持使用整数下标来访问元素。字典中的元素是通过键(key)来访问的,键可以是字符串、数字等,但不是通过整数下标。

D. 集合(Set):集合是无序的,不存储重复的元素。集合不支持通过下标来访问元素,因为集合中的元素没有索引。

E. 字符串(String):字符串可以被视为字符的有序集合,可以使用整数下标来访问字符串中的特定字符。

综上所述,可以使用整数下标访问元素的数据结构有列表(A)、元组(B)和字符串(E)。因此,正确答案是 A、B 和 E。

3.27

3.27 多选题:下面可以支持下标(助理助理,这里是下标,不是整数下标)运算的有(
)。
B.元组
D.集合C.字典
A. 列表只字符串

ABCE注意,这里注意字典是按照他的剑来索引

3.27~END

3.28 随机整数及其出现次数统计

  1. 使用random模块生成1000个0到100(包含0和100)的随机整数。
  2. 创建一个长度为101的列表(因为范围是0到100),用于统计每个数字的出现次数,初始化所有元素为0。
  3. 对于每个生成的随机整数,将对应索引的计数加1。
  4. 打印出最终的计数列表。

3.29 使用切片获取列表中的子列表

  1. 接收用户输入的列表和两个整数作为下标。
  2. 确保下标在列表的范围内,并且第一个下标小于第二个下标。
  3. 使用切片操作list[start:end+1]获取从startend(包含end)的子列表。
  4. 输出得到的子列表。

3.30 字典的输入与输出

  1. 设计一个字典,其中包含若干键值对。
  2. 提示用户输入一个键。
  3. 检查用户输入的键是否存在于字典中。
    • 如果存在,输出对应的值。
    • 如果不存在,输出提示信息“输入的键不存在!”。

3.31 生成特定排序的随机数列表

  1. 使用random模块生成一个包含20个随机数的列表。
  2. 将列表分为两部分:前18个元素和后10个元素。
  3. 对前18个元素使用sort()方法进行升序排序。
  4. 对后10个元素使用sort(reverse=True)方法进行降序排序。
  5. 将排序后的两部分合并回一个列表中。
  6. 输出最终的排序列表。

3.32 为什么应尽量从列表的尾部进行元素的增加与删除操作?

  • 列表的尾部增加和删除操作通常比头部或中间更高效,因为这些操作不需要移动列表中的其他元素。
  • 当在列表中间或头部增加或删除元素时,Python需要移动该元素之后的所有元素,以保持列表的连续性,这增加了时间复杂度。
  • 尾部操作不需要这种移动,因此更快,特别是对于大型列表来说,性能差异更加明显。

END

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,让我们来谈谈 Python 中的异常处理。在 Python 中,异常是程序在运行时遇到的错误或问题,它会导致程序停止运行并抛出一个异常。为了避免这种情况,我们可以使用 try/except 块来捕获并处理异常。例如: ``` try: # some code that might raise an exception except SomeException: # handle the exception ``` 其中,SomeException 是你想要捕获的异常类型。当代码运行到 try 块中的代码时,如果出现了 SomeException 异常,那么 except 块中的代码就会被执行。 接下来,让我们来谈谈 Python 中的对象。在 Python 中,一切都是对象,包括数字、字符串、函数等等。对象有一个类型,它定义了对象可以执行的操作。例如,数字类型可以执行加、减、乘等操作,字符串类型可以执行拼接、切片等操作。你也可以创建自己的对象,并定义它们的类型和操作。 最后,让我们来谈谈 Python 中的代器。代器是一种对象,它可以让你逐个访问一个序列中的元素。Python 中的代器是通过 __iter__ 和 __next__ 方法实现的。__iter__ 方法返回一个代器对象,__next__ 方法返回序列中的下一个元素。例如: ``` class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration result = self.data[self.index] self.index += 1 return result my_iter = MyIterator([1, 2, 3]) for item in my_iter: print(item) ``` 在上面的例子中,我们创建了一个名为 MyIterator 的代器对象。它有一个 data 属性,表示要代的序列,以及一个 index 属性,表示当前代的位置。__iter__ 方法返回 self,表示它本身就是一个代器对象。__next__ 方法返回序列中的下一个元素,并将 index 属性加 1。当代器遍历到序列末尾时,会抛出 StopIteration 异常,表示代结束。 希望这些信息能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_千思_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值