Python面试题--金三银四(基础篇)

正值“金三银四”招聘季,在网上整理了一些Python面试题,还有相对应的答案 (有一些题目改成了我认为的最优解)
来源:百度搜索,各种公众号平台…
如有侵权可以联系我,秒删
答案如果不对,或者有更优解,可以@我,谢谢
收集不易,希望对大家有帮助

Python基础

1、什么是Python?为什么它会如此流行?

Python是一种解释的、高级的、通用的编程语言。
Python的设计理念是通过使用必要的空格与空行,增强代码的可读性。
它之所以受欢迎,就是因为它具有简单易用的语法。
比如给变量赋值可以这样子写:
a , b = 1, 2
其他语言不能这样子写吧?
还有其他的:爬虫,强大有方便的各种包等等

2、为什么Python执行速度慢,我们如何改进它?

  • Python代码执行缓慢的原因,是因为它是一种解释型语言。它的代码在运行时进行解释,而不是编译为本地语言。

  • 为了提高Python代码的速度,我们可以使用CPython、Numba,或者我们也可以对代码进行一些修改。

  1. 减少内存占用。
  2. 使用内置函数和库。
  3. 将计算移到循环外。
  4. 保持小的代码库。
  5. 避免不必要的循环

3、Python有什么特点?

  1. 易于编码
  2. 免费和开源语言
  3. 高级语言
  4. 易于调试
  5. OOPS支持
  6. 大量的标准库和第三方模块
  7. 可扩展性(我们可以用C或C++编写Python代码)
  8. 用户友好的数据结构

4、Python有哪些应用?

  1. Web开发
  2. 桌面GUI开发
  3. 人工智能和机器学习 (这个领域很强)
  4. 软件开发
  5. 业务应用程序开发
  6. 基于控制台的应用程序
  7. 软件测试
  8. Web自动化
  9. 基于音频或视频的应用程序
  10. 图像处理应用程序

5、Python的局限性?

  1. 速度
  2. 移动开发
  3. 内存消耗(与其他语言相比非常高)
  4. 两个版本的不兼容(2,3)
  5. 运行错误(需要更多测试,并且错误仅在运行时显示)
  6. 简单性

6、Python代码是如何执行的?

  • 首先,解释器读取Python代码并检查是否有语法或格式错误。

  • 如果发现错误,则暂停执行。如果没有发现错误,则解释器会将Python代码转换为等效形式或字节代码。

  • 然后将字节码发送到Python虚拟机(PVM),这里Python代码将被执行,如果发现任何错误,则暂停执行,否则结果将显示在输出窗口中。
    在这里插入图片描述

7、如何在Python中管理内存?

  • Python内存由Python的私有headspace管理。

  • 所有的Python对象和数据结构都位于一个私有堆中。私用堆的分配由Python内存管理器负责。

  • Python还内置了一个的垃圾收集器,可以回收未使用的内存并释放内存,使其可用于headspace。

8、解释Python的内置数据结构?

  • Python中主要有四种类型的数据结构。

  • 列表:列表是从整数到字符串甚至另一个列表的异构数据项的集合。列表是可变的。列表完成了其他语言中大多数集合数据结构的工作。列表在[ ]方括号中定义。
    例如:a = [1,2,3,4]

  • 集合:集合是唯一元素的无序集合。集合运算如联合|,交集&和差异,可以应用于集合。{}用于表示一个集合。
    例如:a = {1,2,3,4}

  • 元组:Python元组的工作方式与Python列表完全相同,只是它们是不可变的。()用于定义元组。
    例如:a =(1,2,3,4)

  • 字典:字典是键值对的集合。它类似于其他语言中的hash map。在字典里,键是唯一且不可变的对象。
    例如:a = {‘number’:[1,2,3,4]}

9、解释//、%、* *运算符?

  • //(Floor Division)-这是一个除法运算符,它返回除法的整数部分。
    例如:5 // 2 = 2

  • %(模数)-返回除法的余数。
    例如:5 % 2 = 1

  • ** (幂)-它对运算符执行指数计算。 a ** b表示a的b次方。
    例如:5 ** 2 = 25、5 ** 3 = 125

10、Python中的单引号和双引号有什么区别?

  • 在Python中使用单引号(’ ')或双引号(" ")是没有区别的,都可以用来表示一个字符串。

  • 这两种通用的表达方式,除了可以简化程序员的开发,避免出错之外,还有一种好处,就是可以减少转义字符的使用,使程序看起来更简洁,更清晰。

  • 补充: 还有 ‘’’ ‘’’ 三引号 一般在里面写注释 比如: ‘’’ 这里是注释 ‘’’
    还可以原模原样的输出里面的内容

11、Python中append,insert和extend的区别?

  • append:在列表末尾添加新元素。

  • insert:在列表的特定位置添加元素。

  • extend:通过添加新列表来扩展列表。如果该参数不是列表,将报错

  • 它们的时间复杂度也是有区别的

numbers = [1,2,3,4,5]
numbers.append(6)
print(numbers)
>[1,2,3,4,5,6]

## insert(position,value)
numbers.insert(2,7)  
print(numbers)
>[1,2,7,3,4,5,6]

numbers.extend([7,8,9])
print(numbers)
>[1,2,7,3,4,5,6,7,8,9]

numbers.append([4,5])
>[1,2,7,3,4,5,6,7,8,9,[4,5]]

break、continue、pass是什么?

  • break:在满足条件时,它将导致程序退出循环。
  • continue:将返回到循环的开头,它使程序在当前循环迭代中的跳过所有剩余语句。
  • pass:使程序传递所有剩余语句而不执行。

13、区分Python中的remove,del和pop?

  • remove:将删除列表中的第一个匹配值,它以值作为参数。
  • del:使用索引删除元素,它不返回任何值。
  • pop:将删除列表中顶部的元素,并返回列表的顶部元素。
numbers = [1,2,3,4,5]
numbers.remove(5)
> [1,2,3,4]

del numbers[0]
>[2,3,4]

numbers.pop()
>4

14、什么是switch语句。如何在Python中创建switch语句?

  • switch语句是实现多分支选择功能,根据列表值测试变量。

  • switch语句中的每个值都被称为一个case。

  • 在Python中,没有内置switch函数,但是我们可以创建一个自定义的switch语句。

switcher = {
   1: "January",
   2: "February",
   3: "March",
   4: "April",
   5: "May",
   6: "June",
   7: "July",
   8: "August",
   9: "September",
   10: "October",
   11: "November",
   12: "December"
}
month = int(input())
print(switcher.get(month))

> 3
march

15、举例说明Python中的range函数?

  • range:range函数返回从起点到终点的一系列序列。

  • range(start, end, step),第三个参数是用于定义范围内的步数(步长)

# number
for i in range(5):
    print(i)
> 0,1,2,3,4

# (start, end)
for i in range(1, 5):
    print(i)
> 1,2,3,4

# (start, end, step)
for i in range(0, 5, 2):
    print(i)
>0,2,4

16、==和is的区别是?

  • is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址

  • == : 比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法

lst1 = [1,2,3]
lst2 = [1,2,3]

lst1 == lst2
>True

lst1 is lst2
>False

17、如何更改列表的数据类型?

要将列表的数据类型进行更改,可以使用tuple()或者set()。

lst = [1,2,3,4,2]

# 更改为集合
set(lst)    ## {1,2,3,4}
# 更改为元组
tuple(lst)  ## (1,2,3,4,2)

18、Python中注释代码的方法有哪些?

  • 在Python中,我们可以通过下面两种方式进行注释。
    1. 三引号’’’,用于多行注释。
    2. 单井号#,用于单行注释。

19、!=和is not运算符的区别?

  • !=如果两个变量或对象的值不相等,则返回true。

  • is not是用来检查两个对象是否属于同一内存对象。

lst1 = [1,2,3,4]
lst2 = [1,2,3,4]

lst1 != lst2
>False

lst1 is not lst2
>True

20、Python是否有main函数?

是的,它有的。只要我们运行Python脚本,它就会自动执行。
Python的main函数在Python解释器里
可以说一个py文件就是一个main函数
这里涉及到的东西有点细节,建议百度看看解释

21、什么是lambda函数?

  • Python 的高阶函数
  • Lambda函数是不带名称的单行函数,可以具有n个参数,但只能有一个表达式。也称为匿名函数。
a = lambda x, y:x + y 
print(a(5, 6))

> 11

22、iterables和iterators之间的区别?

  • iterable:可迭代是一个对象,可以对其进行迭代。在可迭代的情况下,整个数据一次存储在内存中。
  • iterators:迭代器是用来在对象上迭代的对象。它只在被调用时被初始化或存储在内存中。迭代器使用next从对象中取出元素。
# List is an iterable
lst = [1,2,3,4,5]
for i in lst:
    print(i)

# iterator
lst1 = iter(lst)
next(lst1)
>1
next(lst1)
>2
for i in lst1:
    print(i)
>3,4,5 

23、Python中的Map Function是什么?

  • Python 的高阶函数
  • map函数在对可迭代对象的每一项应用特定函数后,会返回map对象。
l3 = map(lambda x,y: x+y ,[1,2,3,4],[1,3,5,7])
print(list(l3))  

#[2, 5, 8, 11]

24、解释Python中的Filter?

  • 过滤器函数,根据某些条件从可迭代对象中筛选值。
# iterable
lst = [1,2,3,4,5,6,7,8,9,10]

def even(num):
    if num%2==0:
        return num

# filter all even numbers
list(filter(even,lst))
# [2, 4, 6, 8, 10] 
---------------------------------------------
#filter
a=[1,2,3,4,5,6,7,8]
b = filter(lambda x: x>5,a)
print(list(b))
#[6, 7, 8]

25、解释Python中reduce函数的用法?

  • Python 的高阶函数
  • reduce()函数接受一个函数和一个序列,并在计算后返回数值。
#reduce():累计运算
from functools import reduce
n = reduce(lambda x,y:x+y,range(1,101))
print(n) #5050

26、什么是pickling和unpickling?

  • pickling: Pickle 模块读入任何 Python 对象(甚至是Python代码),将它们转换成字符串,然后使用 dump 函数将其转储到一个文件中
  • unpickling: 从存储的字符串文件中提取原始 Python 对象的过程,叫做 unpickling 。(逆过程)

解释*args和**kwargs?

  • *args 发送一个非键值对的可变数量参数列表给函数,当我们不确定要传递给函数参数的数量时使用的。
def add(* num):
    sum = 0 
    for val in num:
        sum = val + sum 
    printsum)


add(4,5)
add(7,4,6)
add(10,34,23--------------------- 
9 
17 
67
  • **kwargs 允许将不定长度的键值对,作为参数传递给函数,是当我们想将字典作为参数传递给函数时使用的。
def intro(**data):
    print("\nData type of argument:",type(data))
    for key, value in data.items():
        print("{} is {}".format(key,value))


intro(name="alex",Age=22, Phone=1234567890)
intro(name="louis",Email="a@gmail.com",Country="Wakanda", Age=25)
--------------------------------------------------------------
Data type of argument: <class 'dict'>
name is alex
Age is 22
Phone is 1234567890

Data type of argument: <class 'dict'>
name is louis
Email is a@gmail.com
Country is Wakanda
Age is 25

28、解释re模块的split()、sub()、subn()方法?

  • split():只要模式匹配,此方法就会拆分字符串。
  • sub():此方法用于将字符串中的某些模式替换为其他字符串或序列。
  • subn():和sub()很相似,不同之处在于它返回一个元组,将总替换计数和新字符串作为输出。
import re
string = "There are two ball in the basket 101"


re.split("\W+",string)
---------------------------------------
['There', 'are', 'two', 'ball', 'in', 'the', 'basket', '101']

re.sub("[^A-Za-z]"," ",string)
----------------------------------------
'There are two ball in the basket'

re.subn("[^A-Za-z]"," ",string)
-----------------------------------------
('There are two ball in the basket', 10)

样例二:
-----------------------------------------
#split() :拆分
print(re.split("\d+","123aaa456bbbb789ccc"))  #['', 'aaa', 'bbbb', 'ccc']

#替换
#sub  subn
s = 'shanghai 今天 确诊   4例'
print(re.sub('\s+', '-', s))  #shanghai-今天-确诊-4例
print(re.subn('\s+', '-', s))  #('shanghai-今天-确诊-4例', 3)

29、Python中的生成器是什么?

  • 生成器(generator)的定义与普通函数类似,生成器使用yield关键字生成值。
  • 如果一个函数包含yield关键字,那么该函数将自动成为一个生成器。
  • ⽣成器最佳应⽤场景是:你不想同⼀时间将所有计算出来的⼤量结果集分配到内存当中,特别是结果集⾥还包含循环。
    毕竟这样做会消耗⼤量资源
# A program to demonstrate the use of generator object with next() A generator function 
def Fun(): 
   yield 1
   yield 2
   yield 3

# x is a generator object 
x = Fun()
print(next(x))
-----------------------------
1
print(next(x))
-----------------------------
2

30、如何使用索引来反转Python中的字符串?

string = 'hello'
string[::-1]
> 'olleh'

不使用内置方法呢?
def reverseString(s):
 s = [i for i in s]
 n = len(s) // 2
 length = len(s)
 for i in range(n):
     temp = s[i]
     s[i] = s[length-1-i]
     s[length-i-1] = temp
 return "".join(s)
if __name__ == '__main__':
	reverse_int = reverseString('hello')
	print(reverse_int)

反转数字呢?例如-123 --> -321

def reverse(x):
	if -10<x<10:
		return x
	str_x = str(x)
	if str_x[0] !="-":
		str_x = str_x[::-1]
		x = int(str_x)
	else:
		str_x = str_x[1:][::-1]
		x = int(str_x)
		x = -x
	return x if -2147483648<x<2147483647 else 0

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [2^31,  2^311]。根据这个假设,如果反转后的整数溢出,则返回 0if __name__ == '__main__':
	reverse_int = reverse(-120)
	print(reverse_int)

类和对象有什么区别?

  • 类(Class)被视为对象的蓝图。类中的第一行字符串称为doc字符串,包含该类的简短描述。
  • 在Python中,使用class关键字可以创建了一个类。一个类包含变量和成员组合,称为类成员。
  • 对象(Object)是真实存在的实体。在Python中为类创建一个对象,我们可以使用obj = CLASS_NAME()
    例如:obj = num()
  • 使用类的对象,我们可以访问类的所有成员,并对其进行操作。
class Person:
    """ This is a Person Class"""
    # varable
    age = 10
    def greets(self):
        print('Hello')


# object
obj = Person()
print(obj.greet)
----------------------------------------
Hello

32、你对Python类中的self有什么了解?

  • self表示类的实例。
  • 通过使用self关键字,我们可以在Python中访问类的属性和方法。
  • 注意,在类的函数当中,必须使用self,因为类中没有用于声明变量的显式语法。

33、_init_在Python中有什么用?

  • init”是Python类中的保留方法。
  • 它被称为构造函数,每当执行代码时都会自动调用它,它主要用于初始化类的所有变量。

34、解释一下Python中的继承?

  • 继承(inheritance)允许一个类获取另一个类的所有成员和属性。继承提供代码可重用性,可以更轻松地创建和维护应用程序。
  • 被继承的类称为超类,而继承的类称为派生类/子类。
  • python2的经典类采用 深度优先搜索 继承方式,新式类采用 广度优先搜索 的继承方式
    python3中经典类和新式类都采用 广度优先搜索 的继承方式
class class_name: # 经典类写法
    pass
class class_name(object): # 新式类写法
    pass

35、Python中OOPS是什么?

  • 面向对象编程,抽象(Abstraction)、封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)

36、什么是抽象?

  • 抽象(Abstraction)是将一个对象的本质或必要特征向外界展示,并隐藏所有其他无关信息的过程。

37、什么是封装?

  • 封装(Encapsulation)意味着将数据和成员函数包装在一起成为一个单元。
  • 它还实现了数据隐藏的概念。

38、什么是多态?

  • 多态(Polymorphism)的意思是「许多形式」。
  • 子类可以定义自己的独特行为,并且仍然共享其父类/基类的相同功能或行为。
  • 多态:在继承的基础上(多个子类继承同一个父类,并且重写一个方法),子类中重写的方法可以有不同的功能,
    #那么用父类的对象指向不同的子类,在调用该方法时则可以实现不同的功能

什么是Python中的猴子补丁?

  • 猴子补丁(monkey patching),是指在运行时动态修改类或模块。
from SomeOtherProduct.SomeModule import SomeClass

def speak(self):
    return "Hello!"

SomeClass.speak = speak

40、Python支持多重继承吗?

  • Python可以支持多重继承。多重继承意味着,一个类可以从多个父类派生。

41、Python中使用的zip函数是什么?

  • zip函数获取可迭代对象,将它们聚合到一个元组中,然后返回结果。
  • zip()函数的语法是zip(*iterables)
numbers = [1, 2, 3]
string = ['one', 'two', 'three'] 
result = zip(numbers,string)

print(set(result))
-------------------------------------
{(3, 'three'), (2, 'two'), (1, 'one')}

42、解释Python中map()函数?

  • Python的高阶函数
  • map()函数将给定函数应用于可迭代对象(列表、元组等),然后返回结果(map对象)。
  • 我们还可以在map()函数中,同时传递多个可迭代对象。
numbers = (1, 2, 3, 4)
result = map(lambda x: x + x, numbers)

print(list(result))

43、Python中的装饰器是什么?

  • 装饰器(Decorator)是Python中一个有趣的功能。
  • 它用于向现有代码添加功能。这也称为元编程,因为程序的一部分在编译时会尝试修改程序的另一部分,所以就要用到装饰器
def addition(func):
    def inner(a,b):
        print("numbers are",a,"and",b)
        return func(a,b)
    return inner

@addition
def add(a,b):
   print(a+b)

add(5,6)
---------------------------------
numbers are 5 and 6
sum: 11

44、编写程序,查找文本文件中最长的单词

def longest_word(filename):
    with open(filename, 'r') as infile:
              words = infile.read().split()
    max_len = len(max(words, key=len))
    return [word for word in words if len(word) == max_len]

print(longest_word('test.txt'))
----------------------------------------------------
['comprehensions']

45、编写程序,检查序列是否为回文

a = input("Enter The sequence")
ispalindrome = a == a[::-1]

ispalindrome
>True

46、编写程序,打印斐波那契数列的前十项

fibo = [0,1]
[fibo.append(fibo[-2]+fibo[-1]) for i in range(8)]

fibo
> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

47、编写程序,计算文件中单词的出现频率

from collections import Counter

def word_count(fname):
        with open(fname) as f:
                return Counter(f.read().split())

print(word_count("test.txt"))

48、编写程序,输出给定序列中的所有质数

lower = int(input("Enter the lower range:"))
upper = int(input("Enter the upper range:"))
list(filter(lambda x:all(x % y != 0 for y in range(2, x)), range(lower, upper)))

-------------------------------------------------
Enter the lower range:10
Enter the upper range:50
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

49、编写程序,检查数字是否为Armstrong

在这里插入图片描述

  • 将每个数字依次分离,并累加其立方(位数)。
  • 最后,如果发现总和等于原始数,则称为阿姆斯特朗数(Armstrong)。
num = int(input("Enter the number:\n"))
order = len(str(num))

sum = 0
temp = num

while temp > 0:
   digit = temp % 10
   sum += digit ** order
   temp //= 10

if num == sum:
   print(num,"is an Armstrong number")
else:
   print(num,"is not an Armstrong number")

50、用一行Python代码,从给定列表中取出所有的偶数和奇数

a = [1,2,3,4,5,6,7,8,9,10]
odd, even = [el for el in a if el % 2==1], [el for el in a if el % 2==0]

print(odd,even)
> ([1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

51、从列表中删除多个元素

a = [1,2,3,4,5]
del a[1::2]
print(a)

>[1, 3, 5]

a

52、查找阶乘

import math
n = 6
math.factorial(n)

> 720  

53、矩阵转置

需要将所有行转换为列,反之亦然。在Python中,可以使用zip函数在一行代码中置换一个矩阵。

a=[[1,2,3],
   [4,5,6],
   [7,8,9]] 
transpose = [list(i) for i in zip(*a)] 
transpose

> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

54、什么是PeP?

  • PEP代表Python Enhancement Proposal. 它是一种规则,指定如何格式化Python代码以获得最大可读性.

55、如何在Python中管理内存?

  • python中的内存管理由Python私有堆空间管理.所有Python对象和数据结构都位于私有堆中.

56、什么是python模块,python中有哪些常用的内置模块

  • python模块是包含python代码的.py文件.此代码可以是函数类或变量. 一些常用的内置模块包括:sys,math,random,data,time,JSON

57、输入日期, 判断这一天是这一年的第几天?

import datetime
def dayofyear():
	year = input("请输入年份: ")
	month = input("请输入月份: ")
	day = input("请输入天: ")
	date1 = datetime.date(year=int(year),month=int(month),day=int(day))
	date2 = datetime.date(year=int(year),month=1,day=1)
	return (date1-date2).days+1

58、现有字典 d= {‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按value值进行排序?

sorted(d.items(),key=lambda x:x[1])
x[0]代表用key进行排序;x[1]代表用value进行排序。

59、字典推导式

d = {key:value for (key,value) in iterable}
d = {key:value for key,value in enumerate("qwdfsdf")}
d = {key:value for key,value in zip("ABC",range(3))}

60、请按alist中元素的age由大到小排序

alist = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
def sort_by_age(list1):
	return sorted(alist,key=lambda x:x['age'],reverse=True)

都是很基础的知识点,可以说都是常识
作为一个Python开发者 或者是程序员来说 都基操!!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值