>这种明显的奇怪性是冰山一角,当正确理解时,它是我们所谓的pythonic的关键。冰山被称为python数据模型,它描述了您可以用来使自己的对象与最惯用的语言功能效果很好的api。>关于python数据模型的特别之处。我们没有给出个人答案,而是为什么不深入研究,并通过了解数据模型来了解我们可以完成的工作。数据模型只是谈论如何表示数据。在python中,数据由对象表示或听起来有些技术,对象是python的数据抽象。数据模型为我们提供了一个api,该api允许我们的对象在python编程的“引擎盖下”效果很好。
>在我们深入研究python数据模型中,我们将专门关注特殊方法。特殊方法是具有特殊名称的类功能,这些函数由特殊语法调用。在我们的班级定义中定义这些特殊方法可以为我们的课堂实例提供一些非常酷的python权力,例如迭代,操作员超载,与上下文管理者('with with with with关键字),正确的字符串表示和格式化等良好合作。为了向您展示如何在课堂中实现这些特殊功能,我们将考虑两个情况的示例,其中使用这些特殊功能会使我们的代码更清晰,更重要。
>
第一个示例是我想到的一些外部解决方案,因为在python中创建了一个简单的岩纸剪辑游戏,第二个本质上将有点数学上有点数学'm将带您浏览每行代码一个简单的岩石剪刀游戏
对于我们对此游戏的python仿真,我们将仅将玩家数量限制在两个,一个玩家将是计算机,另一个玩家将是用户。另外,这不是机器学习文章或有关计算机视觉的文章,我们的用户仍然必须在终端上的岩石,纸张和剪刀之间输入选项才能工作。
在进行实际编码之前,我们可以退后一步并考虑希望我们的python脚本成为现实是很好的。为了解决这一挑战,我将使用随机模块启用计算机选择岩石,纸或剪刀的随机选项。为了实现我们的代码如何评估获胜者,我将做出以下假设:
>>> p = rps('p', 'paper') # create an instance
>>> p.name
# return : paper
>>> p.pick
# return : p
>>> print(p)
# return : <__main__.rps object at 0x...>
现在,让我们创建一个实例,然后尝试再次打印我们的类实例
>>> p = rps('p', 'paper')
>>> print(p)
# return : rps(p, paper)
现在,让我们创建一个实例并重新测试。
>>> p = rps('p', 'paper')
>>> p
# return : rps(p, paper)
>>> print(p)
# return : paper
>>> str(p)
# return : 'paper'
>>> repr(p)
# return : 'rps(p, paper)'
>>> dir(p) # returns : ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'pick']
'结束,因为这种特殊的命名这些方法,它们是通常称为daunder方法(双 下划线= dunder)。因此,如果方法名称始于双重下划线,那么它很可能是一种特殊的方法。为什么不确定呢?这仅仅是因为python并没有阻止我们使用dunder语法定义自己的方法。还可以回到我们的游戏脚本。
>现在留给我们的一切都是让我们让我们的脚本知道如何确定赢家。如前所述,我将使用比较来评估赢家。
>
# comparison logic rock > scissors scissors > paper paper > rock
要实现此解决方案,我将添加一个字典并使用daunder_than方法。字典钥匙将是岩石,纸和剪刀的缩写。每个密钥的值将是钥匙可以击败的唯一另一个元素。>
请注意新的代码行,首先是选项字典,然后是__gt__方法定义。有了这些新的代码行,让我们看看我们的代码现在具有哪些新功能。
# create a rock instance
>>> r = rps('r', 'rock')
# create a paper instance
>>> p = rps('p', 'paper')
# create a scissors instance
>>> s = rps('s', 'scissors')
>>> print(r,p,s)
# return : rock paper scissors
>>> p > r # paper wins against rock
# return : true
>>> r > s # rock wins against scissors
# return : true
>>> s > p # scissors wins against paper
# return : true
>>> p < s # paper lose to scissors
# return : true
>>> p < r # paper lose to rock
# return : false
>>> p < s < r# paper lose to scissors which lose to rock
# return : true
>>> p >= r paper wins or tie to rock
# return : traceback (most recent call last):
file "<stdin>", line 1, in <module>
typeerror: '>=' not supported between instances of 'rps' and 'rps'
>>> p1 = rps("p", "paper")
>>> p2 = rps("p", "paper")
>>> p3 = p1
>>> p1 == p2
# return : false
>>> p1 == p3
# return : true
>>> id(p1)
# return : 140197926465008
>>> id(p2)
# return : 140197925989440
>>> id(p3)
# return : 140197926465008
>>> id(p1) == id(p3)
# return : true
>>> id(p2) == id(p1)
# return false
将它们全部放在一起
这是运行代码
def evaluate_winner(user_choice, comp_choice):
# check if user choice is 'r'
if user_choice == 'r':
# check if comp_choice is 'r'
if comp_choice == 'r':
# it is a tie
...
elif comp_choice == 's':
# user wins
...
else:
# computer wins
...
if ...
# do the same for when user_choice is 's' and then for
# when user_choice is 'p'
options = {"r" : ["s"], "p" : ["r"], "s" : ["p"], "d" : ["r", "s"]}
>
def __gt__(self,x):
if x.pick in self.options[self.pick]:
return true
else:
return false
我们可以使语句缩短
def __gt__(self, x): return True if x.pick in self.options[self.pick] else False
得出结论,您应该注意一些有关使用特殊方法的事情:
您几乎没有(或从未)自己直接打电话给他们,让python为您打电话
>
立即学习“Python免费学习笔记(深入)”;
>
定义使用dunder命名语法的函数时,您应该认为python有一天可以定义这样的功能并赋予其不同的含义。这可能会破坏您的代码或以意外的方式行事
>
>我还建议阅读luciano ramalho
的fluent python希望您喜欢这篇文章!
以上就是用Python数据模型编写Pythonic代码的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号