Python常见面试题的详解12

1. hasattr ()、getattr ()、setattr () 函数是如何使用的?

  • 要点

这三个函数用于对对象的属性进行检查、获取和设置操作,是 Python 中进行对象属性动态操作的重要工具。

  1. hasattr():用于检查对象是否具有指定属性或方法。

  2. getattr():用于获取对象的属性或方法,还可设置默认值。

  3. setattr():用于设置对象的属性值,若属性不存在则创建。

python

class Book:
    def __init__(self, title):
        self.title = title

# 创建 Book 类的实例
my_book = Book("Python Programming")

# hasattr() 示例
print(hasattr(my_book, "title"))  # 输出 True,因为 my_book 有 title 属性
print(hasattr(my_book, "author"))  # 输出 False,my_book 没有 author 属性

# getattr() 示例
print(getattr(my_book, "title"))  # 输出 "Python Programming"
print(getattr(my_book, "author", "Unknown"))  # 输出 "Unknown",因为 author 属性不存在,返回默认值

# setattr() 示例
setattr(my_book, "author", "John Doe")
print(my_book.author)  # 输出 "John Doe",成功设置 author 属性
  • 示例

这些函数在动态编程中非常有用,例如在编写插件系统时,可以根据配置文件动态检查和设置对象的属性。

python

# 模拟插件系统
class Plugin:
    def __init__(self):
        self.enabled = False

plugin = Plugin()
config = {"enabled": True}

for key, value in config.items():
    if hasattr(plugin, key):
        setattr(plugin, key, value)

print(plugin.enabled)  # 输出 True,根据配置动态设置了属性

2. 写出阶乘函数reduce(lambda x,y : x*y,range(1,n+1))的结果。

  • 要点

使用 reduce 函数结合 lambda 表达式可以简洁地实现阶乘计算。reduce 函数会对序列中的元素进行累积操作,lambda 表达式定义了累积的规则。

python

from functools import reduce

n = 6
factorial = reduce(lambda x, y: x * y, range(1, n + 1))
print(factorial)  # 输出 720,即 6 的阶乘
  • 示例

可以添加边界条件处理,当 n 为 0 或负数时返回相应结果。

python

from functools import reduce

def factorial(n):
    if n < 0:
        return None
    if n == 0:
        return 1
    return reduce(lambda x, y: x * y, range(1, n + 1))

print(factorial(-1))  # 输出 None
print(factorial(0))   # 输出 1
print(factorial(5))   # 输出 120

2. 什么是 lambda 函数? 有什么好处?

  • 要点

lambda 函数是一种匿名函数,语法简洁,通常用于编写简单的、一次性使用的函数。其好处包括代码简洁、适合临时使用和提高代码可读性。

python

# 普通函数定义
def add_numbers(a, b):
    return a + b

# lambda 函数定义
add = lambda a, b: a + b

print(add(2, 3))  # 输出 5
  • 示例

lambda 函数常用于高阶函数,如 mapfilter 等。

python

numbers = [1, 2, 3, 4, 5]
# 使用 lambda 函数结合 map 计算每个数的平方
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)  # 输出 [1, 4, 9, 16, 25]

# 使用 lambda 函数结合 filter 筛选出偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出 [2, 4]

3. 递归函数停止的条件是什么?

  • 要点

递归函数是在函数内部调用自身的函数,必须有停止条件,否则会导致无限递归和栈溢出错误。停止条件也称为递归的基准情况,是递归函数不再调用自身的情况。

python

def sum_numbers(n):
    if n == 0:  # 停止条件
        return 0
    return n + sum_numbers(n - 1)

print(sum_numbers(5))  # 输出 15,计算 1 到 5 的和
  • 示例

递归函数可以用于解决许多问题,如斐波那契数列的计算。

python

def fibonacci(n):
    if n <= 1:  # 停止条件
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(6))  # 输出 8,计算第 6 个斐波那契数

4. 如何理解设计模式,简要说明

  • 要点

设计模式是软件开发中针对反复出现的问题总结出的通用解决方案,有助于提高软件的可维护性、可扩展性和可复用性。常见的设计模式包括单例模式、工厂模式、观察者模式和装饰器模式等。

      1. 单例模式:确保一个类只有一个实例,并提供全局访问点。

python

class SingletonLogger:
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

logger1 = SingletonLogger()
logger2 = SingletonLogger()
print(logger1 is logger2)  # 输出 True,说明是同一个实例

        2. 工厂模式:定义创建对象的接口,让子类决定实例化哪个类。

python

class Dog:
    def speak(self):
        return "Woof!"

class Cat:
    def speak(self):
        return "Meow!"

class AnimalFactory:
    def create_animal(self, animal_type):
        if animal_type == "dog":
            return Dog()
        elif animal_type == "cat":
            return Cat()

factory = AnimalFactory()
dog = factory.create_animal("dog")
print(dog.speak())  # 输出 "Woof!"
  • 示例

设计模式在不同的应用场景中可以组合使用,以满足更复杂的需求。例如,在一个大型的游戏开发中,可以结合工厂模式创建游戏角色,使用单例模式管理游戏的全局状态。

5. 请手写一个单例

  • 要点

单例模式确保一个类只有一个实例,并提供全局访问点。可以通过多种方式实现,如类属性、装饰器等。

       1. 使用类属性实现单例

python

class DatabaseConnection:
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

conn1 = DatabaseConnection()
conn2 = DatabaseConnection()
print(conn1 is conn2)  # 输出 True,说明是同一个实例

          2. 使用装饰器实现单例

python

def singleton(cls):
    instances = {}

    def get_instance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]

    return get_instance

@singleton
class Config:
    pass

config1 = Config()
config2 = Config()
print(config1 is config2)  # 输出 True,说明是同一个实例
  • 示例

在多线程环境下,单例模式需要考虑线程安全问题。可以使用锁机制来确保在多线程环境下也能正确实现单例。

python

import threading

class ThreadSafeSingleton:
    _instance = None
    _lock = threading.Lock()

    def __new__(cls):
        with cls._lock:
            if not cls._instance:
                cls._instance = super().__new__(cls)
            return cls._instance

6. 单例模式的应用场景有那些?

  • 要点

单例模式适用于需要确保资源唯一性和一致性的场景,如资源管理、配置管理、日志记录和 GUI 编程等。

      1. 资源管理:数据库连接池通常使用单例模式,确保系统中只有一个连接池实例,避免资源浪费和冲突。

python

import sqlite3

class DatabaseConnectionPool:
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._instance.conn = sqlite3.connect('example.db')
        return cls._instance

pool1 = DatabaseConnectionPool()
pool2 = DatabaseConnectionPool()
print(pool1.conn is pool2.conn)  # 输出 True,说明是同一个连接

         2. 配置管理:应用程序的配置信息通常使用单例模式管理,确保所有模块使用相同的配置。

python

class AppConfig:
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._instance.config = {'debug': True, 'port': 8080}
        return cls._instance

config1 = AppConfig()
config2 = AppConfig()
print(config1.config is config2.config)  # 输出 True,说明是同一个配置实例
  • 示例

在分布式系统中,单例模式的实现会更加复杂,可能需要借助分布式锁或共享存储来确保全局唯一性。

7. 什么是闭包?

  • 要点

闭包是指有权访问另一个函数作用域中变量的函数。即使该函数已经执行完毕,其作用域内的变量也不会被销毁,而是会被闭包所引用。

python

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
print(closure(5))  # 输出 15,闭包访问了 outer_function 中的变量 x
  • 示例

闭包可以用于实现数据的封装和隐藏,以及创建可定制的函数。

python

def multiplier(factor):
    def multiply(number):
        return number * factor
    return multiply

double = multiplier(2)
triple = multiplier(3)

print(double(5))  # 输出 10
print(triple(5))  # 输出 15

8. 函数装饰器有什么作用?

  • 要点

函数装饰器可以在不修改原函数代码的情况下,为函数添加额外的功能,实现代码复用和功能扩展,提高代码的可读性和可维护性。

python

def timer_decorator(func):
    import time
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")
        return result
    return wrapper

@timer_decorator
def slow_function():
    import time
    time.sleep(2)

slow_function()  # 输出函数执行时间
  • 示例

装饰器可以嵌套使用,为函数添加多个功能。

python

def uppercase_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def exclamation_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result + "!"
    return wrapper

@uppercase_decorator
@exclamation_decorator
def greet(name):
    return f"Hello, {name}"

print(greet("Alice"))  # 输出 "HELLO, ALICE!"

9. 生成器,迭代器的区别?

  • 要点

迭代器是实现了 __iter__()__next__() 方法的对象,用于遍历序列;生成器是一种特殊的迭代器,可以通过生成器函数(使用 yield 关键字)或生成器表达式创建,具有惰性求值的特点,更节省内存。生成器表达式在处理大数据集时,内存使用效率更高,因为它是惰性求值的。

      1. 迭代器

python

my_list = [1, 2, 3]
my_iterator = iter(my_list)
print(next(my_iterator))  # 输出 1
print(next(my_iterator))  # 输出 2
print(next(my_iterator))  # 输出 3
try:
    print(next(my_iterator))
except StopIteration:
    print("No more elements")

         2. 生成器

python

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(next(gen))  # 输出 1
print(next(gen))  # 输出 2
print(next(gen))  # 输出 3
try:
    print(next(gen))
except StopIteration:
    print("No more elements")
  • 示例

生成器表达式是一种更简洁的生成器创建方式,类似于列表推导式。

python

# 生成器表达式
gen_expr = (x ** 2 for x in range(5))
for num in gen_expr:
    print(num)  # 依次输出 0, 1, 4, 9, 16

# 列表推导式
list_comp = [x ** 2 for x in range(5)]
print(list_comp)  # 输出 [0, 1, 4, 9, 16]

友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

https://download.csdn.net/download/ylfhpy/90398541

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode集成deepseek使用介绍(Visual Studio Code)

VSCode集成deepseek使用介绍&#xff08;Visual Studio Code&#xff09; 1. 简介 随着AI辅助编程工具的快速发展&#xff0c;VSCode作为一款轻量级、高度可扩展的代码编辑器&#xff0c;已成为开发者首选的工具之一。DeepSeek作为AI模型&#xff0c;结合Roo Code插件&#x…

Qt中利用httplib调用https接口

httplib中如果要调用https接口&#xff0c;需要开启OPENSSL支持&#xff0c;经过半天坑爹得摸索&#xff0c;总结下经验。 1&#xff0c;下载 并安装Win64OpenSSL 地址如下&#xff0c;我Qt版本是5.15.2 &#xff0c;openssl选择的是 64位&#xff08;Win64OpenSSL-3_3_3.msi…

使用Geotools读取DEM地形数据实战-以湖南省30米数据为例

目录 前言 一、DEM地形数据介绍 1、DEM数据简介 2、DEM应用领域 3、QGIS中读取DEM数据 二、GeoTools解析地形 1、Maven中依赖引用 2、获取数据基本信息 三、总结 前言 随着全球数字化进程的加速&#xff0c;各类地理空间数据呈爆炸式增长&#xff0c;DEM 数据作为其中的…

登录-01.基础登录功能

一.需求分析 当前的页面不需要登录就可以进入&#xff0c;十分不安全&#xff0c;因此要设置登录功能来维护系统的安全性。登录时要根据输入的用户名和密码进行登录校验&#xff0c;如果在数据库中没有找到匹配的用户名和密码的话&#xff0c;那么就无法登录。 因此要先根据用…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

京东杀入外卖界,这波操作到底香不香?

京东杀入外卖界&#xff0c;这波操作到底香不香&#xff1f; 最近外卖圈炸了&#xff01;京东这个电商巨头&#xff0c;居然一声不吭地搞起了外卖&#xff01;一出手就是0佣金&#xff0c;品质堂食 两大杀招&#xff0c;直接把美团、饿了么整懵了。今天咱们就来唠唠&#xff0…

PTH 哈希传递攻击

参考文章&#xff1a;内网渗透 | 哈希传递攻击(Pass-the-Hash,PtH)-腾讯云开发者社区-腾讯云 哈希传递攻击(Pass-the-Hash,PtH)_c 实现 pass the hash功能-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xf…

Vue3项目,蛋糕商城系统

简单的vue3商城 蛋糕商城系统 下单平台 带用户 登录 注册 首页轮播图 购物车后台管理 商品订单 登录注册 商品详情 纯前端无后台、无数据库 纯Vue3项目作业 vue3 setup语法糖写法 技术实现 本项目主要使用如下技术实现&#xff0c; - 基于vue3vite搭建的项目框架 -…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g…

LLM增强强化学习:开启智能决策的新篇章

标题期刊年份关键词Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and MethodsIEEE Transactions on Neural Networks and Learning Systems2024Reinforcement learning (RL), large language models (LLM), vision-language models (V…

ECMAScript6------数组扩展

ECMAScript6------数组扩展 1.扩展运算符1.1 含义1.2 应用(1)复制数组(浅拷贝)(2)合并数组(3)与解构赋值结合(4)字符串(5)实现了Iterator接口的对象(6)Map和Set结构,Generator 函数 2.Array.from和Array.of(1)Array.from(2)Array.of 3.新增的实例方法(1)copyWithin()(2)find(回…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员&#xff0c;发现运维的公司站点被黑页&#xff0c;首页标题被篡改&#xff0c;你获得的信息如下&#xff1a; 操作系统&#xff1a;windows server 2008 R2业务&#xff1a;公司官网网站架构&#xff1a;通过phpstudy运行apache mysqlphp开放端口&…

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体&#xff0c;企业内部知识库通过结构化的信息聚合与动态化的知识流动&#xff0c;为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心&#xff0c;依托数据加密技术构建多层级访问控制机制&#xff0c;确保敏感信…

第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)

重要信息 大会官网&#xff1a;www.amtme.org&#xff08;了解会议&#xff0c;投稿等&#xff09; 大会时间&#xff1a;2025年3月21-23日 大会地点&#xff1a;中国-广州 简介 2025年第十二届先进制造技术与材料工程 (AMTME 2025) 定于2025年3月21-23日在中国广州隆重举…

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台&#xff0c;现在已经移植了&#xff0c;尝试了下效果&#xff0c;降噪效果很显著&#xff0c;噪声带被显著抑制了 降噪前&#xff1a; 降噪后&#xff1a;

禁止WPS强制打开PDF文件

原文网址&#xff1a;禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR&#xff0c;输入&#xff1a;regedit&#xff0c;回车。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

后端Java Stream数据流的使用=>代替for循环

API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…

JUC并发—8.并发安全集合一

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

Java中的常用类 --String

学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型&#xff0c;也就是说String类中已经提前定义好了很多方法都是用来处理字符串的&#xff0c;所以Str…