(计算机基础 核心知识)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 问题应对、自我介绍等通用能力。考虑到历史格式混乱、质量较低、也在本地积累了大量资料,故准备从头重构专栏全部内容

全部评论

相关推荐

全自动干饭机:今日我若冷眼旁观,他日亦无人为我摇旗呐喊。xd加油!
投递美团等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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