찾다
백엔드 개발파이썬 튜토리얼在 Python 中,为什么 pow 这样的函数可以直接调用,而 floor 这样的函数得先导入模块?

python新手,望大神们多指教

回复内容:

本来写在 @bhuztez 大大的回答的评论里的。算了还是发到顶层好了。

诶这里 @蓝色 大大的回答真的误解一些了, @bhuztez 大大的回答才是完全正解。

这个问题,要看最精辟的答案的请看 @flow memory 大大的,要深入到Python的内部机制的请看 @bhuztez 大大的,要看点具体代码的请看 @蓝色 大大修正过的答案。

Python的__builtin___模块完全是个运行时的东西, @蓝色 大大引用的代码其实是在VM初始化的时候把初始的__builtin___模块中的名字与函数指针的对应关系注册好;然而Python的(源码到字节码)编译器是不关心这个的。
Python的pow()跟像GCC的__builtin_powi()不可以相提并论;前者的行为可以在运行时改变,而编译器完全不把它当作特殊的东西看待;后者则是编译器直接支持的intrinsic function。

刚初始化好的时候,__builtin__模块里的"pow"映射到的是builtin_pow()函数,后者进一步调用PyNumber_Power()函数来实现功能;cpython/bltinmodule.c at 2.7 · python/cpython · GitHub
Python的源码编译器会把 ** 运算符编译为BINARY_POWER字节码指令,而Python的字节码解释器为BINARY_POWER的实现则是直接调用PyNumber_Power()函数(不通过符号解析__builtin__模块里的"pow"的当前绑定)。cpython/ceval.c at 2.7 · python/cpython · GitHub

由于在Python代码里调用pow()实际上要先经过一次符号解析(LOAD_NAME)找到目标然后再调用过去,而模块的绑定又是可变的,所以可以做到下面这种事情:
<span class="err">$</span> <span class="n">python</span>
<span class="n">Python</span> <span class="mf">2.7</span><span class="o">.</span><span class="mi">5</span> <span class="p">(</span><span class="n">default</span><span class="p">,</span> <span class="n">Mar</span>  <span class="mi">9</span> <span class="mi">2014</span><span class="p">,</span> <span class="mi">22</span><span class="p">:</span><span class="mi">15</span><span class="p">:</span><span class="mo">05</span><span class="p">)</span> 
<span class="p">[</span><span class="n">GCC</span> <span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span> <span class="n">Compatible</span> <span class="n">Apple</span> <span class="n">LLVM</span> <span class="mf">5.0</span> <span class="p">(</span><span class="n">clang</span><span class="o">-</span><span class="mf">500.0</span><span class="o">.</span><span class="mi">68</span><span class="p">)]</span> <span class="n">on</span> <span class="n">darwin</span>
<span class="n">Type</span> <span class="s">"help"</span><span class="p">,</span> <span class="s">"copyright"</span><span class="p">,</span> <span class="s">"credits"</span> <span class="ow">or</span> <span class="s">"license"</span> <span class="k">for</span> <span class="n">more</span> <span class="n">information</span><span class="o">.</span>
<span class="o">>>></span> <span class="mi">2</span> <span class="o">**</span> <span class="mi">5</span>
<span class="mi">32</span>
<span class="o">>>></span> <span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="mi">32</span>
<span class="o">>>></span> <span class="n">__builtins__</span>
<span class="o"><</span><span class="n">module</span> <span class="s">'__builtin__'</span> <span class="p">(</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span><span class="p">)</span><span class="o">></span>
<span class="o">>>></span> <span class="nb">dir</span><span class="p">(</span><span class="n">__builtins__</span><span class="p">)</span>
<span class="p">[</span><span class="s">'ArithmeticError'</span><span class="p">,</span> <span class="s">'AssertionError'</span><span class="p">,</span> <span class="s">'AttributeError'</span><span class="p">,</span> <span class="s">'BaseException'</span><span class="p">,</span> <span class="s">'BufferError'</span><span class="p">,</span> <span class="s">'BytesWarning'</span><span class="p">,</span> <span class="s">'DeprecationWarning'</span><span class="p">,</span> <span class="s">'EOFError'</span><span class="p">,</span> <span class="s">'Ellipsis'</span><span class="p">,</span> <span class="s">'EnvironmentError'</span><span class="p">,</span> <span class="s">'Exception'</span><span class="p">,</span> <span class="s">'False'</span><span class="p">,</span> <span class="s">'FloatingPointError'</span><span class="p">,</span> <span class="s">'FutureWarning'</span><span class="p">,</span> <span class="s">'GeneratorExit'</span><span class="p">,</span> <span class="s">'IOError'</span><span class="p">,</span> <span class="s">'ImportError'</span><span class="p">,</span> <span class="s">'ImportWarning'</span><span class="p">,</span> <span class="s">'IndentationError'</span><span class="p">,</span> <span class="s">'IndexError'</span><span class="p">,</span> <span class="s">'KeyError'</span><span class="p">,</span> <span class="s">'KeyboardInterrupt'</span><span class="p">,</span> <span class="s">'LookupError'</span><span class="p">,</span> <span class="s">'MemoryError'</span><span class="p">,</span> <span class="s">'NameError'</span><span class="p">,</span> <span class="s">'None'</span><span class="p">,</span> <span class="s">'NotImplemented'</span><span class="p">,</span> <span class="s">'NotImplementedError'</span><span class="p">,</span> <span class="s">'OSError'</span><span class="p">,</span> <span class="s">'OverflowError'</span><span class="p">,</span> <span class="s">'PendingDeprecationWarning'</span><span class="p">,</span> <span class="s">'ReferenceError'</span><span class="p">,</span> <span class="s">'RuntimeError'</span><span class="p">,</span> <span class="s">'RuntimeWarning'</span><span class="p">,</span> <span class="s">'StandardError'</span><span class="p">,</span> <span class="s">'StopIteration'</span><span class="p">,</span> <span class="s">'SyntaxError'</span><span class="p">,</span> <span class="s">'SyntaxWarning'</span><span class="p">,</span> <span class="s">'SystemError'</span><span class="p">,</span> <span class="s">'SystemExit'</span><span class="p">,</span> <span class="s">'TabError'</span><span class="p">,</span> <span class="s">'True'</span><span class="p">,</span> <span class="s">'TypeError'</span><span class="p">,</span> <span class="s">'UnboundLocalError'</span><span class="p">,</span> <span class="s">'UnicodeDecodeError'</span><span class="p">,</span> <span class="s">'UnicodeEncodeError'</span><span class="p">,</span> <span class="s">'UnicodeError'</span><span class="p">,</span> <span class="s">'UnicodeTranslateError'</span><span class="p">,</span> <span class="s">'UnicodeWarning'</span><span class="p">,</span> <span class="s">'UserWarning'</span><span class="p">,</span> <span class="s">'ValueError'</span><span class="p">,</span> <span class="s">'Warning'</span><span class="p">,</span> <span class="s">'ZeroDivisionError'</span><span class="p">,</span> <span class="s">'_'</span><span class="p">,</span> <span class="s">'__debug__'</span><span class="p">,</span> <span class="s">'__doc__'</span><span class="p">,</span> <span class="s">'__import__'</span><span class="p">,</span> <span class="s">'__name__'</span><span class="p">,</span> <span class="s">'__package__'</span><span class="p">,</span> <span class="s">'abs'</span><span class="p">,</span> <span class="s">'all'</span><span class="p">,</span> <span class="s">'any'</span><span class="p">,</span> <span class="s">'apply'</span><span class="p">,</span> <span class="s">'basestring'</span><span class="p">,</span> <span class="s">'bin'</span><span class="p">,</span> <span class="s">'bool'</span><span class="p">,</span> <span class="s">'buffer'</span><span class="p">,</span> <span class="s">'bytearray'</span><span class="p">,</span> <span class="s">'bytes'</span><span class="p">,</span> <span class="s">'callable'</span><span class="p">,</span> <span class="s">'chr'</span><span class="p">,</span> <span class="s">'classmethod'</span><span class="p">,</span> <span class="s">'cmp'</span><span class="p">,</span> <span class="s">'coerce'</span><span class="p">,</span> <span class="s">'compile'</span><span class="p">,</span> <span class="s">'complex'</span><span class="p">,</span> <span class="s">'copyright'</span><span class="p">,</span> <span class="s">'credits'</span><span class="p">,</span> <span class="s">'delattr'</span><span class="p">,</span> <span class="s">'dict'</span><span class="p">,</span> <span class="s">'dir'</span><span class="p">,</span> <span class="s">'divmod'</span><span class="p">,</span> <span class="s">'enumerate'</span><span class="p">,</span> <span class="s">'eval'</span><span class="p">,</span> <span class="s">'execfile'</span><span class="p">,</span> <span class="s">'exit'</span><span class="p">,</span> <span class="s">'file'</span><span class="p">,</span> <span class="s">'filter'</span><span class="p">,</span> <span class="s">'float'</span><span class="p">,</span> <span class="s">'format'</span><span class="p">,</span> <span class="s">'frozenset'</span><span class="p">,</span> <span class="s">'getattr'</span><span class="p">,</span> <span class="s">'globals'</span><span class="p">,</span> <span class="s">'hasattr'</span><span class="p">,</span> <span class="s">'hash'</span><span class="p">,</span> <span class="s">'help'</span><span class="p">,</span> <span class="s">'hex'</span><span class="p">,</span> <span class="s">'id'</span><span class="p">,</span> <span class="s">'input'</span><span class="p">,</span> <span class="s">'int'</span><span class="p">,</span> <span class="s">'intern'</span><span class="p">,</span> <span class="s">'isinstance'</span><span class="p">,</span> <span class="s">'issubclass'</span><span class="p">,</span> <span class="s">'iter'</span><span class="p">,</span> <span class="s">'len'</span><span class="p">,</span> <span class="s">'license'</span><span class="p">,</span> <span class="s">'list'</span><span class="p">,</span> <span class="s">'locals'</span><span class="p">,</span> <span class="s">'long'</span><span class="p">,</span> <span class="s">'map'</span><span class="p">,</span> <span class="s">'max'</span><span class="p">,</span> <span class="s">'memoryview'</span><span class="p">,</span> <span class="s">'min'</span><span class="p">,</span> <span class="s">'next'</span><span class="p">,</span> <span class="s">'object'</span><span class="p">,</span> <span class="s">'oct'</span><span class="p">,</span> <span class="s">'open'</span><span class="p">,</span> <span class="s">'ord'</span><span class="p">,</span> <span class="s">'pow'</span><span class="p">,</span> <span class="s">'print'</span><span class="p">,</span> <span class="s">'property'</span><span class="p">,</span> <span class="s">'quit'</span><span class="p">,</span> <span class="s">'range'</span><span class="p">,</span> <span class="s">'raw_input'</span><span class="p">,</span> <span class="s">'reduce'</span><span class="p">,</span> <span class="s">'reload'</span><span class="p">,</span> <span class="s">'repr'</span><span class="p">,</span> <span class="s">'reversed'</span><span class="p">,</span> <span class="s">'round'</span><span class="p">,</span> <span class="s">'set'</span><span class="p">,</span> <span class="s">'setattr'</span><span class="p">,</span> <span class="s">'slice'</span><span class="p">,</span> <span class="s">'sorted'</span><span class="p">,</span> <span class="s">'staticmethod'</span><span class="p">,</span> <span class="s">'str'</span><span class="p">,</span> <span class="s">'sum'</span><span class="p">,</span> <span class="s">'super'</span><span class="p">,</span> <span class="s">'tuple'</span><span class="p">,</span> <span class="s">'type'</span><span class="p">,</span> <span class="s">'unichr'</span><span class="p">,</span> <span class="s">'unicode'</span><span class="p">,</span> <span class="s">'vars'</span><span class="p">,</span> <span class="s">'xrange'</span><span class="p">,</span> <span class="s">'zip'</span><span class="p">]</span>
<span class="o">>>></span> <span class="nb">pow</span>
<span class="o"><</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="n">function</span> <span class="nb">pow</span><span class="o">></span>
<span class="o">>>></span> <span class="n">mypow</span> <span class="o">=</span> <span class="nb">pow</span>
<span class="o">>>></span> <span class="n">mypow</span>
<span class="o"><</span><span class="n">built</span><span class="o">-</span><span class="ow">in</span> <span class="n">function</span> <span class="nb">pow</span><span class="o">></span>
<span class="o">>>></span> <span class="n">__builtins__</span><span class="o">.</span><span class="n">pow</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">mypow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="o">>>></span> <span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="mi">31</span>
<span class="o">>>></span> <span class="mi">2</span> <span class="o">**</span> <span class="mi">5</span>
<span class="mi">32</span>
看到蓝色来冒充Python专家了,特来批判一番。这里首先是黑魔法,不然有些问题就解释不清楚啦。

>>> __builtins__
<module '__builtin__' (built-in)>
>>> pow(2,2)
4
>>> __builtins__ = None
>>> pow(2,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'pow' is not defined
>>> __builtins__ = {'pow':1}
>>> pow
1
>>>
很多人扯一大堆道理,然而对于本问题并没什么卵用。

真正原因在于,这是Python设计者的喜好罢了,因为设计者完全可以把floor也做成可以直接调用的嘛。 pow()是built-in function,所以不需要导入.
floor()是math module的function,需要import math(from math import floor)后才能用.
不过要注意的是math module中也有个pow(),和built-in的pow()有些不同.
可以看看官方文档:
2. Built-in Functions
以及
9.2. math — Mathematical functions -------------------------------Update------------------
可以看 @RednaxelaFX 的解释,我的理解有所偏差,还是放在前面吧,让更多人看到









上面说的很清楚,pow是Builtin函数,而Builtin函数是编译器直接支持的,可以参考这个链接了解Built in函数与普通函数的不同:Intrinsic function

下面我将顺便展开说说Python中是如何实现Builtin Pow的。首先在Python中,Built in函数定义在了Bltinmodules.c这个文件中,具体的代码在:

<span class="k">static</span> <span class="n">PyMethodDef</span> <span class="n">builtin_methods</span><span class="p">[]</span>
pow 貌似比 floor 更常用 更适合作为 build-in 存在 这个问题的实质就是:为什么有的函数在__builtins__,而有的不在? 除了scope原因之外,造成這樣scope的原因,還有一個可能是Pow 是int, floor可能是float。雖然python裡面並沒有什麼type。
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Python 학습 : 2 시간의 일일 연구가 충분합니까?Python 학습 : 2 시간의 일일 연구가 충분합니까?Apr 18, 2025 am 12:22 AM

하루에 2 시간 동안 파이썬을 배우는 것으로 충분합니까? 목표와 학습 방법에 따라 다릅니다. 1) 명확한 학습 계획을 개발, 2) 적절한 학습 자원 및 방법을 선택하고 3) 실습 연습 및 검토 및 통합 연습 및 검토 및 통합,이 기간 동안 Python의 기본 지식과 고급 기능을 점차적으로 마스터 할 수 있습니다.

웹 개발을위한 파이썬 : 주요 응용 프로그램웹 개발을위한 파이썬 : 주요 응용 프로그램Apr 18, 2025 am 12:20 AM

웹 개발에서 Python의 주요 응용 프로그램에는 Django 및 Flask 프레임 워크 사용, API 개발, 데이터 분석 및 시각화, 머신 러닝 및 AI 및 성능 최적화가 포함됩니다. 1. Django 및 Flask 프레임 워크 : Django는 복잡한 응용 분야의 빠른 개발에 적합하며 플라스크는 소형 또는 고도로 맞춤형 프로젝트에 적합합니다. 2. API 개발 : Flask 또는 DjangorestFramework를 사용하여 RESTFULAPI를 구축하십시오. 3. 데이터 분석 및 시각화 : Python을 사용하여 데이터를 처리하고 웹 인터페이스를 통해 표시합니다. 4. 머신 러닝 및 AI : 파이썬은 지능형 웹 애플리케이션을 구축하는 데 사용됩니다. 5. 성능 최적화 : 비동기 프로그래밍, 캐싱 및 코드를 통해 최적화

Python vs. C : 성능과 효율성 탐색Python vs. C : 성능과 효율성 탐색Apr 18, 2025 am 12:20 AM

Python은 개발 효율에서 C보다 낫지 만 C는 실행 성능이 높습니다. 1. Python의 간결한 구문 및 풍부한 라이브러리는 개발 효율성을 향상시킵니다. 2.C의 컴파일 유형 특성 및 하드웨어 제어는 실행 성능을 향상시킵니다. 선택할 때는 프로젝트 요구에 따라 개발 속도 및 실행 효율성을 평가해야합니다.

Python in Action : 실제 예제Python in Action : 실제 예제Apr 18, 2025 am 12:18 AM

Python의 실제 응용 프로그램에는 데이터 분석, 웹 개발, 인공 지능 및 자동화가 포함됩니다. 1) 데이터 분석에서 Python은 Pandas 및 Matplotlib를 사용하여 데이터를 처리하고 시각화합니다. 2) 웹 개발에서 Django 및 Flask 프레임 워크는 웹 응용 프로그램 생성을 단순화합니다. 3) 인공 지능 분야에서 Tensorflow와 Pytorch는 모델을 구축하고 훈련시키는 데 사용됩니다. 4) 자동화 측면에서 파이썬 스크립트는 파일 복사와 같은 작업에 사용할 수 있습니다.

Python의 주요 용도 : 포괄적 인 개요Python의 주요 용도 : 포괄적 인 개요Apr 18, 2025 am 12:18 AM

Python은 데이터 과학, 웹 개발 및 자동화 스크립팅 필드에 널리 사용됩니다. 1) 데이터 과학에서 Python은 Numpy 및 Pandas와 같은 라이브러리를 통해 데이터 처리 및 분석을 단순화합니다. 2) 웹 개발에서 Django 및 Flask 프레임 워크를 통해 개발자는 응용 프로그램을 신속하게 구축 할 수 있습니다. 3) 자동 스크립트에서 Python의 단순성과 표준 라이브러리가 이상적입니다.

파이썬의 주요 목적 : 유연성과 사용 편의성파이썬의 주요 목적 : 유연성과 사용 편의성Apr 17, 2025 am 12:14 AM

Python의 유연성은 다중 파리가 지원 및 동적 유형 시스템에 반영되며, 사용 편의성은 간단한 구문 및 풍부한 표준 라이브러리에서 나옵니다. 유연성 : 객체 지향, 기능 및 절차 프로그래밍을 지원하며 동적 유형 시스템은 개발 효율성을 향상시킵니다. 2. 사용 편의성 : 문법은 자연 언어에 가깝고 표준 라이브러리는 광범위한 기능을 다루며 개발 프로세스를 단순화합니다.

파이썬 : 다목적 프로그래밍의 힘파이썬 : 다목적 프로그래밍의 힘Apr 17, 2025 am 12:09 AM

Python은 초보자부터 고급 개발자에 이르기까지 모든 요구에 적합한 단순성과 힘에 호의적입니다. 다목적 성은 다음과 같이 반영됩니다. 1) 배우고 사용하기 쉽고 간단한 구문; 2) Numpy, Pandas 등과 같은 풍부한 라이브러리 및 프레임 워크; 3) 다양한 운영 체제에서 실행할 수있는 크로스 플랫폼 지원; 4) 작업 효율성을 향상시키기위한 스크립팅 및 자동화 작업에 적합합니다.

하루 2 시간 안에 파이썬 학습 : 실용 가이드하루 2 시간 안에 파이썬 학습 : 실용 가이드Apr 17, 2025 am 12:05 AM

예, 하루에 2 시간 후에 파이썬을 배우십시오. 1. 합리적인 학습 계획 개발, 2. 올바른 학습 자원을 선택하십시오. 3. 실습을 통해 학습 된 지식을 통합하십시오. 이 단계는 짧은 시간 안에 Python을 마스터하는 데 도움이 될 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구