首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python 函数为什么会默认返回 None?

    它们的执行效果跟直接写 return 语句相比,是完全相同的: 这 4 个例子属于两种类型:一种没有写 return,但是都有隐藏的 return 返回值;一种写了 return,而且实际也有返回值。...不管有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。 那么,问题来了:Python 的函数为什么能默认返回 None 呢?它是如何实现的呢?...答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回(出自:compile.c): 也就是说,如果定义的函数没有返回值...,Python 解释器就会(强行地)默认给我们注入一段返回逻辑!...那么,这就会引出新的问题:Python 为什么要求函数都要有返回值呢?为什么它不像某些语言那样,提供一个 void 关键字,支持定义无返回值的空函数呢?

    2.2K40

    【Python】函数 ④ ( 函数 None 返回值 | None 值应用场景 | 用于 if 判断 | 定义无初始内容变量 | 代码示例 )

    # 函数体 # return 返回值 (可选) Python 函数中没有显示定义返回值 , 那么返回的就是 特殊字面量 None , 其类型是 ; None...- 接收 None 返回值 下面的代码中 , hello 函数没有使用 return 关键字 返回 返回值 ; 该 hello 函数 没有显示定义 返回值 , 实际上该函数返回的是 None 返回值...; 使用变量接收该函数的返回值 , 返回值是 None , 返回值类型是 NoneType ; 代码示例 : """ 接收 函数 None 返回值示例 """ # 定义无返回值的函数 def hello...return 关键字返回 None 在该示例中 , 比上一个示例多了 return None 返回值 , 其执行效果与没有返回值一模一样 ; 代码示例 : """ 接收 函数 None 返回值示例 ""...None 二、None 值应用场景 ---- 1、None 值应用场景简介 函数 None 返回值应用场景 : 函数返回值 : 表示函数没有返回值 ; 用于 if

    45620

    Python生成器

    简单来说:只要在函数中有 yield 关键字的就称为 生成器 此时按照调用函数的方式( 案例中为 F = fib(5) )使用生成器就不再是执行函数体了,而是会 返回一个生成器对象,然后就可以按照使用...yield 关键字有两点作用: 保存当前上下文环境即运行状态(断点),然后暂停执行,即将生成器(函数)挂起 将 yield 关键字后面表达式的值作为返回值返回,此时可以理解为起到了 return 的作用...可以使用 next() 函数让生成器从断点处继续执行,即唤醒生成器(函数) 说明 Python3 中的生成器可以使用 return 返回最终运行的返回值,而 Python2 中的生成器 不允许 使用...return 返回一个返回值(即可以使用 return 从生成器中退出,但 return 后不能有任何表达式)。...例如:执行到 yield 时,fun() 函数作用暂时保存,返回 i 的值;temp 接收下次 f.send("python"),send发送过来的值,next(f) 等价 f.send(None) def

    40900

    Python生成器

    简单来说:只要在函数中有 yield 关键字的就称为 生成器 此时按照调用函数的方式( 案例中为 F = fib(5) )使用生成器就不再是执行函数体了,而是会 返回一个生成器对象,然后就可以按照使用...yield 关键字有两点作用: 保存当前上下文环境即运行状态(断点),然后暂停执行,即将生成器(函数)挂起 将 yield 关键字后面表达式的值作为返回值返回,此时可以理解为起到了 return 的作用...可以使用 next() 函数让生成器从断点处继续执行,即唤醒生成器(函数) 说明 Python3 中的生成器可以使用 return 返回最终运行的返回值,而 Python2 中的生成器 不允许 使用...return 返回一个返回值(即可以使用 return 从生成器中退出,但 return 后不能有任何表达式)。...例如:执行到 yield 时,fun() 函数作用暂时保存,返回 i 的值;temp 接收下次 f.send("python"),send发送过来的值,next(f) 等价 f.send(None) def

    63920

    从yield 到yield from再到python协程

    如果发送的值为None,那么会给委派调用子生成器的__next__()方法。...如果发送的值不是None,那么会调用子生成器的send方法,如果调用的方法抛出StopIteration异常,那么委派生成器恢复运行,任何其他异常都会向上冒泡,传给委派生成器 生成器退出时,生成器(或子生成器...send方法 send方法只有一个参数,就是发送值到生成器,调用send(None)相当于调用生成器的next()方法 因为我们开始执行生成器函数的时候,并没有实际执行生成器函数中的代码而是返回一个生成器对象...,所以我们需要调用next()或者send(None)来激活协程 与next()方法一样,send()方法返回generator-iterator产生的下一个值,如果生成器正常退出或已经退出,则引发StopIteration...如果生成器引发未捕获的异常,它将传播到send()的调用者 throw方法 让生成器在被挂起的位置抛出指定的异常,如果生成器捕获了异常并且返回的另外一个值,那么这个值就是g.throw()返回的值 如果生成器没有捕获异常

    98240

    学习python协程前你必须了解的知识

    但是需要注意在一个生成器对象没有执行next方法之前,由于没有yield语句被挂起,所以执行send方法会报错,除非执行sene(None) throw方法 作用 它的实现手段是通过向生成器对象在上次被挂起处...之后会继续执行生成器对象中后面的语句,知道遇到下一个yield语句返回。如果在生成器对象方法执行完毕后,依然没有遇到yield语句,跑出StopIteration异常。...for i in range(4): acc.send(i) acc.send(None) # 结束 for i in range(5): acc.send(i) acc.send(None...(x) #然后将x在send给writer子生成器 except StopIteration: #处理子生成器返回的异常 pass # 包装器也是个生成器,上面所有复杂的写法也可以用...coro1.send(None) # 生成器准备好接收数据 while True: try: try: x =

    38520

    Python协程深入理解

    如果生成器处理了抛出的异常,代码会向前执行到下一个yield表达式,而产出的值会成为调用generator.throw方法代码的返回值。...委派生成器在yield from 表达式处暂停时,调用方可以直接把数据发给子生成器,子生成器再把产出产出值发给调用方,子生成器返回之后,解释器会抛出StopIteration异常,并把返回值附加到异常对象上...averager实例运行完毕后,返回的值会绑定到results[key]上,while 循环会不断创建averager实例,处理更多的值 并且上述代码中的子生成器可以使用return 返回一个值,而返回的值会成为...如果发送的值为None,那么会给委派调用子生成器的__next__()方法。...如果发送的值不是None,那么会调用子生成器的send方法,如果调用的方法抛出StopIteration异常,那么委派生成器恢复运行,任何其他异常都会向上冒泡,传给委派生成器 生成器退出时,生成器(或子生成器

    1.1K90

    日拱一卒,伯克利教你学Python,一次弄懂迭代器生成器

    一个生成器函数返回一个特殊的迭代器类型,叫做生成器。...生成器函数使用yield语句代替了return语句。调用一个生成器函数将会返回一个生成器对象,而不是执行函数中的代码。...比如,让我们看一下下面这个生成器的代码: 调用countdown将会返回一个生成器对象,这个对象能够从n数到0。因为生成器都是迭代器,所以我们可以对结果调用iter,这会得到一个同样的对象。...接下来是上面内容的一些总结: 生成器函数拥有yield语句,并且会返回一个生成器对象 对生成器对象调用iter会得到一个同样的对象,并且不会修改生成器的状态 生成器的函数主体不会被执行,直到调用next...使用ok命令来进行测试:python3 ok -q remainders_generator 答案 我们在一个生成器内部实现一个生成器,然后在外部调用内部的生成器,返回生成器对象。

    46920

    Python Generator:一个被低估的性能利器

    当我们调用一个生成器函数时,它并不会立即执行函数体,而是返回一个生成器对象。只有在实际请求下一个值时,它才会执行到下一个 yield 语句。...,但函数体还未开始执行print("第一步:创建生成器")next(avg) # 启动生成器,运行到第一个 yield,返回 Noneprint("第二步:生成器已启动,...计算 average = 60/3 = 20.0 # 3. yield 返回 20.0每次 send 调用,生成器都会在 value = yield average...float# 使用示例proc = number_processor()next(proc) # 启动生成器,返回 0print(proc.send("hello")) # 输出 1print(proc.send...# 协变(T_co)示例:# 如果一个函数返回 Dog,它也可以用在需要返回 Animal 的地方generator1: Generator[Animal, Animal, None] = dog_generator

    11010

    Python 协程的详细用法和例子

    如果生成器处理了抛出的异常,代码会向前执行到下一个 yield 表达式,而产出的值会成为调用 generator.throw方法得到的返回值。...为了得到返回值,协程必须正常终止;然后生成器对象会抛出StopIteration 异常,异常对象的 value 属性保存着返回的值。...子生成器返回之后,解释器会抛出 StopIteration 异常,并把返回值附加到异常对象上,此时委派生成器会恢复。...5. coroutine.send(None) 终止 averager 子生成器,子生成器抛出 StopIteration 异常并将返回的数据包含在异常对象的value中,yield from 可以直接抓取...使用 send() 方法发给委派生成器的值都直接传给子生成器。如果发送的值是None,那么会调用子生成器的 next() 方法。如果发送的值不是 None,那么会调用子生成器的 send() 方法。

    1.2K10

    面试题-python 什么是生成器(generator)?

    跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。...生成器 yield 用法 函数里面的 return 应该都知道,当函数遇到return 后就返回某个值,不会继续往下了。...yield 可以理解成return ,但不能完成等于return ,当程序运行到yield 后, 会返回某个值,返回之后程序就不再往下运行了。...生成器是一个返回迭代器的函数,只能用于迭代操作,简单点理解生成器就是一个迭代器。...给过来的,这时候可以把yield 当成一个变量,这个变量的值默认是None,所以打印:my name is : None 接下来通过send() 方法给yield 赋值。

    1K20

    Python | asyncio:从原理、源码到实现

    ") a = gen.send(None) print('从生成器中获取一个值', a) b = gen.send(None) print('获取到的第二个值', b) # out # 启动生成器 #...,长得像个函数,但是调用之后却返回一个生成器对象。...如果有传入参数,就将参数入栈,用这种方式来向生成器传递值。然后更改生成器运行状态。通过 PyEval_EvalFrameEx 函数运行生成器保存的栈帧,返回值。...想要获得 return 的返回值,要么用 try 语句捕获异常要么用 yield from 表达式获取值。 ? yield from 另外一点就是,能将内层的生成器的返回值,传到外层。 ?...coro 通过 coro.send(None) 启动,遇到 io 操作,会用 yield 返回一个 future。io 操作完成之后, 回调函数通过 coro.send(None) 继续往下进行。

    3.3K32

    python-yield生成器介绍

    但是它和return有点不一样,return返回后,程序终止,但是yield返回的是一个生成器,同时会记住当前程序的执行位置。下面是一个示例代码 gen方法是一个生成器 #!...# end...... # starting...... # 5 我们可以看到打印输出,第二个输出是接着第一个next输出的,yield返回的值并不会直接赋值给res,yield返回的值是返回给生成器...我们可以通过打断点的方式,可以看到这个程序的执行顺序: gen方法返回一个生成器之后,并不会直接执行,需要激活生成器 当遇到第一个next的时候,生成器被激活,开始执行gen方法里面的while代码,...,但是res并没有赋值,所以是None,遇到yield时,程序暂停,所以没有res,但是yield给gen函数返回了一个值5,所以会打印5 当遇到第二个next时,会重新开始执行,从打印res开始执行,...执行完后续代码后,再次进入while循环,遇到yield程序再次暂停 res的值一直是None,但是有没有办法更改呢,是可以的,生成器提供了一个send方法,以下代码可以通过send方法改变res,再遇到第三个

    31230
    领券