3 个鲜为人知的 Python 特性

        这篇文章介绍了Python的一些不错的功能listset以及tuple数据类型。我最近了解了这些,发现它们很有趣,并想与您,我的程序员伙伴分享。 

 

        这是最有趣的部分。我们将了解运算符<, <=, >, >=如何处理集合操作数。==运算符对集合的作用有些明显,但是当我们冒险对集合进行排序时,会有一些有趣的行为。如果您之前没有考虑过这一点,请在进一步阅读之前尝试猜测比较运算符的工作原理。

<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'} <= {'bread', 'butter'} 
# 真</span><span style="color:#292929">{'bread', 'jam'} <= {'bread', 'butter'} 
# 假</span><span style="color:#292929">{'bread'} <= {'bread'} 
# 真</span></span>

        这是里摹HT!<=issubseton重载set<运算符上定义的行为略有不同:

<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'} < {'bread', 'butter'} 
# 真</span><span style="color:#292929">{'bread'} < {'bread'} 
# 假</span></span>

        区别在于<定义左操作数是否是右操作数的严格子集。这意味着左操作数是右操作数的子集,但不等于右操作数。这可能是一个有用的区别,特别是因为 上没有isstrictsubsetisstrictsuperset方法set

        我不会详细介绍>和的行为>=,因为您可以或多或少地用超集替换子集,并在上一节中进行乘以 -1 的代数等价。让我们这样做:

<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread', 'butter'} >= {'bread'} 
# 真</span><span style="color:#292929">{'bread', 'jam'} >= {'bread', 'butter'} 
# 假</span><span style="color:#292929">{'bread'} >= {'bread'} 
# 真</span><span style="color:#292929">{'bread', 'butter'} > {'bread'} 
# 真</span><span style="color:#292929">{'bread'} > {'bread'} 
# 假</span></span>

        现在您可以对集合进行链式比较:

<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'} <= {'bread', 'butter'} <= {'bread', 'butter', 'eggs'} 
# 真</span></span>

        在这里,我无偿地添加了等效的代码,issubset用于显示我们已经走了多远:

<span style="background-color:#f2f2f2"><span style="color:#292929">{'bread'}.issubset({'bread', 'butter'}) 和 {'bread', 'butter'}.issubset({'bread', 'butter', 'eggs'})</span></span>

奖金

        不起眼的^运算符,它因对称差异而过载。这是什么意思?它是出现在一个但不是左右操作数中的一组元素:

<span style="background-color:#f2f2f2"><span style="color:#292929">def symmetric_difference(a: set, b: set) -> set:     
    return {elt for elt in a | b if (elt in a) ^ (elt in b)}</span><span style="color:#292929">symmetry_difference({'bread', 'butter'}, {'bread', 'jam'}) 
# {'butter', 'jam'}</span><span style="color:#292929">{'bread', 'butter'} ^ {'bread', 'jam'} 
# {'butter', 'jam'}</span></span>

        注意^集合理解中的 。从头到尾都是异或!

列表、元组、字符串,天哪!

        列表、元组和字符串上的比较运算符的工作方式相同。运算符<, <=, >, >=定义了字典顺序,这是一种根据对象元素的顺序对对象序列进行排序的方法。这是字母排序的概念,推广到包含定义了<>运算符的任何类型对象的序列。这就是事情变得奇怪的地方!

        让我们从字符串开始:

<span style="background-color:#f2f2f2"><span style="color:#292929">'01' == '01' 
# 真</span><span style="color:#292929">'01' < '10' 
# 真</span><span style="color:#292929">'11' < '2' 
# 真</span><span style="color:#292929">'2' > '10' > '1' 
# 真</span></span>

        请注意,这与列表的工作方式相同:

<span style="background-color:#f2f2f2"><span style="color:#292929">[0, 1] == [0, 1] 
# 真</span><span style="color:#292929">[0, 1] < [1, 0] 
# 真</span><span style="color:#292929">[1, 1] < [2] 
# 真</span><span style="color:#292929">[2] > [1, 0] > [1] 
# 真</span></span>

        和元组:

<span style="background-color:#f2f2f2"><span style="color:#292929">(0, 1) == (0, 1) 
# 真</span><span style="color:#292929">(0, 1) < (1, 0) 
# 真</span><span style="color:#292929">(1, 1) < (2,) 
# 真</span><span style="color:#292929">(2,) > (1, 0) > (1,) 
# 真</span></span>

 奖金

        您甚至可以比较异构类型的列表:

<span style="background-color:#f2f2f2"><span style="color:#292929">[2, 'a'] < [2, 'b'] 
# 真</span><span style="color:#292929">[2, [1, 0]] < [2, [2, 1]] # (: 
# 真</span></span>

        只需确保类型按元素匹配即可:

<span style="background-color:#f2f2f2"><span style="color:#292929">[3, 4] < [3, 'a'] 
# 类型错误:'int' 和 'str' 实例之间不支持 '<'</span></span>

结论

        我希望这次探索能让您思考您的编程语言可以做什么和该做什么,而不是重用您已经看过的代码片段。下次您想到某事并想知道它是否有效时,请尝试一下!

 七爪网7claw.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值