@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:润森,希望大家点赞、评论、收藏