统计频次
如何统计一篇文章中单词的出现次数?
使用 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 的顺序。其中:
- L 是指 Local, 指本地变量, 例如 def 或者 lambda 定义的函数体内的变量
- E 是指 Enclosing-function locals, 即闭包变量
- G 是指 Global, 全局变量
- B 是指 Built-in 即Python解释器提供的内置函数和变量
用一个例子来看看各个变量属于什么变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| hello = "hello"
def foo(): print(hello) world = "world"
def bar(): message = "message" print(world)
bar()
|
这段代码执行会报错吗?为什么?
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 还没有被赋值, 所以找不到这个变量