牛客Python题目

1. python单下划线_foo、双下划线__foo、__foo__的区别。

"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

2. python中__new__和__init__的区别,说法正确的是? (A B C D)

 A.__new__是一个静态方法,而__init__是一个实例方法。

 B.__new__方法会返回一个创建的实例,而__init__什么都不返回。

 C.只有在__new__返回一个cls的实例时,后面的__init__才能被调用。

 D.当创建一个新实例时调用__new__,初始化一个实例时用__init__。 

__init__ 方法为初始化方法, __new__方法才是真正的构造函数。

__new__方法默认返回实例对象供__init__方法、实例方法使用。

__init__ 方法为初始化方法,为类的实例提供一些属性或完成一些动作。

__new__ 方法创建实例对象供__init__ 方法使用,__init__方法定制实例对象。

__new__是一个静态方法,而__init__是一个实例方法。

3.  有如下函数定义,执行结果正确的是?()

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

@dec 的作用是把原 foo 函数(待装饰函数)赋值给 dec 函数(装饰器),然后将返回值 wrapper 函数(已装饰函数)重新赋值给 foo 函数。因此,foo 语句实际执行情况是:foo(2) = foo(2) * 3 = 2 * 2 * 3 = 12,其中前面的 foo 函数是已装饰函数,后面的 foo 函数是原来的待装饰函数。By the way,函数参数中的 *args 代表可变参数,**kw 代表关键字参数。

4. 装饰器执行顺序。

def decorator_a(func):
    print 'Get in decorator_a'
    def inner_a(*args, **kwargs):
        print 'Get in inner_a'
        return func(*args, **kwargs)
    return inner_a

def decorator_b(func):
    print 'Get in decorator_b'
    def inner_b(*args, **kwargs):
        print 'Get in inner_b'
        return func(*args, **kwargs)
    return inner_b

@decorator_b
@decorator_a
def f(x):
    print 'Get in f'
    return x * 2
f(1)

实际上运行的结果如下:

Get in decorator_a
Get in decorator_b
Get in inner_b
Get in inner_a
Get in f

4.下列代码 [i**i for i in xrange(3)] 的执行结果是(A)

A.[1, 1, 4] B.[0, 1, 4] C.[1, 2, 3] D.(1, 1, 4)

(1)这是一个列表生成式,即对于生成器 xrange(3) 中的每个值(分别是0,1,2),赋值给变量 i,然后执行 i**i 的操作。

(2)xrange() 与 range() 的用法完全相同,区别是 xrange() 的返回值是生成器,而 range() 的返回值是列表。(Python3 range即为原来的xrange)

(3)Python 中的 ** 运算代表幂运算,但有个特殊情况,官方文档中把 0**0 的值定义为 1

 

5. 'a' < 'b' < 'c' 返回(True)。('a' > 'b' or 'c') 返回 ('c')。

Python 支持连续比较,'a' < 'b' < 'c' 相当于 'a' < 'b' and 'b' < 'c',其本质是字符 ASCII 码的大小比较,该判断式结果为 True。

 

6. 下列代码的打印结果是 (报错)。
x = 1
def change(a):
    x += 1
    print x
change(x)
 
Python的变量作用范围(即LEGB规则)。是错在 x+=1,print(x)没错。定义在外部的变量是有全局作用域,但是函数内部未声明global时,只可读而不能写。
 
7. 如何解释下面的执行结果? (B)
print 1.2 - 1.0 == 0.2
False
A. Python的实现有错误
B. 浮点数无法精确表示
C. 布尔运算不能用于浮点数比较
D. Python将非0数视为False
 
Python 中浮点数的运算存在误差。1.2 - 1.0的值不是0.2,而是0.19999999999999996。
 
posted @ 2018-11-15 18:14  大象请坐  阅读(600)  评论(0编辑  收藏  举报