"但不敢握住刺的人
就永遠別渴望玫瑰“
But he who dares not grasp the thorn
Should never crave the rose."
― Anne Bronte 安妮·勃朗特
Python 常量 - 你需要知道的一切
Python常量有助于设计架构的动态和可更新特性,这对任何编码架构都是至关重要的。提供具有这些特征的结构与代码块可以被别人理解和开发有关。
为了满足这些多功能的条件,代码中的表达式应该是清晰的、不含糊的、不复杂的。编程语言有许多有用的表达式来提供这些种类的灵活性。在这篇文章中--常量--是其中之一,详细分析了Python中的编码实现,并提供了支持。
什么是Python中的常量?
常量是编程语言的组成部分之一,也是为用户提供必要灵活性的设施之一。顾名思义,常量是允许用户赋值的单位,在定义后不能被编辑。
这里棘手的一点是,虽然常量不能被编辑,但它可以被更新。另一方面,有些情况下常量是可变的,这些情况将在下一节用例子详细讨论。下面是一个 Python 的例子,说明常量是不可变的情况。
VALUE = "Python"
VALUE[0] = 'X
"TypeError: 'str' object does not support item assignment. "
不支持的项目赋值错误
想改变分配给VALUE "Xython "的单词 "Python "的第一个字母,但不可能改变它。 VALUE被定义为常量,无法进行编辑。当上面的代码块运行时,会出现 "TypeError: 'str' object does not support item assignment. "这样的错误。
如果我们想获得单词 "Xython",就需要将其赋值为一个新值,就像我们定义单词 "Python "的VALUE一样。也可以通过将常量 "Python "赋值给VALUE来将其更新为 "Xython"。
常数对开发的模型的促进作用也是不可否认的。某一数字、文本、列表或元组可以在程序中的多个地方使用。
例如,让我们设想一下,我们将从本地或互联网上的不同链接导入多个数据集。在这种情况下,在每次操作中,这个链接必须单独引入到要重新导入的命令中。
然而,如果这个链接被分配给某个常数,并且这个表达式被写在运行中需要这个链接的地方,那么只需要改变这个分配的链接,而不是逐个改变整个代码块中的数据就可以了。这也会使代码系统更容易理解,更容易管理。
常量通常被分配给由大写字母组成的表达式,当然,它们不是强制性的,但它们就像一种由开发人员长期培养的文化。
同样,像 "int "或 "float "这样的值,就像 "str "值一样,可以分配给某些常量,使编码模型的构建更有效率。例如,图像处理中使用的图像宽度和图像高度等参数在作品中出现了不止一处。当这些表达式在运行开始时被分配给IMAGE_WIDTH和IMAGE_HEIGHT作为常量时,只在代码块开始时改变数值将节省改变整个结构,将提供便利。
在C编程语言中,当分配数据时,是通过添加表达式如 "int",即整数来定义的,它决定了数据类型。另一方面,Python在这种情况下提供了便利,并自行分配数据类型。比如说
X = 22
print(type(X))
Y = 22.22
print(type(Y))
VALUE = "Python"
print(type(VALUE))
通过运行上述代码块检查常量的类型时,输出结果为。
图片2--代码块输出(图片由作者提供)
虽然用户没有指定,但它将数字22分配为整数,22.22分配为浮点数,而 "Python "一词则分配为字符串。当然,这些类型也可以由用户指定,如下所示。
X = float(22)
print(type(X))
Y = str(22.22)
print(type(Y))
print("Y的长度:", len(Y))
当浮点数22.22被定义为字符串时,每个对象被定义为一个元素。由于有4个 "2 "值和1个".",长度值为5。
有2种类型的对象:可变的--创建后可以修改(编辑)的对象,和不可变的--创建后不能修改(编辑)的对象。
Python的数据类型中常量是可变的。
Dict
列表
设置一个简单的列表对象类型被构造出来,并观察到被修改,如下所示。
CONTINENTS = ["亚洲", "欧洲", "非洲"]
print(CONTINENTS)
CONTINENTS[1] = "南极洲"
print(CONTINENTS)
print(type(CONTINENTS))
上述代码块的输出是?
将CONTINENTS列表中的欧洲改为南极洲是成功的。由于 Python 列表对象是可变的,Python 执行了这个操作,没有任何错误。
Python 的数据类型中常量是不可变的。
int
tuple
unicode
float
str
bool
在改变int、float和string类型时,出现了上述错误信息。下面对元组类型进行同样的处理。
X = (1,2,3)
print(type(X))
X[1] = 25
值 "2",即定义为X的元组类型常量的第二个元素,希望被替换为 "25"。输出结果如下。
这里需要做的是重新定义X = (1, 25, 3) 以避免这种错误。
Python中的命名常量
一个命名的元组结构是一个类的类型,它将给定的值映射到集合模块下。用这个映射过程分配的常量可以很容易地通过准备好的操作来传递。
用一个更具体的例子。让我们假设一堂课的测验权重为30%,期末考试权重为70%,用namedtuple计算学生的平均数。
from collections import namedtuple
Grade = namedtuple('Grade', 'quiz final_exam')
student_1 = Grade(60.0, 75.0)
student_2 = Grade(60.0, 90.0)
def average_grade(student_ID):
student_ID_average = (children_ID.quiz) * 0.3 + (children_ID.final_exam) * 0.7
return student_ID_average
student_1_average = average_grade(student_1)
student_2_average = average_grade(student_2)
成绩是通过namedtuple的映射分配给小测验和期末考试结果的。在用户以student_1, student_2的格式检索到这些结果后,如上所述创建了average_grade函数。结果,在计算平均成绩时,小测验考试的权重为30%,期末考试的权重为70%。
Python类中的常量
编码结构中有2种类型的常量:局部常量和全局常量。如果常量被定义在类和def块之外,它们被称为全局常量,如果它们被定义在内部,它们被称为局部常量。要在另一个类中调用一个类中的常量。
class Value:
constant_f = 30.05
constant_s = "Hello World"
class FinalValue(Value):
def const(self):
print("float constant is:", self.constant_f, "\n", "string constant is:", self.constant_s)
value_in_class = FinalValue()
value_in_class.const()
constant_f被赋予一个浮点数30.05,constant_s被赋予一个字符串值 "Hello World"。上面的代码块被用来在FinalValue类中调用。输出结果是?
总结
常量结构不仅在Python中,而且在所有编程语言中都有非常重要的地位。它使构造的系统更容易理解,使工作更容易。
由于Python在语法方面是一种用户友好的编程语言,它为常量的使用提供了一个非常有利的环境。通过对常量的理解,可以用较长的代码块完成的操作可以用较少的工作量完成。
你对Python中的常量有什么看法? 请在告诉我。
扑克牌的同花顺
常见的扑克牌为场景。桌上有一副牌,例如四个花色的牌各有若干张,在数组中有牌面的花色和大小,希望能编码输出每种花色的数量等等各种任务需要。
花色的简称为字母 C H D S, 扑克牌同一种花色的顺序牌
{'C':'Club',
'H':'Heart',
'D':'Diamand',
'S':'Spader'}
solve by code O(n)
DECK = ['2S','3S','4S','5S','6S','7S',
'8S','9S','10S','JS','QS','KS','AS',
'2D','3D','4D','5D','6D','7D','8D',
'9D','10D','JD','QD','KD','AD',
'2H','3H','4H','5H','6H','7H','8H',
'9H','10H','JH','QH','KH','AH',
'2C','3C','4C','5C','6C','7C','8C',
'9C','10C','JC','QC','KC','AC']
洗牌后,遍历54张牌,切片长度为 5,5张牌是顺子的返回
# nested list solve Maxseq
def maxseq(seq):
d = {'A': '1', 'J': '11', 'Q': '12', 'K': '13'}
# 高能预警,get的default输出报错是因为字符'J'不能用 int('J')
seq = [int(d.get(c[:-1],c[:-1])) for c in seq]
seq = sorted(seq)
#last_idx = [seq[0]]
maxSrg = [[seq[0]]]
for i,e in enumerate(seq[1:]):
if int(e) == int(maxSrg[-1][-1])+1:
maxSrg[-1].append(e)
else:
maxSrg.append([e])
return maxSrg
seq = ['10D', 'QD', '8D', 'KD', 'JD']
print('No.2th solution:',maxseq(seq))
n = 6 #共 6 人玩牌
主程序调用 maxseq()函数!
def shuffles(n):
random.shuffle(DECK)
final = []
l = len(DECK)//n
for i in range(0,len(DECK),l):
d = {'A': '1', 'J': '11', 'Q': '12', 'K': '13'}
card = maxseq(DECK[i:i+l])
final.append(max(card,key=len))
return print('final',max(final,key=len),final)
n = 6
shuffles(n)
随机洗牌输出结果
[10, 11, 12]
[[3, 4], [10, 11, 12], [5, 6, 7], [5, 6], [2, 3, 4], [3, 4, 5], [11, 12]]
[5, 6, 7, 8, 9, 10, 11]
[[1], [2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [3, 4], [2, 3], [1, 2], [4, 5]]
网友评论