Python八股文:基础知识Part1

1. 不用中间变量交换 a 和 b

这是python非常方便的一个功能可以这样直接交换两个值 


2. 可变数据类型字典在for 循环中进行修改

这道题在这里就是让我们去回答输出的内容,这里看似我们是在for循环中每一次加入了都在list中加入了一个字典,然后字典的键值对的value每次都加了1,实际上最后list中的值只会保留最后一个i的值,因为每一次我们对字典进行赋值的时候用的key都是同一个,每次修改都会将list中已有的字典都修改,内存中只有一个a这个字典的变量


3. 带有不同数据类型的交集并集差集

这里我们一眼看上去可能会觉得这两个集合中的交集只有9.9 和 4 + 3j,但是我们忽略了在进行这种比较的时候,每个数据类型都有自己的Boolean 形态,s1中的True,和s2中的1,在Boolean value中都代表True,所以也算是交集的一部分,同时我们可以发现在求交集的顺序的时候,其实是把后者作为优先,理解成在是 s1&s2就是在s1中找s2里面的元素,所以第一个输出了1,第二个输出了True


4. 逻辑运算符的顺序

在python中,我们进行逻辑运算的时候,参考的优先级应该是not -> and -> or,所以下面这个表达书中

一开始我们就先把not 3 > 2 的结果算出来应该是False,然后我们再记录所有的and左右两边的表达式的结果 (False and True) or (False and True) or (False),最后发现这三个括号中的and的结果都是False,所以最后or连接起来的最终结果还是False


5. 使用max() 对字典

默认比较的是字典中的key,而不是value,但是我们可以通过利用lambda匿名函数来修改key param的值来修改max函数的逻辑

例如这里,key本身默认的是传入字典中key的值,但是这里我们修改为拿到key之后去找字典中key所对应的value的值,这样max()比较的就是每一个key的value大小了,并且返回的依然是key的值 


6. 自定义函数装饰器

这里可以看到我们是如何定义装饰器的,或者可以给装饰器定义任意参数和关键字参数然后保证被修饰的函数可以传入任何参数

def my_decorator(func):def wrapper(*args, **kwargs):print("Something is happening before the function is called.")result = func(*args, **kwargs)print("Something is happening after the function is called.")return resultreturn wrapper# 装饰器用法
@my_decorator
def say_hello(name):print("Hello, " + name + "!")return "Greeting sent."# 调用被装饰的函数
result = say_hello("Alice")
print(result)

 7. 简单的复制文件代码


8. Python的异常处理机制

当面试官询问 Python 的异常处理机制时,你可以从以下几个方面来介绍:

1. **异常的概念**:异常是 Python 中用于处理程序在运行过程中遇到的错误或异常情况的一种机制。当程序出现错误时,Python 解释器会引发一个异常对象,导致程序执行被中断,同时异常对象包含了错误的相关信息。

2. **异常处理语句**:在 Python 中,我们可以使用 `try`、`except`、`else` 和 `finally` 等关键字来处理异常。这些关键字可以使程序在出现异常时执行相应的处理逻辑,以保证程序的稳定性和可靠性。

3. **`try-except` 块**:`try-except` 块用于捕获异常并进行处理。在 `try` 块中编写可能会引发异常的代码,然后在 `except` 块中指定处理异常的逻辑。如果 `try` 块中的代码引发了异常,则会跳转到相应的 `except` 块进行处理,而不会导致程序终止。

4. **异常类型**:Python 中有许多内置的异常类型,比如 `SyntaxError`、`TypeError`、`ValueError` 等。你可以根据具体的情况选择捕获特定类型的异常,以便进行精确的处理。

5. **`else` 块**:`else` 块用于在 `try` 块中没有发生异常时执行的代码。如果 `try` 块中的代码成功执行完成,没有引发异常,则会执行 `else` 块中的代码。

6. **`finally` 块**:`finally` 块用于在无论是否发生异常都需要执行的清理操作,比如关闭文件或释放资源。`finally` 块中的代码会在 `try` 块中的代码执行完成后执行,即使 `try` 块中的代码引发了异常也会执行。

try:# 可能会引发异常的代码result = 10 / 0
except ZeroDivisionError:# 处理除零异常print("Error: Division by zero!")
else:# 如果没有异常发生时执行的代码print("No exceptions occurred.")
finally:# 无论是否发生异常都需要执行的清理操作print("Cleaning up resources.")

9. 利用生成器计算一组数组的阶乘

在 Python 中,生成器(Generator)是一种特殊的迭代器,它允许按需生成值,而不是一次性生成并存储所有值。生成器是使用函数和 yield 语句来创建的。当生成器函数被调用时,它会返回一个生成器对象,而不是执行函数体中的代码。每次调用生成器的 next() 方法或使用 for 循环迭代生成器时,生成器函数会从上一次停止的地方继续执行,直到遇到下一个 yield 语句,然后返回其值,并暂停执行。这使得生成器在处理大型数据集或无限序列时非常高效,因为它们在需要时逐个生成值,而不会一次性将所有值加载到内存中。 


10. 继承中的函数调用

这里就是在说当我们调用一个子类中没有的函数的时候,就会去父类中找,然后呢在父类中调用f1函数用的是self,这里的self是实例化的对象,也就是说尽管调用的是父类的f1,但是obj是一个bar对象,所以self.f1()还是会call Bar中的f1对象,而不是父类中的

如果只有开头有双下划线 __function 而没有结尾,这通常是用于指示私有属性或方法。虽然 Python 中没有真正的私有属性或方法,但是以双下划线开头的属性或方法会被解释器修改名称,以避免与子类中的同名属性或方法冲突。

 就像在这里,我们的私有方法是没办法在类外面进行访问的,所以当foo.f2被执行的时候, __f1( )所指的就是我们Foo中的私有函数__f1


11. 对象实例化的调用

我们可以通过修改__call__这个内置函数来对一个实例化的对象进行调用


12. 单例模式

单例模式是一种设计模式,它确保类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于管理共享资源、数据库连接、配置对象等。

实现单例模式的方法通常包括:

1. **懒汉式**:在需要时才创建单例实例。这种方法可能会导致线程安全问题,因此需要进行适当的同步处理。

   class Singleton:__instance = None@classmethoddef get_instance(cls):if cls.__instance is None:cls.__instance = Singleton()return cls.__instance

2. **饿汉式**:在类加载时就创建单例实例。这种方法在多线程环境下是线程安全的,但可能会浪费内存。

   class Singleton:__instance = Singleton()@classmethoddef get_instance(cls):return cls.__instance

3. **基于装饰器**:使用装饰器来装饰类,使其只能有一个实例。

   def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singletonclass MyClass:pass

无论使用哪种方法,单例模式都可以确保在应用程序的生命周期中,只有一个实例被创建并且可以被全局访问。


13. 深拷贝和浅拷贝

在python中我们列表本身的copy函数, list.copy( )和copy包中的copy.copy( ) 执行的都是浅拷贝,浅拷贝只成功”独立“拷贝了列表的外层,而列表的内层列表,还是共享的

深拷贝使得两个列表完全独立开来,每一个列表的操作,都不会影响到另一个 


14. __new__ 和 __init__ 的区别

`__new__` 和 `__init__` 都是 Python 中用于创建对象的特殊方法(也称为魔术方法或构造方法),它们在面向对象编程中起着不同的作用。

__new__` 方法:

- `__new__` 是一个静态方法(类方法),它在对象实际创建之前被调用。
- `__new__` 负责创建实例对象,并返回该实例对象。它是一个类级别的方法,因此它的第一个参数是类本身(通常命名为 `cls`)。
- `__new__` 方法在对象实例化时最先被调用,它负责分配内存空间、创建对象,并返回对象的引用。
- 通常情况下,你不需要直接调用 `__new__` 方法,因为 Python 会在调用 `__init__` 方法之前自动调用 `__new__` 方法来创建对象。

 __init__` 方法:

- `__init__` 是一个实例方法,在对象创建后被调用,用于初始化对象的状态。
- `__init__` 方法可以接受额外的参数,用于初始化对象的属性。
- `__init__` 方法中通常包含初始化对象的代码,如给对象的属性赋值等。
- 当你使用类创建对象时,Python 会在调用 `__new__` 方法创建对象后立即调用 `__init__` 方法来初始化对象。

区别:

- `__new__` 是创建实例对象的方法,它负责分配内存空间并返回对象的引用,而 `__init__` 是初始化对象状态的方法,它负责给对象的属性赋初值。
- `__new__` 在对象实例化时调用,而 `__init__` 在对象初始化时调用。
- `__new__` 方法返回一个对象的引用,而 `__init__` 方法不返回任何值。

总而言之,`__new__` 和 `__init__` 在对象的创建和初始化过程中起着不同的作用,`__new__` 负责创建对象,而 `__init__` 负责初始化对象的属性。通常情况下,你只需要在需要特殊处理时重写 `__new__` 方法,而 `__init__` 方法则用于初始化对象的常规属性。


15. map( )函数返回的是一个迭代器iterator对象,需要用list( )来转换成列表


16. isinstance( ) 和 type( ) 的区别

type() 不会认为子类是一种父类类型,不考虑继承关系

isinstance() 会认为子类是一种父类类型,考虑继承关系


 17. Python常用的标准库

  • os:提供不少于操作系统相关联的函数
  • sys:提供了访问Python解释器相关信息的接口,比如命令行参数、标准输入输出等。通常用于命令行参数。
  • datetime:日期时间
  • re:正则匹配
  • math:数学运算
  • unitest:进行模块的单元测试
  • random:提供生成伪随机数的函数
  • threading:多线程编程相关功能
  • time:提供了时间相关的函数和类,比如计时器
  • json:提供对json数据的序列化反序列化操作
  • socket:提供了网络编程相关的功能,比如创建 TCP/UDP 连接等。
  • logging:提供了日志记录相关的功能。

 18. 装饰器的使用场景

记录日志:装饰器可以用于记录函数的调用信息,包括输入参数和返回值。这对于调试和性能分析非常有用。

def log(func):def wrapper(*args, **kwargs):print(f"Calling function {func.__name__}")result = func(*args, **kwargs)print(f"Function {func.__name__} returned {result}")return resultreturn wrapper@log
def add(a, b):return a + badd(1, 2)  # 输出:Calling function add  Function add returned 3

计时:装饰器可以用于测量函数的执行时间。这对于性能优化和代码分析很有帮助。

import timedef timer(func):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 run")return resultreturn wrapper@timer
def fibonacci(n):if n <= 1:return nreturn fibonacci(n-1) + fibonacci(n-2)fibonacci(10)  # 输出:Function fibonacci took 0.001234567 seconds to run

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地项目提交 Github

工具 GitIdeaGithub 账号 步骤 使用注册好的 Github 账号&#xff0c;登陆 Github&#xff1b; 创建 Repositories (存储库)&#xff0c;注意填写图上的红框标注&#xff1b; 创建完成之后&#xff0c;找到存储库的 ssh 地址或 https 地址&#xff0c;这取决于你自己的配置…

TiDB 组件 GC 原理及常见问题

本文详细介绍了 TiDB 的 Garbage Collection&#xff08;GC&#xff09;机制及其在 TiDB 组件中的实现原理和常见问题排查方法。 TiDB 底层使用单机存储引擎 RocksDB&#xff0c;并通过 MVCC 机制&#xff0c;基于 RocksDB 实现了分布式存储引擎 TiKV&#xff0c;以支持高可用分…

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

React Redux 和 Vuex 都是前端状态管理库&#xff0c;分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制&#xff0c;帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点&#xff1a; 相同点&#xff1a; 中心化状态管理&#xff1a;两者都提…

tailwindcss+vue3+vite+preline项目搭建

最近原子化样式比较火&#xff0c;用了一下确实还不错&#xff0c;也确实是用一些标准的样式能够使网页看起来比较统一&#xff0c;而且能够极大的减轻起名字的压力&#xff0c;有利有弊&#xff0c;就不一一细说了。 之前开发都是习惯于使用vitevue3来开发的&#xff0c;此次搭…

Rocky(Centos)数据库等高并发或高io应用,linux应调优系统

一、系统参数优化 默认的最大打开文件数是1024.不满足生产环境的要求。按照如下配置&#xff1a; 1、修改 systemctl管理的 servie 资源限制 编辑/etc/systemd/system.conf # 全局的打开文件数 DefaultLimitNOFILE2097152 # 全局打开进程数 DefaultLimitNPROC655352、调整系…

Windows下编译boost库

官网&#xff1a;https://www.boost.org/ 使用git bash运行bootstrap.sh 运行b2.exe,会生成bin.v2文件夹 Cmake引入

【springboot开发】MVC和SSM

前言&#xff1a;关于MVC和SSM基本内容的梳理&#xff0c;以及两者之间的关系。 文章目录 1. 三层架构2. MVC3. SSM 1. 三层架构 三层架构是指&#xff1a; 视图层view&#xff08;表现层&#xff09;: 用于显示数据和接收用户输入的数据&#xff0c;为用户提供一种交互式操作…

CADMap3D2024 2023下载地址及安装教程

CAD Map 3D是由Autodesk开发的一款专业的地图制作和GIS&#xff08;地理信息系统&#xff09;软件。它是AutoCAD系列软件的一个扩展&#xff0c;提供了一系列特定于地理数据的工具和功能。 CAD Map 3D主要用于处理和管理与地理空间相关的数据&#xff0c;在地图制作、城市规划…

stackqueuepriority_queue容器适配器仿函数反向迭代器

文章目录 容器适配器适配器STL标准库中stack和queue的底层结构 dequedeque原理介绍deque的缺陷为什么选择deque作为stack和queue的底层默认容器 stackstack介绍stack的使用stack模拟实现 queuequeue的介绍queue的使用queue的模拟实现 priority_queue&#xff08;优先队列&#…

【算法刷题】八大排序算法总结(冒泡、选择、插入、二分插入、归并、快速、希尔、堆排序)

文章目录 八大排序算法总结1.冒泡排序2.选择排序3.插入排序4.二分插入排序5.归并排序6.快速排序7.希尔排序8.堆排序 八大排序算法总结 排序排序方法平均情况最好情况最坏情况空间稳定性1冒泡排序O(n2)O(n)O(n2)O(1)稳定2选择排序O(n2)O(n2)O(n2)O(1)不稳定3插入排序O(n2)O(n)O…

windows wireshark抓包rtmp推流出现TCP Retransmission

解决办法&#xff1a;tcp.port1935 && !(tcp.analysis.retransmission)

将扁平数据转换为树形数据的方法

当遇到了好多扁平数据我们都无从下手&#xff1f;不知道如何处理&#xff1f; 家人们 无脑调用这个函数就好了 接口请求回来以后 调用这个函数传入实参就可以用啦~ // 树形菜单函数 function GetTreeData(data) {let TreeData [];let map new Map(); //存在id,对应所在的内…

Unity之Unity面试题(三)

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之Unity面试题&#xff08;三&#xff09; TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取…

关于Salesforce DevOps的理解

“DevOps”是一组结合了软件开发 &#xff08;Dev&#xff09; 和运营 &#xff08;Ops&#xff09; 的实践&#xff0c;可帮助团队更快、更可靠地构建、测试和发布软件。 DevOps 的核心理念包括持续集成&#xff08;Continuous Integration&#xff09;、持续交付&#xff08;…

1.微服务

一、微服务是什么 微服务是一种架构风格&#xff0c;即&#xff0c;一个应用应该是一组小型服务&#xff0c;每个服务器只负责一种服务&#xff0c;服务之间可以通过 HTTP 的方式进行互通。每一个功能元素最终都是一个可独立替换和独立升级的软件单元。 可以说&#xff0c;微…

SSL数字证书

SSL数字证书产品提供商主要来自于国外&#xff0c;尤其是美国&#xff0c;原理和使用操作系统一样&#xff0c;区别在于SSL数字证书目前无法替代性&#xff0c;要想达到兼容性99%的机构目前全球才3-4家&#xff0c;目前国内的主流网站主要使用的是国际证书&#xff0c;除了考虑…

【简单讲解下Kotlin】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Maven与Jave web结构

Maven 简介 https://www.liaoxuefeng.com/wiki/1252599548343744/1255945359327200 java web module web目录 –src 应用程序源代码和测试程序代码的根目录 –main –java  应用程序源代码目录     --package1     --class1     --class2 –resources  应用…

华为S5735S核心交换配置实例

以下脚本实现创建vlan2,3&#xff0c;IP划分&#xff0c;DHCP启用&#xff0c;接口划分&#xff0c;ssh,telnet,http,远程登录启用 默认用户创建admin/admin123提示首次登录需要更改用户密码 sysname test-Hxvlan 2 description to test1…

LeetCode 53. 最大子序和

解题思路 相关代码 class Solution {public int maxSubArray(int[] nums) {//f[i]是以nums[i]结尾的连续子数组的最大和。int f[] new int[100010];f[0] nums[0];int resnums[0];for(int i1;i<nums.length;i){f[i] Math.max(f[i-1]nums[i],nums[i]);res Math.max(res,f…