zoukankan      html  css  js  c++  java
  • 小甲鱼第52讲:像极客一样去思考

    以下代码打印什么内容?
    0.
    [code]>>> def func():
    pass

    >>> print(type(func()))[/code]
    当然是打印函数的类型,由于什么都没有返回,也就是”NoneType“
    1.
    [code]>>> print(type(1J))[/code]
    排除法,没有u开题,所以不是”unicode“,不是整型,也不是字符串,那就是”混合型“
    2.
    [code]>>> print(type(lambda:None))[/code]
    起初我以为是NoneType,结果发现是function,结果help(lambda)发现这么一句话:
    the expression ``lambda arguments: expression`` yields a function object.
    也就是无论lambda如何定义,返回的都是一个函数对象
    3.
    [code]>>> a = [1, 2, 3, "FishC", ('a', 'b', 'c'), [], None]
    >>> print(len(a))[/code]
    列表a的长度就是数最外面的逗号分隔的东西有几个,数数大学有7个,分别是3个整型数字、字符串一个、元祖一个、空列表一个加上空值一个。
    4.
    [code]class A:
    def __init__(self, x):
    x = x + 1
    self.v1 = x

    class B(A):
    def __init__(self, x):
    x = x + 1
    self.v2 = x

    >>> b = B(8)
    >>> print("%d %d" % b.v1, b.v2)[/code]
    首先,小甲鱼没有注意缩进问题,在类A的初始化函数那里(如果我没有理解错误的话)。
    如果是这样的话,那么b作为类B的实例对象,应该与A无关呀,不然,怎么来的leiA的属性v1?应该抛出异常吧?而且还有一个语法错误在print语句那里,应该是%(b.v1, b.v2)不然就是只打印前者的意思了,除非py3改了语法,因为我用的是py2哈。

    5.
    [code]class A:
    def __init__(self, x):
    self.x = x
    x = 666

    >>> a = A()
    >>> a = A(888)
    >>> a.x[/code]
    首先,A类在定义的时候是需要传入参数x的,所以,a=A()会报错,而且定义的时候x=666这个常数十无意义的,因为x只是参数,只有当调用A的时候,传入的参数会覆盖x,所以666这个常数的赋值时无意义的,结果只会是888.
    6.
    [code]values = [1, 1, 2, 3, 5]
    nums = set(values)

    def check(num):
    if num in nums:
    return True
    else:
    return False

    for i in filter(checkit, values):
    print(i, end=' ')[/code]
    好吧,小甲鱼累了,里面的代码已经错别字的惨不忍睹,小甲鱼真的是千年的劳模,在此容许在下烧一炷香,实际上肯定是打印1 1 2 3 5,首先,set是一个集合,里面一般是列表这样的可迭代对象;其次,filter(function or None, sequence)这个函数返回”function“为真的序列。这里就是返回所有的values列表中的元素,其中元素之间以空格隔开。
    7.
    [code]values = [1, 1, 2, 3, 5]
    def transform(num):
    return num ** 2

    for i in map(transform, values):
    print(i, end=' ')[/code]
    map函数用于讲参数列表”values“里面的每一个元素作为参数”transform“函数的参数最终返回一个列表,因此返回1 1 4 9 25
    8.
    [code]class A:
    def __init__(self, x):
    self.x = x

    a = A(100)
    a.__dict__['y'] = 50
    print(a.y + len(a.__dict__))[/code]
    首先,__dict__用于定义类属性以及对于的值,类属性以及对应的值在类内通过字典方式存储,因此a.y为50,而一共有两个属性,分别是y和x;因此结果为52.
    9.
    [code]class A:
    def __init__(self):
    pass
    def get(self):
    print(__name__)

    >>> a = A()
    >>> a.get()[/code]
    执行的是函数本身,因此打印__main__,当模块被调用的时候,__name__==模块名称
    10.
    [code]country_counter = {}

    def addone(country):
    if country in country_counter:
    country_counter[country] += 1
    else:
    country_counter[country] = 1

    addone('China')
    addone('Japan')
    addone('China')
    addone("American")

    print(len(country_counter))[/code]
    打印字典的长度3,首先字典的键值对分别是addone函数的参数和参数出现的次数,因此长度就是3个不同的国家。
    11.
    [code]dict1 = {}
    dict1[1] = 1
    dict1['1'] = 2
    dict1[1.0] = 3

    result = 0
    for each in dict1:
    result += dict1[each]

    print(result)[/code]
    由于字段中的元素重复键的赋值会被覆盖,因此1会被重新复制为3,结果是result=3+2=5
    12.
    [code]def dostuff(param1, *param2):
    print type(param2)

    dostuff('apples', 'bananas', 'cherry', 'dates')[/code]
    dostuff里面有两个参数,一个是param1='apples',另外一个带*的参数是一个序列类型的参数,*params2=('bananas', 'cherry', 'dates'),因此是第二个参数是一个元组类型。
    13.
    [code]class A:
    def __init__(self, a, b, c):
    self.x = a + b + c

    a = A(1,2,3)
    b = getattr(a, 'x')
    setattr(a, 'x', b+1)
    print a.x[/code]
    首先,getattr实际上返回的是实例对象属性x的值b=1+2+3=6,setattr是重新定义实例对象的属性x的值为7,因此结果为7.
    14.
    [code]list1 = [1, 2]
    list2 = [3, 4]

    dict1 = {'1':list1, '2':list2}
    dict2 = dict1.copy()

    dict1['1'][0] = 5

    result = dict1['1'][0] + dict2['1'][0]
    print(result)[/code]
    结果为5+5=10,实际上copy()函数只是将索引指向了dict1而已,dict1变了,那么dict2也会跟着变,是一种浅拷贝方式,没有断根的拷贝。与传统意义上的克隆不同,要知道克隆出来的可是单独的个体。
    15.
    [code]import copy

    list1 = [1, 2]
    list2 = [3, 4]

    dict1 = {'1':list1, '2':list2}
    dict2 = copy.deepcopy(dict1)

    dict1['1'][0] = 5

    result = dict1['1'][0] + dict2['1'][0]
    print(result)[/code]
    调用copy模块的deepcopy()函数才能达到传统意义上的克隆,结果是result=5+1=6

  • 相关阅读:
    剑指Offer-11.二进制中1的个数(C++/Java)
    剑指Offer-10.矩形覆盖(C++/Java)
    剑指Offer-9.变态跳台阶(C++/Java)
    UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
    UVA1607 Gates 与非门电路 (二分)
    UVA 1451 Average平均值 (数形结合,斜率优化)
    UVA 1471 Defense Lines 防线 (LIS变形)
    UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
    UVA 11134 FabledRooks 传说中的车 (问题分解)
    UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  • 原文地址:https://www.cnblogs.com/wing1995/p/4969360.html
Copyright © 2011-2022 走看看