Python面试题大全(一):基础知识学习

本文讨论了Python处理大文件的内存优化方法,如分块读取和mmap,以及涉及模块与包的使用、日期计算、列表操作、数据类型转换、单例模式实现、字符串操作、作用域原理和编码转换等内容,适合初学者和面试准备者参考。
摘要由CSDN通过智能技术生成

Python基础

========

文件操作


1.有一个jsonline格式的文件file.txt大小约为10K

def get_lines():

with open(‘file.txt’,‘rb’) as f:

return f.readlines()

if name == ‘main’:

for e in get_lines():

process(e) # 处理每一行数据

现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?

def get_lines():

with open(‘file.txt’,‘rb’) as f:

for i in f:

yield i

Pandaaaa906提供的方法

from mmap import mmap

def get_lines(fp):

with open(fp,“r+”) as f:

m = mmap(f.fileno(), 0)

tmp = 0

for i, char in enumerate(m):

if char==b"\n":

yield m[tmp:i+1].decode()

tmp = i+1

if name==“main”:

for i in get_lines(“fp_some_huge_file”):

print(i)

要考虑的问题有:内存只有4G无法一次性读入10G文件,需要分批读入分批读入数据要记录每次读入数据的位置。分批每次读取数据的大小,太小会在读取操作花费过多时间。 https://stackoverflow.com/questions/30294146/python-fastest-way-to-process-large-file

2.补充缺失的代码

def print_directory_contents(sPath):

“”"

这个函数接收文件夹的名称作为输入参数

返回该文件夹中文件的路径

以及其包含文件夹中文件的路径

“”"

import os

for s_child in os.listdir(s_path):

s_child_path = os.path.join(s_path, s_child)

if os.path.isdir(s_child_path):

print_directory_contents(s_child_path)

else:

print(s_child_path)

模块与包


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

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

4.打乱一个排好序的list对象alist?

import random

alist = [1,2,3,4,5]

random.shuffle(alist)

print(alist)

数据类型


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

sorted(d.items(),key=lambda x:x[1])

6.字典推导式

d = {key:value for (key,value) in iterable}

7.请反转字符串 “aStr”?

print(“aStr”[::-1])

8.将字符串 “k:1 |k1:2|k2:3|k3:4”,处理成字典 {k:1,k1:2,…}

str1 = “k:1|k1:2|k2:3|k3:4”

def str2dict(str1):

dict1 = {}

for iterms in str1.split(‘|’):

key,value = iterms.split(‘:’)

dict1[key] = value

return dict1

#字典推导式

d = {k:int(v) for t in str1.split(“|”) for k, v in (t.split(“:”), )}

9.请按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)

10.下面代码的输出结果将是什么?

list = [‘a’,‘b’,‘c’,‘d’,‘e’]

print(list[10:])

代码将输出[],不会产生IndexError错误,就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致Bug很难被追踪到。

11.写一个列表生成式,产生一个公差为11的等差数列

print([x*11 for x in range(10)])

12.给定两个列表,怎么找出他们相同的元素和不同的元素?

list1 = [1,2,3]

list2 = [3,4,5]

set1 = set(list1)

set2 = set(list2)

print(set1 & set2)

print(set1 ^ set2)

13.请写出一段python代码实现删除list里面的重复元素?

l1 = [‘b’,‘c’,‘d’,‘c’,‘a’,‘a’]

l2 = list(set(l1))

print(l2)

用list类的sort方法:

l1 = [‘b’,‘c’,‘d’,‘c’,‘a’,‘a’]

l2 = list(set(l1))

l2.sort(key=l1.index)

print(l2)

也可以这样写:

l1 = [‘b’,‘c’,‘d’,‘c’,‘a’,‘a’]

l2 = sorted(set(l1),key=l1.index)

print(l2)

也可以用遍历:

l1 = [‘b’,‘c’,‘d’,‘c’,‘a’,‘a’]

l2 = []

for i in l1:

if not i in l2:

l2.append(i)

print(l2)

14.给定两个list A,B ,请用找出A,B中相同与不同的元素

A,B 中相同元素: print(set(A)&set(B))

A,B 中不同元素: print(set(A)^set(B))

企业面试题


15.python新式类和经典类的区别?

a. 在python里凡是继承了object的类,都是新式类

b. Python3里只有新式类

c. Python2里面继承object的是新式类,没有写父类的是经典类

d. 经典类目前在Python里基本没有应用

16.python中内置的数据结构有几种?

a. 整型 int、 长整型 long、浮点型 float、 复数 complex

b. 字符串 str、 列表 list、 元祖 tuple

c. 字典 dict 、 集合 set

d. Python3 中没有 long,只有无限精度的 int

17.python如何实现单例模式?请写出两种实现方式?

第一种方法:使用装饰器

def singleton(cls):

instances = {}

def wrapper(*args, **kwargs):

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

return wrapper

@singleton

class Foo(object):

pass

foo1 = Foo()

foo2 = Foo()

print(foo1 is foo2) # True

第二种方法:使用基类 New 是真正创建实例对象的方法,所以重写基类的new 方法,以此保证创建对象的时候只生成一个实例

class Singleton(object):

def new(cls, *args, **kwargs):

if not hasattr(cls, ‘_instance’):

cls._instance = super(Singleton, cls).new(cls, *args, **kwargs)

return cls._instance

class Foo(Singleton):

pass

foo1 = Foo()

foo2 = Foo()

print(foo1 is foo2) # True

第三种方法:元类,元类是用于创建类对象的类,类对象创建实例对象时一定要调用call方法,因此在调用call时候保证始终只创建一个实例即可,type是python的元类

class Singleton(type):

def call(cls, *args, **kwargs):

if not hasattr(cls, ‘_instance’):

cls._instance = super(Singleton, cls).call(*args, **kwargs)

return cls._instance

Python2

class Foo(object):

metaclass = Singleton

Python3

class Foo(metaclass=Singleton):

pass

foo1 = Foo()

foo2 = Foo()

print(foo1 is foo2) # True

18.反转一个整数,例如-123 --> -321

class Solution(object):

def reverse(self,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

if name == ‘main’:

s = Solution()

reverse_int = s.reverse(-120)

print(reverse_int)

19.设计实现遍历目录与子目录,抓取.pyc文件

第一种方法:

import os

def get_files(dir,suffix):

res = []

for root,dirs,files in os.walk(dir):

for filename in files:

name,suf = os.path.splitext(filename)

if suf == suffix:

res.append(os.path.join(root,filename))

print(res)

get_files(“./”,‘.pyc’)

第二种方法:

import os

def pick(obj):

if ob.endswith(“.pyc”):

print(obj)

def scan_path(ph):

file_list = os.listdir(ph)

for obj in file_list:

if os.path.isfile(obj):

pick(obj)

elif os.path.isdir(obj):

scan_path(obj)

if name==‘main’:

path = input(‘输入目录’)

scan_path(path)

第三种方法

from glob import iglob

def func(fp, postfix):

for i in iglob(f"{fp}/**/*{postfix}", recursive=True):

print(i)

if name == “main”:

postfix = “.pyc”

func(“K:\Python_script”, postfix)

20.一行代码实现1-100之和

count = sum(range(0,101))

print(count)

21.Python-遍历列表时删除元素的正确做法

遍历在新在列表操作,删除时在原来的列表操作

a = [1,2,3,4,5,6,7,8]

print(id(a))

print(id(a[:]))

for i in a[:]:

if i>5:

pass

else:

a.remove(i)

print(a)

print(‘-----------’)

print(id(a))

#filter

a=[1,2,3,4,5,6,7,8]

b = filter(lambda x: x>5,a)

print(list(b))

列表解析

a=[1,2,3,4,5,6,7,8]

b = [i for i in a if i>5]

print(b)

倒序删除 因为列表总是‘向前移’,所以可以倒序遍历,即使后面的元素被修改了,还没有被遍历的元素和其坐标还是保持不变的

a=[1,2,3,4,5,6,7,8]

print(id(a))

for i in range(len(a)-1,-1,-1):

if a[i]>5:

pass

else:

a.remove(a[i])

print(id(a))

print(‘-----------’)

print(a)

22.字符串的操作题目

全字母短句 PANGRAM 是包含所有英文字母的句子,比如:A QUICK BROWN FOX JUMPS OVER THE LAZY DOG. 定义并实现一个方法 get_missing_letter, 传入一个字符串采纳数,返回参数字符串变成一个 PANGRAM 中所缺失的字符。应该忽略传入字符串参数中的大小写,返回应该都是小写字符并按字母顺序排序(请忽略所有非 ACSII 字符)

下面示例是用来解释,双引号不需要考虑:

(0)输入: “A quick brown for jumps over the lazy dog”

返回: “”

(1)输入: “A slow yellow fox crawls under the proactive dog”

返回: “bjkmqz”

(2)输入: “Lions, and tigers, and bears, oh my!”

返回: “cfjkpquvwxz”

(3)输入: “”

返回:“abcdefghijklmnopqrstuvwxyz”

def get_missing_letter(a):

s1 = set(“abcdefghijklmnopqrstuvwxyz”)

s2 = set(a.lower())

ret = “”.join(sorted(s1-s2))

return ret

print(get_missing_letter(“python”))

other ways to generate letters

range(“a”, “z”)

方法一:

import string

letters = string.ascii_lowercase

方法二:

letters = “”.join(map(chr, range(ord(‘a’), ord(‘z’) + 1)))

23.可变类型和不可变类型

1,可变类型有list,dict.不可变类型有string,number,tuple.

2,当进行修改操作时,可变类型传递的是内存中的地址,也就是说,直接修改内存中的值,并没有开辟新的内存。

3,不可变类型被改变时,并没有改变原内存地址中的值,而是开辟一块新的内存,将原地址中的值复制过去,对这块新开辟的内存中的值进行操作。

24.is和==有什么区别?

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

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

25.求出列表所有奇数并构造新列表

a = [1,2,3,4,5,6,7,8,9,10]

res = [ i for i in a if i%2==1]

print(res)

26.用一行python代码写出1+2+3+10248

from functools import reduce

#1.使用sum内置求和函数

num = sum([1,2,3,10248])

print(num)

#2.reduce 函数

num1 = reduce(lambda x,y :x+y,[1,2,3,10248])

print(num1)

27.Python中变量的作用域?(变量查找顺序)

函数作用域的LEGB顺序

1.什么是LEGB?

L: local 函数内部作用域

E: enclosing 函数内部与内嵌函数之间

G: global 全局作用域

B: build-in 内置作用

python在函数里面的查找分为4种,称之为LEGB,也正是按照这是顺序来查找的

28.字符串 "123" 转换成 123,不使用内置api,例如 int()

方法一: 利用 str 函数

def atoi(s):

num = 0

for v in s:

for j in range(10):

if v == str(j):

num = num * 10 + j

return num

方法二: 利用 ord 函数

def atoi(s):

num = 0

for v in s:

num = num * 10 + ord(v) - ord(‘0’)

return num

方法三: 利用 eval 函数

def atoi(s):

num = 0

for v in s:

t = “%s * 1” % v

n = eval(t)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值