Python【每日一问】19

问:

【基础题】:请解释类方法、静态方法、属性方法
【提高题】:有以下几个数字:1、2、3、4、5,能组成多少个互不相同且无重复数字的三位数?都是多少?(代码实现)

答:

【基础题】:请解释类方法、静态方法、属性方法

1 @staticmethod
2 静态方法,通过类直接调用,不需要创建对象,不会隐式传递self
3 
4 @classmethod
5 类方法,方法中的cls是类对象本身,调用方法时传的值也必须是类的公有属性,就是说类方法只能访问类本身的公有字段,不能访问实例变量
6 
7 @property
8 属性方法:把一个方法变成一个静态属性。调用的时候不需要加()

 

1 静态方法:在类中的方法前面通过@staticmethod装饰器实现静态方法
2 类方法:在类中的方法前面通过@classmethod装饰器实现类方法,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
3 属性方法:在类中的方法前面通过@property装饰器实现属性方法,即把一个方法变成一个静态属性

 

 

【提高题】:有以下几个数字:1、2、3、4、5,能组成多少个互不相同且无重复数字的三位数?都是多少?(代码实现)

方法1:

import itertools
from functools import reduce

lyst = [1, 2, 3, 4, 5]
result = []

for el in itertools.permutations(lyst, 3):
    temp = reduce(lambda x,y:x * 10 +y, el)
    result.append(temp)

print(f'总共有{len(result)}个互不相同且五重复数字的三位数,分别是:')
print(result)

方法2:

import copy
numbers = [1, 2, 3, 4, 5]
tri = []
for i in numbers:
    d_u = copy.copy(numbers)
    d_u.remove(i)
    for j in d_u:
        u = copy.copy(d_u)
        u.remove(j)
        for k in u :
            tri.append(i * 100 + j * 10 + k)

print(tri)
print(len(tri))

方法3:

import itertools
count = 0
for i in itertools. product([1,2,3,4,5], repeat=3):
    if i[0] != i[1] and i[0] != i[2] and i[1] != i[2]:
        print(i[0]*100 + i[1]*10 + i[2])
        count += 1
print(count)

方法4:

firstNumber = [1, 2, 3, 4, 5]
count = 0
for i in firstNumber:
    secondNumber = firstNumber[:]
    secondNumber.remove(i)
    for j in secondNumber:
        thirdNumber = secondNumber[:]
        thirdNumber.remove(j)
        for k in thirdNumber:
            print(str(i) + str(j) + str(k), end=",")
            count += 1
print("一共有{}个数".format(count))

 

posted on 2019-05-07 11:25  D小调的微笑  阅读(179)  评论(0编辑  收藏  举报