(计算机基础 核心知识)Python

1.Python中的列表和元组有什么区别?

元组和列表同属序列类型,且都可以按照特定顺序存放一组数据,数据类型不受限制,只要是 Python 支持的数据类型就可以。那么,元组和列表有哪些区别呢?

元组和列表最大的区别就是,列表中的元素可以进行任意修改,就好比是用铅笔在纸上写的字,写错了还可以擦除重写;而元组中的元素无法修改,除非将元组整体替换掉,就好比是用圆珠笔写的字,写了就擦不掉了,除非换一张纸。

可以理解为,tuple 元组是一个只读版本的 list 列表。元组的性能速度要优于列表。

当然,如果你想要增加、删减或者改变元素,那么列表显然更优。因为对于元组来说,必须得通过新建一个元组来完成。

总的来说,元组确实没有列表那么多功能,但是元组依旧是很重要的序列类型之一,元组的不可替代性体现在以下这些场景中:

  1. 元组作为很多内置函数和序列类型方法的返回值存在,也就是说,在使用某些函数或者方法时,它的返回值会元组类型,因此你必须对元组进行处理。
  2. 元组比列表的访问和处理速度更快,因此,当需要对指定元素进行访问,且不涉及修改元素的操作时,建议使用元组。
  3. 元组可以在映射(和集合的成员)中当做“键”使用,而列表不行。这会在后续章节中作详解介绍。

2.Python的主要功能是什么

Python是一种解释型语言。与C语言等语言不同,Python不需要在运行之前进行编译。

Python是动态语言,当您声明变量或类似变量时,您不需要声明变量的类型。

Python适合面向对象的编程,因为它允许类的定义以及组合和继承。Python没有访问说明(如C ++的public,private)。

与 C++、C#、Java 等语言相似,Python 支持将类的属性和方法设置成特定的访问权限,但不是通过关键字区分,而是使用一套约定式的规则。

  1. object公用方法
  2. _object半保护 被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些变量,在模块或类外不可以使用
  3. _ _ object全私有,全保护 私有成员“private”,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据(下面也是重点)

在Python中,函数是第一类对象。它们可以分配给变量。类也是第一类对象

这里所说的第一类对象,其实是指函数作为一个对象,与其他对象具有相同的地位。所有对象都可以赋值给变量,放进容器中,作为参数传递,用作返回值等等。

编写Python代码很快,但运行比较慢。Python允许基于C的扩展,例如numpy函数库。

Python可用于许多领域。Web应用程序开发,自动化,数学建模,大数据应用程序等等。它也经常被用作“胶水”代码。

3.如何在Python中管理内存

python中的内存管理由Python私有堆空间管理。所有Python对象和数据结构都位于私有堆中。程序员无权访问此私有堆。python解释器负责处理这个问题。

Python万物皆对象

Python对象的堆空间分配由Python的内存管理器完成。核心API提供了一些程序员编写代码的工具。

Python还有一个内置的垃圾收集器,它可以回收所有未使用的内存,并使其可用于堆空间。

当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。比如某个新建对象,被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。

4.Python3 命名空间和作用域

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

一般有三种命名空间:

  • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了。

以下实例修改全局变量 num:

#!/usr/bin/python3
 
num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num) 
    num = 123
    print(num)
fun1()
print(num)

以上实例输出结果:

1
123
123

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

#!/usr/bin/python3
 
def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

以上实例输出结果:

100
100

5.什么是PYTHONPATH?

它是导入模块时使用的环境变量。每当导入模块时,也会查找PYTHONPATH以检查各个目录中是否存在导入的模块。解释器使用它来确定要加载的模块。

PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找

6.Python数组和列表有什么区别?

数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。

7.Python中 __init__

构造方法__init__用于创建实例对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它,用来初始化对象的某些属性。

8.[:: - 1}表示什么?

[:: - 1]用于反转数组或序列的顺序。

9.Python中xrange和range的区别?

range()和xrange()都是在循环中使用,输出结果一样

range()返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。

xrange()则不会直接生成一个list,而是每次调用返回其中的一个值(使用称为yield的技术根据需要创建值),内存空间使用极少。因而性能非常好,所以尽量用xrange吧。

xrange()函数在Python3中已经取消。在python3中range()这种实现被移除了,保留了xrange()的实现,且将xrange()重新命名成range()。所以Python3不能使用xrange(),只能使用range()。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
 
for n in fab(5): 
    print n

在保持简洁性的同时获得了 iterable 的效果。

1 
1 
2 
3

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

曾获多国内大厂的 ssp 秋招 offer,且是Java5年的沉淀老兵(不是)。专注后端高频面试与八股知识点,内容系统详实,覆盖约 30 万字面试真题解析、近 400 个热点问题(包含大量场景题),60 万字后端核心知识(含计网、操作系统、数据库、性能调优等)。同时提供简历优化、HR 问题应对、自我介绍等通用能力。考虑到历史格式混乱、质量较低、也在本地积累了大量资料,故准备从头重构专栏全部内容

全部评论

相关推荐

05-18 02:32
已编辑
华东师范大学 Java
倍受打击的一天:淘天笔试前夕看到了蚂蚁面试流程结束的信息(以后一定改掉笔试前看流程的怪癖😅),来不及悲伤就迎战笔试,第一道算法卡了很久,怎么改都只能过15%的用例,交完试卷不久想到是最后一个判断的地方取反了,唉,临场还是慌了,自己刷题应该不会犯这种低级失误,最后1.3/3,暑期是和淘天无缘了😄说说bg吧,废鼠是科班摆子,2月底开始备战暑期实习,技术积累只有快忘完的Java基础/计网/操统,算法将将能做ez也不知道当时怎么想的,一股脑扎紧了Java后端,如果走前端或客户端,应该不至于现在还一无所获。最近3个月,几乎每周都是996,奈何专注力太差,每天有效的学习时间也就5/6个小时,速成了spring,mybatis,包装了一个微服务项目,看了小林的redis,mysql,guide的juc/jvm,常问的八股背的还行,简单学了mq和springcloud,算法吭哧吭哧刷完了hot100(部分二刷)。4月初赶上中期结课的高峰期,清明附近的两周主要忙着学校的事,四月下旬开始海投,估计五一前筛选工作都放缓了,当时投的都泡池子了,只有腾讯的cpp岗捞面(疑似kpi),可能技术栈不对口,面试官问了很基础的java八股也没反馈,然后开始拷打计网/操统,计网都答上了,操统真不会啊手撕是简单的mid,10min码完,用的内置ide也没测试,感觉面试官也不关心结果匆匆结束,三天后感谢信51给自己放了两天假,剩下三天复习了一下八股,泛泛地学了些ai的知识,5.1后笔试扎堆,做了蚂蚁/pdd/灵犀的,隔周哈啰/蚂蚁/pdd约面,当时还挺开心的,觉的自己手撕能力提高了不少,能过大厂的笔试了,殊不知即将迎来面试暴击。哈啰一面,面试官“我们部门是做爬虫的,主要用python,你考虑转岗么,不考虑的话,现在就可以结束了”,我***,简历全篇就技术栈里提了一嘴python,投的也是后端Java岗,转岗的问题不能发邮件问么,“不想转”,开门黑pdd一面,上来先手撕,精准命中算法盲区,好久没接触的堆,只记得小根堆结构,上浮下沉怎么操作全然忘记,卡了半小时没撕出来,不过面试官挺和善,进入项目拷打和八股环节,大概都说到了,但想到手撕卡了那么久,感觉必寄,后续约了二面,不知道是不是陪跑蚂蚁一面,电话面,主要围绕项目问八股,答的七七八八,出的场景题刚好看到过,背出了最佳实践,然后开始问ai,没问具体问题,让我说自己接触到的,扯了15min,面试官也挺和善,反问环节,说我笔试排序比较高,有进展会联系我,感觉发挥的不错,期待了一晚上,结果隔天笔试前夕看到了流程结束的信息(毕竟太晚了,估计前面的人接了offer没hc了,或者同期有更厉害的大佬,不晓得了)蚂蚁自认为发挥不错隔天挂,pdd手撕卡住还进二面,感觉过不过全看运气,好无力淘天笔试又犯低级失误,还有一些生活中的烦心事,叠加在一起,下午心态崩了,也不push自己复习了,放半天假吧,明天从头来过。“世界上,只有一种真正的英雄主义,那就是认清了生活的真相后还依然热爱它”,高中最爱用的作文套话,三年后还在激励着找实习的废鼠与牛友共勉
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务