ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python 基础面试第三弹 [打印本页]

作者: 宁睿    时间: 2023-9-2 22:10
标题: Python 基础面试第三弹
1. 获取当前目录下所有文件名
  1. import os
  2. def get_all_files(directory):
  3.     file_list = []
  4.     # os.walk返回一个生成器,每次迭代时返回当前目录路径、子目录列表和文件列表
  5.     for root, dirs, files in os.walk(directory):
  6.         for file in files:
  7.             file_list.append(os.path.join(root, file))
  8.     return file_list
  9. # 获取当前目录下的所有文件名
  10. current_directory = os.getcwd()
  11. files = get_all_files(current_directory)
  12. # 打印所有文件名
  13. for file in files:
  14.     print(file)
复制代码
 
2. Python中生成器和迭代器区别

迭代器(Iterator)是一种实现了迭代协议的对象,它必须提供一个__iter__()方法和一个__next__()方法。通过调用__iter__()方法,迭代器可以返回自身,并且通过调用__next__()方法,迭代器可以依次返回下一个元素,直到没有更多元素时抛出StopIteration异常。迭代器是一种惰性计算的方式,每次只在需要时生成一个元素,从而节省内存空间。可以使用iter()函数将可迭代对象转换为迭代器。
生成器(Generator)是一种特殊的迭代器,它使用了更为简洁的语法来定义迭代器。生成器可以通过函数中的yield关键字来实现,当函数执行到yield语句时,会暂停执行并返回一个值,保存当前状态,下次调用时从上次暂停的位置继续执行。生成器函数可以像普通函数一样接收参数,并且可以包含循环、条件语句等逻辑。生成器是一种非常方便和高效的迭代器实现方式。
下面是生成器和迭代器的区别总结:
总之,生成器是一种特殊的迭代器,它提供了更简洁和方便的语法。生成器可以通过函数中的yield语句来实现迭代过程,并且可以像普通函数一样编写逻辑。迭代器是一种更通用的概念,可以通过类来实现,需要显式地定义__iter__()和__next__()方法。无论是生成器还是迭代器,它们都能够实现按需生成和处理大量数据的能力,提高了代码的效率和可读性。
 一个小栗子:当我们需要遍历一个很大的数据集时,生成器可以帮助我们按需生成数据,而不是一次性加载整个数据集到内存中。
下面是一个简单的例子,我们使用生成器来按需生成斐波那契数列的前n个元素:
  1. def fibonacci_generator(n):
  2.     a, b = 0, 1
  3.     count = 0
  4.     while count < n:
  5.         yield a
  6.         a, b = b, a + b
  7.         count += 1
  8. # 使用生成器按需生成斐波那契数列的前10个元素
  9. fibonacci = fibonacci_generator(10)
  10. # 逐个打印生成的元素
  11. for num in fibonacci:
  12.     print(num)
复制代码
  
  在上述代码中,我们定义了一个生成器函数fibonacci_generator,它使用了yield语句来生成斐波那契数列的元素。每次调用生成器的__next__()方法时,它会执行到yield语句处,
返回当前的斐波那契数并暂停执行,保存当前状态。然后,下次调用生成器的__next__()方法时,它会从上次暂停的位置继续执行,生成下一个斐波那契数。这样,我们可以通过迭代生成器
来按需获取斐波那契数列的元素。当我们遍历生成器对象时,它会依次生成斐波那契数列的元素并打印出来。由于生成器是按需生成数据的,它只在需要时生成一个元素,而不是一次性生成整
个数列。这样可以节省内存空间,特别是当斐波那契数列很大时。总结起来,生成器可以看作是一种特殊的函数,它能够按需生成数据,节省内存空间,并且提供了一种简洁和方便的方式来
实现迭代器。通过使用生成器,我们可以避免一次性加载大量数据到内存中,而是在需要时逐个生成数据,从而提高代码的效率和可扩展性。
3. 什么是可迭代对象,其原理又是什么

  可迭代对象(Iterable)是指可以被迭代遍历的对象。在许多编程语言中,迭代是指按照一定的顺序逐个访问集合中的元素的过程。在Python中,可迭代对象是指实现了迭代器协议(Iterator Protocol)的对象。
迭代器协议包含两个方法:
当我们使用可迭代对象进行迭代时,实际上是通过迭代器对象来完成的。迭代器对象负责追踪当前的迭代状态,并提供下一个元素。迭代器对象会在每次迭代时调用__next__()方法,并返回下一个元素,直到遍历完所有元素或者引发StopIteration异常为止。
Python中许多内置的数据类型和容器都是可迭代对象,例如列表(List)、元组(Tuple)、字典(Dictionary)、集合(Set)等。此外,我们也可以通过自定义类来实现可迭代对象,只需在类中定义__iter__()方法,并在该方法中返回一个迭代器对象即可。
以下是一个示例,展示了如何使用可迭代对象和迭代器对象进行迭代:
  1. # 创建一个可迭代对象
  2. my_list = [1, 2, 3, 4, 5]
  3. # 获取迭代器对象
  4. my_iter = iter(my_list)
  5. # 使用迭代器对象进行迭代
  6. try:
  7.     while True:
  8.         item = next(my_iter)
  9.         print(item)
  10. except StopIteration:
  11.     pass
复制代码
  在上述示例中,我们通过调用iter()函数获取了my_list的迭代器对象my_iter,然后使用next()函数从迭代器对象中获取下一个元素并打印,直到遍历完所有元素或引发
StopIteration异常为止。可迭代对象的原理是基于迭代器协议的实现,通过迭代器对象的__next__()方法来提供序列中的下一个元素。这种机制使得我们可以方便地对集合中的元素
进行逐个访问和处理,提供了一种统一的迭代接口
自己实现可迭代对象小栗子
 
  1. class MyIterable:
  2.     def __init__(self, data):
  3.         self.data = data
  4.     def __iter__(self):
  5.         self.index = 0
  6.         return self
  7.     def __next__(self):
  8.         if self.index < len(self.data):
  9.             item = self.data[self.index]
  10.             self.index += 1
  11.             return item
  12.         else:
  13.             raise StopIteration
  14. # 创建一个可迭代对象实例
  15. my_iterable = MyIterable([1, 2, 3, 4, 5])
  16. # 使用迭代器进行迭代
  17. for item in my_iterable:
  18.     print(item)
复制代码
4. Python2 和 Python3主要的区别有哪些:

Python 2.x 和 Python 3.x 之间的一些主要区别:
除了上述主要区别之外,Python 3.x 还进行了一些其他改进,包括改进的类定义语法、更好的模块管理和导入机制、更一致的异常处理和错误机制等。然而,这也导致了 Python 2.x 代码无法直接在 Python 3.x 中运行,需要进行一些修改和调整。
 
5. 说说Python中多线程和多进程

总结:
6. Python中GIL锁:

  全局解释器锁(Global Interpreter Lock,简称 GIL)是在 CPython 解释器中存在的一个特性。它是一种机制,用于保证同一时刻只有一个线程执行 Python 字节码。虽然 GIL 的存在确保了 CPython 解释器的线程安全性,但也对多线程并发执行带来了一些限制。
以下是对 GIL 的一些详细解释和理解:
需要注意的是,GIL 只存在于 CPython 解释器中,而其他实现(如 Jython、IronPython)可能没有 GIL。此外,对于许多类型的应用程序,如 I/O 密集型、并发处理不频繁的应用程序,GIL
的影响较小,可以继续使用多线程来实现并发。然而,对于 CPU 密集型任务和需要充分利用多核处理器的应用程序,考虑使用多进程或其他解决方案来规避 GIL。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4