PYTHON 120道题目详解(94-96)

94.Python中的递归函数是什么?请给出一个例子。

递归函数是一种特殊的函数,它在其定义中会调用自身。这种调用通常是在函数的某个条件语句中,当满足某个条件时,函数会调用自身来处理更小或更简单的子问题。递归函数通常用于解决可以分解为相似子问题的问题,例如树或图的遍历,排序算法,阶乘计算等。

下面是一个Python中递归函数的例子,这是一个计算阶乘的函数:

python复制代码

|---|---------------------------------|
| | def factorial(n): |
| | # 递归结束条件 |
| | if n == 0: |
| | return 1 |
| | else: |
| | # 递归调用 |
| | return n * factorial(n-1) |
| | |
| | print(factorial(5)) # 输出: 120 |

在这个例子中,factorial函数是用来计算一个数的阶乘的。当n为0时,函数返回1(因为0的阶乘定义为1)。否则,函数返回n乘以n-1的阶乘,n-1的阶乘是通过递归调用factorial(n-1)来计算的。

递归函数需要注意的是,必须有明确的递归结束条件,否则函数会无限递归下去,导致程序崩溃。在上述例子中,递归结束条件是n == 0

95.Python中的多态和重载有什么区别?

在面向对象编程中,多态(Polymorphism)和重载(Overloading)是两个重要的概念,它们在Python中也有所体现,尽管Python对重载的支持不像一些其他语言(如Java或C++)那样严格。让我们来详细解释一下这两个概念的区别。

多态(Polymorphism)

多态性是面向对象编程的三大特性之一(封装、继承、多态)。多态意味着允许使用父类类型的引用或接口来引用子类的对象。当程序调用子类的方法时,会调用子类中的实现,而不是父类中的实现。这允许我们在不改变代码结构的情况下,通过改变对象类型来改变程序的行为。

在Python中,多态通常是通过继承和方法的重写来实现的。例如:

python复制代码

|---|-------------------------------------------------------------------------|
| | class Animal: |
| | def speak(self): |
| | raise NotImplementedError("Subclass must implement abstract method") |
| | |
| | class Dog(Animal): |
| | def speak(self): |
| | return "Woof!" |
| | |
| | class Cat(Animal): |
| | def speak(self): |
| | return "Meow!" |
| | |
| | def animal_speak(animal): |
| | print(animal.speak()) |
| | |
| | dog = Dog() |
| | cat = Cat() |
| | |
| | animal_speak(dog) # 输出: Woof! |
| | animal_speak(cat) # 输出: Meow! |

在这个例子中,Animal 类有一个名为 speak 的方法,它被子类 DogCat 重写。animal_speak 函数接受一个 Animal 类型的参数,并调用其 speak 方法。由于多态性,当我们传递一个 DogCat 对象时,会调用相应子类的 speak 方法。

重载(Overloading)

重载是指在同一个类中,允许存在一个以上的同名方法,但这些方法必须具有不同的参数列表(参数的类型、数量或顺序),以便编译器在编译时能根据参数的列表选择一个合适的方法执行。

然而,Python并不直接支持方法重载,这意味着你不能在同一个类中定义多个同名但参数不同的方法。Python的设计理念是"明确优于隐晦",因此它更倾向于让程序员明确地调用不同的方法名,而不是依赖于参数类型来决定调用哪个方法。

尽管如此,你可以通过一些技巧来模拟方法重载的行为,例如使用默认参数、可变参数或检查参数类型。但这并不是真正的重载,而是利用Python的其他特性来实现类似的功能。

总结:多态和重载都是面向对象编程中的重要概念,但它们在Python中的实现和用法有所不同。多态主要通过继承和方法的重写来实现,而Python并不直接支持方法重载。

96.Python中的迭代器和生成器有什么区别?

Python中的迭代器和生成器都是用于遍历数据集合的重要工具,它们之间有一些关键的区别。

迭代器(Iterator)

迭代器是一个实现了迭代器协议的对象。迭代器协议包括两个方法:__iter__()__next__()__iter__() 方法返回迭代器对象本身,而 __next__() 方法返回迭代器的下一个值。当没有更多的值可供迭代时,__next__() 方法应该抛出 StopIteration 异常。

迭代器是一个通用的概念,任何实现了迭代器协议的对象都可以被视为迭代器。例如,Python中的列表、元组、字典、集合和文件对象等都是迭代器。

生成器(Generator)

生成器是一种特殊的迭代器,它可以通过函数来创建。生成器函数使用 yield 语句来产生值,而不是使用 return 语句。当生成器函数被调用时,它会返回一个生成器对象,这个对象可以用于迭代。每次迭代时,生成器会从上一次 yield 语句的位置继续执行,直到遇到下一个 yield 语句。

生成器的主要优点是它可以按需生成数据,而不是一次性生成所有数据。这可以节省内存空间,特别是在处理大量数据时。此外,生成器也更加简洁和高效,因为它们自动创建了 __iter__()__next__() 方法。

区别

  1. 语法差异 :生成器使用 yield 语句来产生值,而迭代器使用 __next__() 方法来返回值。
  2. 内存占用:生成器按需生成数据,只在需要时才产生值,因此可以节省内存空间。而迭代器需要一次性生成所有数据,可能会占用较多的内存。
  3. 实现方式:生成器是通过函数来创建的,而迭代器是通过实现迭代器协议的类来创建的。
  4. 可迭代性 :生成器是可迭代的,可以使用 for 循环或者 next() 函数来遍历生成器对象。而迭代器本身就是可迭代的,可以直接使用 for 循环来遍历迭代器对象。

总的来说,生成器是创建迭代器的简单而强大的工具,特别适用于处理大量数据或者需要延迟生成数据的场景。

相关推荐
小oo呆11 分钟前
【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核
python·jupyter·conda
小白学大数据1 小时前
Scrapy框架下地图爬虫的进度监控与优化策略
开发语言·爬虫·python·scrapy·数据分析
浊酒南街1 小时前
TensorFlow之微分求导
人工智能·python·tensorflow
立秋67891 小时前
用Python绘制梦幻星空
开发语言·python·pygame
alpszero1 小时前
YOLO11解决方案之对象裁剪探索
人工智能·python·计算机视觉·yolo11
白云千载尽2 小时前
相机、雷达标定工具,以及雷达自动标定的思路
python·自动驾驶·ros
咕噜咕噜啦啦2 小时前
python爬虫实战训练
爬虫·python
盛夏绽放2 小时前
Python字符串常用内置函数详解
服务器·开发语言·python
我想睡觉2612 小时前
Python训练营打卡DAY27
开发语言·python·机器学习
蹦蹦跳跳真可爱5892 小时前
Python----神经网络(基于DNN的风电功率预测)
人工智能·pytorch·python·深度学习·神经网络·dnn