python中关键字in的调用

python中有一个很神奇的关键字in,在for循环中会用到for x in range,在判断中会用到if x in data,在语意表达上更接近人类的理解范畴,使得代码更人性化可理解。作为一个关键字,in在不同位置时所蕴含的语意看起来是相同的,都是以对in之后的变量做一个遍历或检查,表示接下来的操作是基于in之后的变量的,但实际上在底层实现中in在不同位置所调用的的方法是不同的。

在for循环中,in会调用其后面的对象中的__iter__()函数,表示将其作为一个迭代器遍历,也可以认为是实现了类似next()的方法。因此当想对某个对象用for in方式进行操作时,只需实现该对象的__iter__()函数,使用yield迭代出返回结果或直接返回list这样的数据结构即可。

在if in 的情况下,表示判断某个元素是否在in之后的变量中存在。其实际上是调用了对象的__contains__()函数,一般返回一个bool值,其参数是一个item,一般用于检查参数item在该对象中是否存在,或是其他判断语意。

class a(object):
    d='ddd'
    def __contains__(self):
        if self.d:return True
b=a()
print(b.contains('d')) # error
print(contains(b,'d'))  # error

像所有特殊方法(以__开头和结尾的"魔术名称")一样,__contains__并不意味着可以直接调用(在非常特殊的情况下,例如对超类的调用)方法被称为内置函数和运算符的操作的一部分。在__contains__的情况下,所讨论的运算符是in-"包含检查"运算符。

使用类a进行演示(除了修正拼写错误,并使用True代替True),并以b作为其实例,print( ‘x’ in b)将打印True——因为b总是返回True(self.d是一个非空字符串,所以为true),所以对b的其他任何容纳检查也将进行检查。

# __contains__方法定义当类实例出现在in和not in运算符的右侧时的行为。
class a(object):
    d = 'ddd'
    def __contains__(self, m):
        if self.d: 
            return True
b = a()
>>> 'd' in b
True

if self.d:return true

比较特别的是,我们知道当对象实现了__getitem__()函数,那么就可以使val[index]的语法,利用下标访问对象元素,实际上__getitem__()同样也用于if in的fallback机制,当用户没有实现或调用失败对象的__contains__()函数时,python就会在if in的情况下调用__getitem__()方法。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,`yield`关键字用于定义生成器函数。生成器函数是一种特殊的函数,它可以产生一个迭代器对象,通过迭代器可以逐步产生值而不是一次性返回所有结果。生成器函数使用`yield`语句来指示函数在每次被调用时暂停执行,并返回一个值给调用者。调用者可以通过调用生成器的`next()`方法或使用`for`循环来逐步获取生成器产生的值。 除了在生成器函数使用`yield`语句来控制生成器的执行流程外,`yield`还可以与其他语句和表达式一起使用,例如`send()`方法可以在生成器发送一个值,并将其作为`yield`表达式的结果,`throw()`方法用于在生成器引发一个异常,`close()`方法用于关闭生成器。 PEP342进一步增强了生成器函数的功能,将`yield`从一个关键字(statement)变为表达式(expression),并引入了`send()`,`throw()`,`close()`等方法来操作生成器。这些增强使得生成器函数更加灵活和功能强大。 通过使用生成器函数,我们可以按需生成序列的值,而不需要一次性生成所有的值,这样可以节省内存并提高效率。此外,生成器函数还可以用于实现协程和异步编程等高级应用。 参考文献: PEP 342 -- Coroutines via Enhanced Generators: https://www.python.org/dev/peps/pep-0342/ Real Python - Introduction to Python Generators: Using Advanced Generator Methods: https://realpython.com/introduction-to-python-generators/#using-advanced-generator-methods Real Python - Generators in Python: Creating and Iterating Simple Generators: https://realpython.com/introduction-to-python-generators/<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python yield关键字全面解析](https://blog.csdn.net/jeffery0207/article/details/124856788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值