Discuss / Python / 廖大忽略的知识背景

廖大忽略的知识背景

Topic source

gd83594394

#1 Created at ... [Delete] [Delete and Lock User]

廖大的知识点又跳跃了啊,小白需要补充下面的知识才能看得懂:

1、while True: 这条创建一个无限循环,除非用break或者return跳出,不然循环会一直下去;

2、if not n: 这是判断n是否为None,等价于if n is None,具体可看下面的文章: python if not - YaChenYa - 博客园 https://www.cnblogs.com/chenya/p/4218761.html

3、send: 这是生成器generator的一个方法,具体可以看下面的解释,精粹在于“你send的内容会作为这个表达式的值,随便你左边用什么东西接收或者不接收,总之yield就是你send进来的那个东西。这个表达式变成你send进来后的东西后继续执行,再次遇到yield,输出yield后面跟着的表达式” python生成式的send()方法(详解) https://www.jb51.net/article/113154.htm

gd83594394

#2 Created at ... [Delete] [Delete and Lock User]

4、close 这个也是生成器对象的方法之一,具体可看 Python特性(十一):生成器对象的close方法 - CSDN博客 https://blog.csdn.net/hedan2013/article/details/72811117

4Neutrino

#3 Created at ... [Delete] [Delete and Lock User]

关于send楼主说的有点误区,yield语句应该是先返回,再次调send(x)时,才会回到yield之后的语句继续执行,也就是说 n = yield r 执行的顺序是先返回后赋值,这条语句可以分为两个步骤: 1)yield r #返回r 2)n = yield #回到yield下一语句执行,这个yield是取到send方法的参数

夏哲34813

#4 Created at ... [Delete] [Delete and Lock User]

个人补充理解如下: 先说表达式x = yield i 如果这个表达式只是x = i, 相信每个人都能理解。即把i的值赋值给了x,而现在等号右边是一个yield i,所以先要执行yield i,然后才是赋值。 因为生成器遇到yield就跳出,所以yield把i值返回到了调用者那里。 这个表达式的下一步操作:赋值。却因为等号右边的yield被暂停了,换句话说x = yield i才执行了一半,当调用者通过send(var)回到生成器函数时是回到之前那个赋值表达式被暂停的那里,所以接下来执行x = yield i的另一半,那就是这个赋值操作啦,这个值正是调用者通过send(var)发送进生成器的值。 再说本题执行顺序: 请注意produce()函数的最开始的地方是c.send(None),正如上面所说这个操作是初始化generator,并做第一个yield(遇到consumer函数就返回),它是有值的,他的值r为'',如果你执行命令行的话,你会发现结果先空了一行,就是他的功劳。 然后到n=0+1=1,此时执行c.send(1) ,它开始的位置是在给consumer函数中的n赋值,即[CONSUMER] Consuming 1 ,继续执行命令,此时r被赋值为‘200 ok’ ,因为while True 会一直循环,所以继续重来,但是生成器遇到yield 会自动跳出,此时跳出结果变成为r=‘200 ok’。

郝宇臻

#5 Created at ... [Delete] [Delete and Lock User]

执行命令后,不会先空一行。因为c.send(None)传进来的是None,所以返回的是None而不是" ".

自己看半天没理解send是哪来的。。。 原来generator自带了个send方法。


  • 1

Reply