《对线面试官》| 高频 Python 面试题 pt.1

这篇具有很好参考价值的文章主要介绍了《对线面试官》| 高频 Python 面试题 pt.1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.聊聊 python 中的值传递和引用传递吧

  • 值传递:

值传递意味着在函数调用时,将实际参数的值复制一份传递给函数的形式参数

在函数内部,形式参数将作为局部变量使用,对形式参数的修改不会影响原始变量的值

  • 引用传递

引用传递意味着在函数调用时,将实际参数的引用(内存地址)传递给函数的形式参数

在函数内部,形式参数与原始变量指向同一个内存地址,因此对形式参数的修改也会影响原始变量的值

  • 总结

需要注意的是,Python 中的参数传递方式实际上都是对象的引用传递

但是对于不可变对象,由于其值无法修改,所以看起来表现为值传递;而对于可变对象,由于其值可以修改,所以表现为引用传递

2.什么是 Python 自省

自省(introspection)指的是程序能够在运行时检查对象的类型、属性和方法等信息的能力

Python 是一门具有强大自省能力的语言,它可以在运行时动态地获取和操作对象的信息

Python 中的自省可以通过以下方式实现:

  1. type() 函数:用于获取对象的类型。
  2. dir() 函数:用于列出对象的所有属性和方法。
  3. hasattr()getattr()setattr() 函数:用于检查、获取和设置对象的属性。
  4. isinstance() 函数:用于判断对象是否属于指定类型。
  5. callable() 函数:用于检查对象是否可调用(即是否是函数或方法)。
  6. 函数的 .__code__ 属性:用于获取函数的字节码对象,从而可以进一步分析函数的信息。
  7. 类的 .__dict__ 属性:用于获取类的所有属性和方法。

3.python 中单下划线和双下划线的区别

  • 单下划线

1)在变量或函数名前加上单下划线 _ 表示这是一个私有的变量或函数,这意味着该变量或函数不应该在类外部直接访问(虽然不会强制限制访问,但这个算是一种约定)

class MyClass:
    def __init__(self):
        self._private_var = 42

    def _private_method(self):
        print("This is a private method.")

2)还有一种用途就是占位符,有时候在 for 循环中,我们只关心序列中的某个元素,而不需要使用序列中其他元素或者序列的索引

这时候可以用单下划线作为变量名,表示这个变量不会被使用

numbers = [1, 2, 3, 4, 5]
for _ in numbers:
    print("Hello")
  • 双下划线

1)在类中定义的双下划线变量,这种变量被称为类的私有变量

它们不会被继承,也不能在类外部直接访问。但是在类内部可以通过self.__变量名进行访问

class Parent:
    def __init__(self):
        self.__private_var = 42

    def __private_method(self):
        print("This is a private method.")

2)在变量名前加上双下划线 __ 会触发 Python 的名称改写(name mangling)机制,将变量名改写为_类名__变量名的形式

即如果 Test 类里有一成员 __x,那么 dir(Test) 时会看到 _Test__x 而非 __x。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线

3)双下划线开头双下划线结尾的是一些 Python 的“魔术”对象,如类成员的 __init____del____add____getitem__ 等,以及全局的 __file____name__

官方建议不要将这样的命名方式应用于自己的变量或函数

4.迭代器和生成器的区别

Python 中的迭代器(Iterators)和生成器(Generators)都可用于处理可迭代对象

  • 迭代器(Iterators)

迭代器是实现了迭代协议的对象,通过 __iter__()__next__() 方法进行迭代

__iter__() 方法返回迭代器对象本身,而 __next__() 方法返回下一个元素,需要手动调用 next() 方法来获取下一个元素

迭代器对象可以用于遍历一个序列或者集合,每次调用 __next__() 方法时,会返回序列中的下一个元素,当没有元素可返回时,会引发 StopIteration 异常

numbers = [1, 2, 3, 4, 5]
iterator = iter(numbers)

print(next(iterator))  # 输出 1
print(next(iterator))  # 输出 2
print(next(iterator))  # 输出 3

Python 的 for 循环背后会自动处理可迭代对象,从中获取一个迭代器,并使用迭代器来逐个获取元素。

  • 生成器(Generators)

生成器是一种特殊的迭代器,可以通过函数来创建,当函数中包含 yield 关键字时,该函数就成为生成器函数

成器函数执行到 yield 语句时,会将结果返回给调用者,但并不会终止函数的执行

下次调用生成器的 __next__() 方法时,函数会从上一次 yield 语句处继续执行,直到再次遇到 yield 或者函数结束

def number_generator():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5

generator = number_generator()
print(next(generator))  # 输出 1
print(next(generator))  # 输出 2
print(next(generator))  # 输出 3

5.*args 和 **kwargs 区别

请看我这篇文章

python 星号 * 还能这么用

6.什么是 GIL

GIL(全局解释器锁)是 Python 解释器为了保证多线程情况下解释器的稳定性而引入的一种机制

在 CPython 解释器中,由于解释器的内存管理并不是线程安全的,为了避免多线程情况下的数据竞争和死锁等问题,引入了 GIL

GIL 的作用是确保在同一时刻只有一个线程在解释器中执行字节码。这意味着在多线程程序中,Python 解释器的执行是单线程的

当一个线程获取了 GIL 后,其他线程必须等待该线程释放 GIL 才能继续执行。这样虽然能够保证解释器的稳定性,但也导致了在多核 CPU 上,Python 的多线程程序并不能充分利用多核资源

对于 CPU 密集型任务(例如计算密集型的循环操作),多线程并不能带来性能的提升

但是对于 I/O 密集型任务(例如网络请求、文件读写),多线程可以在等待 I/O 的时间内执行其他任务,提高了整体的效率

7.协程是什么

在 Python 中,协程是一种轻量级的并发编程技术,它允许程序在同一个线程内实现多个协程之间的切换,从而实现非阻塞的并发执行

协程与传统的多线程或多进程并发模型不同,它不依赖于操作系统的线程或进程来实现并发,而是完全由 Python 解释器内部的事件循环机制来控制协程的执行

也就是说可以由用户来管理自己内核态—用户态切换的时机

Python里最常见的 yield 就是协程的思想

一个简单的案例文章来源地址https://www.toymoban.com/news/detail-583106.html

import asyncio

# 定义一个协程函数
async def greet():
    print("Hello")
    await asyncio.sleep(1)  # 模拟耗时操作,让出执行权
    print("World")

# 获取事件循环对象
loop = asyncio.get_event_loop()

# 运行协程函数
loop.run_until_complete(greet())

到了这里,关于《对线面试官》| 高频 Python 面试题 pt.1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python高频面试题——如何在字符串中删除指定字符,掌握strip()、replace()和re.sub ()正确使用方法!

    关于python删除字符串是面试python测试开发工程师的一个经典问题。问题很简单,但是一下子就能测试出来被面试者是否能够熟练的进行python相关编码工作! 对于有些临时抱佛脚的同学来讲,一看删除,很自然就说用remove 、del相关方法,听到这里,就知道面试者根本不知道这

    2024年02月08日
    浏览(47)
  • 深挖 Python 元组 pt.2

    哈喽大家好,我是咸鱼 在《深挖 Python 元组 pt.1》中我们了解 Python 元组的一些概念(索引和切片等),以及如何创建元组,最重要的是我们还介绍了元组的不可变特性 那么今天我们来继续深挖 Python 元组 在 python 中,元组可以被打包( packing )和解包( unpacking ) 例如, p

    2024年02月08日
    浏览(34)
  • 深挖 Python 元组 pt.1

    哈喽大家好,我是咸鱼 好久不见甚是想念,2023 年最后一次法定节假日已经结束了,不知道各位小伙伴是不是跟咸鱼一样今天就开始“搬砖”了呢? 我们知道元组(tuple)是 Python 的内置数据类型, tuple 是一个不可变的值序列 tuple 的元素可以是任何类型,一般用在存储异构数

    2024年02月08日
    浏览(37)
  • 1.Python高频函数—数据合并merge()

    前言 数据处理中经常对多个表的数据进行合并处理,python 提供两个十分好用的函数处理。merge() 、 concat() merger函数是Python里的数据分析工作中最常见的函数之一,主要应用场景是:针对同一个主键存在两张不同字段的表。(这里强调只能用于2张表的合并) merge函数 简要的罗

    2024年02月09日
    浏览(49)
  • Python 超高频常见字符操作【建议收藏】

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码可以在我主页的资源里找到,如果在学习的

    2024年02月08日
    浏览(75)
  • 聊聊Python都能做些什么

    Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。它最初由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python的设计哲学强调代码的可读性,允许开发者用少量代码表达想法,同时支持多种编程范式,包括面向过程、面向对象和函数式编程。

    2024年03月21日
    浏览(45)
  • Python高频交易策略:基于交易成本模型的优化方案

    随着金融市场的复杂性和竞争的加剧,高频交易已成为金融市场中非常重要的一环。Python作为一种高效、易用、流行的编程语言,越来越受到期货、外汇交易策略程序化交易领域的欢迎。本文将介绍如何通过交易成本模型来优化Python高频交易策略。 一、什么是交易成本模型

    2024年02月12日
    浏览(38)
  • 【Python 基础】输入两个数,求它们的求最大公约数(伪码描述 + Python实现)| 区块链 面试题:区块链技术中的“闪电网络”是什么?有什么作用?

      “这样的年代没有谁是值得信任的,你只能靠自己。”     🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿   🌟[3] 2022年度博客之星人工智能领域TOP4🌟   🏅[4] 阿里云社区特邀专家博

    2024年02月01日
    浏览(68)
  • Python实验报告三 python基础试题练习

    1、编写函数求三个整数的最大值,函数原型为 def max3(a, b, c) 2、编写函数main()接收一个包含若干整数的列表参数lst,要求返回其中大于8的偶数组成的新列表,如果不存在就返回空列表。如果接收到的参数lst不是列表或者列表中不都是整数,就返回‘数据不符合要求’。 3、函

    2023年04月19日
    浏览(104)
  • Python实验报告四 python基础试题练习

    定义一个学校人员类SchoolPerson, 其中属性:姓名name、性别sex、年龄age;         方法:设置人员的各个属性的set_info方法;                   获取各属性值的get_info方法。   定义好类以后,再定义2个人员进行测试。  在第1个题的基础上添加两个方法: 其中,__init__()方

    2023年04月26日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包