Python 一些题目

统计频次

如何统计一篇文章中单词的出现次数?

使用 Counter, 例如:

1
2
3
4
5
6
7
8
9
10

In [1]: a = "hello world hello world world hello this that"

In [2]: from collections import Counter

In [3]: counter = Counter(a.split(" "))

In [4]: counter
Out[4]: Counter({'hello': 3, 'world': 3, 'this': 1, 'that': 1})

小内存处理大文件

Python中如何读取一个大小为1G的纯文本的内容

这个题目主要是为了考察, Python中如何打开大文件。打开文件的时候, 如果直接读取所有文件内容, 那么就需要一个很大的数据结构例如 list 或者 str 来存储文件里的内容, 这对于很多小内存的设备往往是不可行的。因此, 此处面试官隐含了一个条件, 就是考察你是否能考虑到节省内存。

因此, 首先你需要跟面试官确认, 我需要考虑内存占用对吗?

然后, 一般面试官会给你肯定的回答。之后就到了我们提出解决方案的时候, 既然一次性读取大文件非常耗费内存, 解决方案就是分而治之, 例如, 逐行读取:

1
2
3
4
5
with open("demo.txt") as f:
line = f.readline()
while line:
print(line)
line = f.readline()

或者我们使用一个 生成器:

1
2
3
4
5
6
7
8
9
10
11
12
13
def read(path):
with open(path) as f:
while True:
line = f.readline()
if not line:
break

yield line


for i in read("demo.txt"):
print(i)

默认参数问题

这段代码会输出什么结果?为什么?

1
2
3
4
5
6
7
8
9
def foo(a=[]):
a.append(1)
print(a)


foo()
foo()
foo()

[1, 1]
[1, 1, 1]

原因是, Python中的默认参数只会初始化一次, 并且会共享同一个对象。因此, 这里每次调用 foo , 其实都是操作同一个列表, 因此会产生上述输出。

变量作用域规则

解析:

Python中的变量作用域规则遵循 L-E-G-B 的顺序。其中:

  1. L 是指 Local, 指本地变量, 例如 def 或者 lambda 定义的函数体内的变量
  2. E 是指 Enclosing-function locals, 即闭包变量
  3. G 是指 Global, 全局变量
  4. B 是指 Built-in 即Python解释器提供的内置函数和变量

用一个例子来看看各个变量属于什么变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

hello = "hello" # hello是全局变量


def foo():
print(hello) # 这里的hello是引用了全局变量
world = "world" # 这里的world是局部变量

def bar():
message = "message" # 这里的message也是局部变量
print(world) # 这里的world是闭包变量

bar()

# 上面的 print 函数是builtin里提供的

这段代码执行会报错吗?为什么?

1
2
3
4
5
6
7
8
9
hello = "hello"


def foo():
print(hello)
hello = "world"
print(hello)

foo()

会报错, 如下

1
2
3
4
5
6
7
8
$ python demo.py
Traceback (most recent call last):
File "demo.py", line 10, in <module>
foo()
File "demo.py", line 5, in foo
print(hello)
UnboundLocalError: local variable 'hello' referenced before assignment

原因是在Python中, 只要出现赋值语句, 那么变量就会在与赋值语句所在的同级作用域查找, 其中赋值语句包括 =, def, class, import, del, for, as。而上面的例子中, 第一个 print(hello) 执行时, hello 这个变量会在本级作用域查找, 但是这个 print 执行的时候, hello 还没有被赋值, 所以找不到这个变量


Python 一些题目
https://maocat.cc/2020/04/15/Python/一些题目/
发布于
2020年4月15日
许可协议