2020 年最全 Python 面试题汇总 (一)

@Author:Runsen

大四刷题拼offer系列,不拼不行啊。我先刷下牛客网的Python的题目和知识点,适当的记录下自己做错的题目。

1、Pythno逻辑运算符

下列代码运行结果是?
a = 'a'
print a > 'b' or 'c' # 'C'

由于比较运算符优先级大于逻辑运算符,根据上表,当 a > ‘b’,即 ‘a’ > ‘b’ 为 Fasle 时(‘a’ 的 ASCII 码比 ‘b’ 小),返回值为 ‘c’,故答案选C。

2、求100亿有多少素数

假设可以不考虑计算机运行资源(如内存)的限制,以下 python3 代码的预期运行结果是:()

import math
def sieve(size):
    sieve= [True] * size
    sieve[0] = False
    sieve[1] = False
    for i in range(2, int(math.sqrt(size)) + 1):
        k= i * 2
        while k < size:
           sieve[k] = False
           k += i
    return sum(1 for x in sieve if x)
print(sieve(10000000000))

A、455052510
B、455052511
C、455052512
D、455052513

本题是求0-100亿之间的素数的个数,首先你要读懂代码。读懂代码后,自己编写Meissel-Lehmer 算法快速求出0-100亿内的素数个数。百度100亿以内的素数,百度没有。但是我们可以记住这个值,关于Meissel-Lehmer算法。

3、深浅复制

本题考查的是 dict 类型中 copy() 方法的使用。

kvps = { '1' : 1, '2' : 2 }
theCopy = kvps.copy()
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print(sum) # 6

下面,我们看一个容易出错的例子。

import copy

d = {'1': [1, 1, 1], '2': 2}
# 方法1:赋值引用,copy1和d指向同一个对象
copy1 = d
# 方法2:浅复制,复制生成新对象copy2,但是只复制一层,[1, 1, 1]为两者共同子对象,
copy2 = d.copy()
# 方法3:浅复制,调用copy模块中的方法,同方法2
copy3 = copy.copy(d)
# 方法3:深复制,复制生成新对象copy4,并且递归复制所有子对象,所以d中原来指向[1, 1, 1]的改动不会影响深复制生成的子对象[1, 1, 1]
copy4 = copy.deepcopy(d)

d['1'][0] = 3 
d['2'] = 3  

print(copy1, copy2, copy3, copy4)
打印结果
{'1': [3, 1, 1], '2': 3} 
{'1': [3, 1, 1], '2': 2} 
{'1': [3, 1, 1], '2': 2} 
{'1': [1, 1, 1], '2': 2}

4、装饰器

以下程序输出为:

def w1():
   print('正在装饰')
   def inner():
        print('正在验证权限')
 
   return inner()
 
w1()
# 正在装饰 正在验证权限

如果外层函数返回的是一个函数名的话,运行结果应该是:正在装饰

如果外层函数返回的是函数调用的话,运行结果是:正在装饰 正在验证权限

5、random模块

下面的python3函数,如果输入的参数n非常大,函数的返回值会趋近于以下哪一个值

import random 
def foo(n):   
        random.seed()
     c1 = 0
     c2 = 0
     for i in range(n):
        x = random.random()
        y = random.random()
        r1 = x * x + y * y
        r2 = (1 - x) * (1 - x) + (1 - y) * (1 - y)
        if r1 <= 1 and r2 <= 1:
           c1 += 1
         else:
           c2 += 1
    return   c1 / c2

random.random()生成0和1之间的随机浮点数float,上面代码是计算两个四分之一的圆的交集,最终得到的结果是
π − 2 4 − π \frac{\pi-2}{4-\pi} 4ππ2

具体解决的如下图所示。

6、元组的定义

下列哪种不是Python元组的定义方式?

A、(1)
B、(1, )
C、(1, 2)
D、(1, 2, (3, 4))

Python 中的 tuple 结构为 “不可变序列”,用小括号表示。为了区别数学中表示优先级的小括号,当 tuple 中只含一个元素时,需要在元素后加上逗号。(1)会被python认为是int类型,所以正确答案必须是(1)

>>> print(type((1,)))
<class 'tuple'>
>>> print(type((1)))
<class 'int'>

7、类定义

有如下类定义,下列描述错误的是?

class A(object):
	pass

class B(A):
	pass

b = B()

A、isinstance(b, A) == True
B、isinstance(b, object) == True
C、issubclass(B, A) == True
D、issubclass(b, B) == True 答案

isinstance(object,classinfo),用于判断object是否是classinfo的一个实例,或者object是否是classinfo类的子类的一个实例,如果是返回True。类似 type()。如果要判断两个类型是否相同推荐使用 isinstance()。

issubclass(class,classinfo),用于判断class是否是classinfo类的子类,如果是返回True.

class A(object):
    pass
class B(A):
    pass
b = B() 
print(isinstance(b,A))  # True
print(isinstance(b,B))  # True
print(type(b) is B) # True
print(type(b) is A) # False
print(issubclass(B,A)) # True
print(issubclass(b,B))    # TypeError: issubclass() arg 1 must be a class

8、函数对象定义

Python中函数是对象,描述正确的是?

A、函数可以赋值给一个变量
B、函数可以作为元素添加到集合对象中
C、函数可以作为参数值传递给其它函数
D、函数可以当做函数的返回值

上面选择全部正确。在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。

9、字典的声明定义

下面有关字典的声明错误的是:

A、dic = {}
B、dic = {100:200}
C、dic = {(1,2,3):'test'}
D、dic = {[1,2,3]:'test'} 答案

字典本身是可变数据类型,字典的键记住两点:

  • 唯一:同一个字典中的键必须唯一,如果出现多个相同的键,则最新的键会被记住;
  • 不可变:键是不可变数据类型,使用可以是int,string,float,tuple

补充可变(mutable)对象类型 :list、dict、set、bytearray、user-defined classes
不可变(immutable)对象类型: int、float、decimal、complex、bool、str、tuple、range、bytes

10、字符串格式化

下述字符串格式化语法正确的是?

正确答案: D   
A、'GNU's Not %d %%'  % 'UNIX'
B、'GNU\'s Not %d %%'  % 'UNIX'
C、'GNU's Not %s %%'   % 'UNIX'
D、'GNU\'s Not %s %%'  % 'UNIX'

python里面%d表数字,%s表示字符串,%%表示一个%。单引号内嵌套单引号需要转义字符/;单引号内嵌套双引号不需要嵌套。双引号内嵌套双引号需要转义字符/;双引号内引用单引号不需要转义字符。

11、 内存管理

关于Python内存管理,下列说法错误的是

正确答案: B   
A、变量不必事先声明
B、变量无须先创建和赋值而直接使用
C、变量无须指定类型
D、可以使用del释放资源

本题答案选 B,原因如下:

Python 是弱类型脚本语言,变量就是变量,没有特定类型,因此不需要声明。
但每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
用 del 语句可以释放已创建的变量(已占用的资源)。

12、正则表达式

下列程序打印结果为

import re 
str1 = "Python's features" 
str2 = re.match( r'(.*)on(.*?) .*', str1, re.M|re.I)
print( str2.group(1))

正确答案: B 你的答案: B (正确)

A、Python
B、Pyth
C、thon’s
D、Python‘s features

re模块实现正则的功能 :re.match(正则表达式,要匹配的字符串,[匹配模式])

要匹配的字符串为str1 = "Python's features"

正则表达式r'(.*)on(.*?) .*'

  • r表示后面的字符串是一个普通字符串(比如\n会译为\和n,而不是换行符)
  • ()符号包住的数据为要提取的数据,通常与.group()函数连用。
  • .匹配单个任意字符
  • *匹配前一个字符出现0次或无限次
  • ?匹配前一个字符出现0次或1次
  • (.*)提取的数据为str1字符串中on左边的所有字符,即Pyth
  • (.*?)提取的数据为str1中on右边,空格前面,即’s
  • .group(0)输出的是匹配正则表达式整体结果.
  • .group(1) 列出第一个括号匹配部分,.group(2) 列出第二个括号匹配部分

13、切片

若 a = range(100),以下哪些操作是合法的?

正确答案: A B C D 你的答案: A B C (错误)

A、a[-3]
B、a[2:13]
C、a[::3]
D、a[2-3]

首先:a=range(100)的意思的a是一个1到100排序

A:a[-3]
D:a[2-3]-->a[-1]

取a当中倒数第i个数–>a[-1]=99;a[-2]=98;a[-3]=97
所以A的输出结果是97,D的输出结果是99

B:a[2:13]取排列a第2到13个数,其结果是2到13的一个排列, 不包括13,前闭后开

C:a[::3]实际上是a[start:end:step]。根据a=range(100)可得start的默认值是1,end的默认值是100,step的默认值是1。

14、复数

关于Python中的复数,下列说法错误的是()

正确答案: C 你的答案: B (错误)

A、表是复数的语法是real + image j
B、实部和虚部都是浮点数
C、虚部必须后缀j,且必须小写
D、方法conjugate返回复数的共轭复数

关于python中的复数:

1、虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起构成一个复数

2、复数由实数部分和虚数部分构成

3、表示虚数的语法:real+imagej

4、实数部分和虚数部分都是浮点数

5、虚数部分必须有后缀j或J

15、 切片不受内建类型的限制

对于以下代码,描述正确的是:

list = ['1', '2', '3', '4', '5']
print (list[10:])

正确答案: D 你的答案: A (错误)

A、导致 IndexError
B、输出['1', '2', '3', '4', '5']
C、编译错误
D、输出[]

D 切片不受内建类型的限制。如果出现了[index:],返回是[]

16、关键词return

关于return说法正确的是( )
正确答案: B D 你的答案: A B D (错误)

A、python函数中必须有return
B、return可以返回多个值
C、return没有返回值时,函数自动返回Null
D、执行到return时,程序将停止函数内return后面的语句

A. Python函数可以没有return,比如直接pass

C. return没有返回值时,函数自动返回None,Python没有Null。None是空对象,Null是空字符串!

  • return会跳出函数(遇到它,函数就结束)
  • break会跳出当前循环
  • continue 跳出当前循环并执行下一次

17、转义字符串

What gets printed?()

print (r"\nwoow")

正确答案: C 你的答案: C (正确)

A、new line then the string: woow
B、the text exactly like this: r"\nwoow"
C、the text like exactly like this: \nwoow
D、the letter r and then newline then the text: woow
E、the letter r then the text like this: nwoow

Python 中字符串的前导 r 代表原始字符串标识符,该字符串中的特殊符号不会被转义,适用于正则表达式中繁杂的特殊符号表示。

最典型的例子,如要输出字符串\n,由于反斜杠的转义,因此一般的输出语句为:

print("\\n")

这里的\\将被转义为\。而采用原始字符串输出时,则不会对字符串进行转义:

print (r"\n")

因此本题答案为 C,输出 \nwoow。注意前导标识符r 不会被输出,只起标记作用。

18、global

What gets printed?()

counter = 1 
def doLotsOfStuff(): 
    global counter
    for i in (1, 2, 3): 
        counter += 1 
doLotsOfStuff()
print (counter)

正确答案: C 你的答案: C(正确)

A、1
B、3
C、4
D、7

此题不难,主要是考察 global 的意义,即在局部作用域 doLotsOfStuff() 函数中,声明对全局作用域中的 counter 变量的引用,当内部作用域想修改外部变量时,需要使用global声明。

最后要注意第 5 行的坑,是 counter += 1 而不是 counter += i ,因此答案是 4 而不是 7,选答案 C。

19、标识符

下面哪个不是Python合法的标识符

正确答案: B 你的答案: B (正确)

A、int32
B、40XL
C、self
D、name

Python 中的标识符不能以数字开头,这也是普遍编程语言的通用规则:

1)第一个字符必须是字母表中字母或下划线 _ 。
2)标识符的其他的部分由字母、数字和下划线组成。
3)标识符对大小写敏感。
4)不可以是python中的关键字,如False、True、None、class等。

注意:self不是python中的关键字。类中参数self也可以用其他名称命名,但是为了规范和便于读者理解,推荐使用self。

20、socket

下列关于python socket操作叙述正确的是( )

正确答案: C D 你的答案: C (错误)

A、使用recvfrom()接收TCP数据
B、使用getsockname()获取连接套接字的远程地址
C、使用connect()初始化TCP服务器连接
D、服务端使用listen()开始TCP监听

sk.recv(bufsize[,flag]):接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag]):与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

sk.getsockname():返回套接字自己的地址。通常是一个元组(ipaddr,port)

sk.connect(address):连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

sk.listen(backlog):开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。

如果你想跟博主建立亲密关系,可以关注博主,或者关注博主公众号“Python之王”,了解一个非本科程序员是如何成长的。
博主ID:润森,希望大家点赞、评论、收藏

  • 14
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RunsenLIu

顺便点一个赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值