牛客网【Python专项练习】错题笔记

2021.09.20 练习记录

1、 已知a=[1,2,3]和b=[1,2,4],那么id(a[1])==id(b[1])的执行结果()
A True
B False

解析:答案选 A。

Python 为了提高内存利用效率会对一些简单的对象(如数值较小的 int 对象,字符串等)采取重用内存地址的方法。所以 Python 中有一个小整数对象池,范围为[-5,256]。对于在这个范围内的整数,不会新建对象,直接从小整数池中取。

2、下列程序打印结果为()

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

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

解析:答案选 B。

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)列出第二个括号匹配部分。

3、Assuming the filename for the code below is /usr/lib/python/person.py,and the program is run as:python/usr/lib/python/person.py,What gets printed?()

class Person:
    def __init__(self):
        pass
    def getAge(self):
        print __name__
p=Person()
p.getAge()

A Person
B getAge
C usr.lib.python.person
D __ main __

解析:答案是 D。

1、__name__是 Python 的内置属性,记录着一个字符串。如果当前程序运行在这个模块中,__name__记录的字符串就是__main__,如果是被其他文件导入的,则为模块名。
2、__main__一般作为函数的入口,尤其在大型工程中,常常有if__name__=="__main__":来表明整个工程开始运行的入口。

2021.09.21 练习记录

1、以下声明错误的是()
A dic={}
B dic={100:200}
C dic={(1,2,3):“test”}
D dic={[1,2,3]:“test”}

解析:答案选 D。

字典的键值必须是不可变类型,如数字、字符串、元组等,而列表是可变类型。

2*、有如下函数定义,执行结果正确的是()

def dec(f):
    n=3
    def wrapper(*args,**kw):
        return f(*args,**kw)*n
    return wrapper

@dec
def foo(n):
    return n*2

A foo(2)==12
B foo(3)==12
C foo(2)==6
D foo(3)==6

解析:答案选 A。

本题考察 python 装饰器的概念。以执行 foo(2) 语句为例,上述代码等价于:

def dec(f):
    n=3
    def wrapper(*args,**kw):
        return f(*args,**kw)*n
    return wrapper

def foo(n):
    return n*2

foo=dec(foo)
foo(2)

由此可见,@dec 的作用是把原 foo 函数(待装饰函数)赋值给 dec 函数(装饰器),然后将返回值 wrapper 函数(已装饰函数)重新赋值给 foo 函数。因此,foo(2) 语句的实际执行情况是:

def wrapper(2):
    return foo(2)*3

显然,用数学符号表示的话,函数执行结果为foo(2)=wrapper(2)=foo(2)*3=2*2*3=12,其中前面的 foo函数是已装饰函数,后面的 foo 函数是原来的待装饰函数。函数参数中的*args代表可变参数,**kw代表关键字参数。

3、已知 print_func.py 的代码如下:

print("Hello World!")
print("__name__ value",__name__)

def main():
    print("This message is from main function")
    
if __name__=="__main__":
    main()

print_module.py 的代码如下:

import print_func
print("Done!")

运行 print_module.py 程序,结果是:
A Hello World!__ name __ value:print_func Done!
B Hello World!__ name __ value:print_func Done!
C Hello World!__ name __ value:print_func Done!
D Hello World!__ name __ value:print_func Done!

解析:答案选 A。

首先需要明确,在导入文件时,文件中所有没有缩进的代码都会被执行一遍。

关于__name__的知识点可以参考2021.09.20 练习中的第3题,之前已经介绍过相关的内容了。

本题导入 print_func 模块后先执行该模块中的代码,print(“Hello World!”) 语句打印 “Hello World!”,print(“name value”,name) 语句依次打印 “__name__value” 和“print_func”,然后判断 __name__=="__main__"的结果为假,什么也不执行。最后 print(“Done!”) 语句打印 “Done!”

4、关于以下代码,描述正确的是:

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

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

解析:答案选 D。

切片不受内建类型的限制。先记住这个知识点,其实我也不知道为啥。

5、下列关于 Python socket 操作叙述正确的是()
A 使用 recvfrom 接收 TCP 数据
B 使用 getsockname() 获取连接套接字的远程地址
C 使用 connect 初始化 TCP 服务器连接
D 服务端使用 listen() 开始监听

解析:答案选 CD。

## 2021.09.23 练习记录

1、在 python 中,使用 open 方法打开文件,语法如下:

open(文件名,访问模式)

如果以二进制格式打开一个文件用于追加,则访问模式为:
A rb
B wb
C ab
D a

解析:答案选 C。

a 是追加的意思,b 是二进制形式。ab 即为二进制追加。

2*、下面的 python3 函数,如果输入的参数 n 非常大,函数的返回值会趋近于以下哪个值(选项中的值用 python 表达式来表示)()

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

A 4/3
B (math.pi-2)/(4-math.pi)
C math.e**(6/21)
D math.tan(53/180*math.pi)

解析:答案选 B。
牛客网【Python专项练习】错题笔记_第1张图片
牛客网【Python专项练习】错题笔记_第2张图片
此题除了数学知识以外还需要了解 random 模块中 random 函数的用法。

你可能感兴趣的:(Python,python)