導航:首頁 > 編程語言 > python代碼逐行運行

python代碼逐行運行

發布時間:2023-06-05 00:39:45

『壹』 同樣的python代碼通過python文件運行正常,但是直接在解釋器裡面逐行寫的時候報語法錯誤,這是為什麼呢

對於Python而言,存儲好的腳本文件(Script file)和在Console中的互動式(interactive)命令,執行方式不同。對於腳本文件,解釋器將其當作整個代碼塊執行,而對於交互性命令行中的每一條命令,解釋器將其當作單獨的代碼塊執行。而Python在執行同一個代碼塊的初始化對象的命令時,會檢查是否其值是否已經存在,如果存在,會將其重用(這句話不夠嚴謹,後面會詳談)。所以在你給出的例子中,文件執行時(同一個代碼塊)會把a、b兩個變數指向同一個對象;而在命令行執行時,a、b賦值語句分別被當作兩個代碼塊執行,所以會得到兩個不同的對象,因而is判斷返回False。

# 如果你能理解上面一段,就不用看下面的廢話了。

下面是詳細的回答:
說真的,這簡直是我最近在知乎遇到過的最好的問題!
這個問題遠超我想像中的復雜。我本來以為我能用兩分鍾搞定這種每日一水的問題,結果我花了一個小時搜來搜去,讀來讀去,還跑去群里跟人討論了一陣,都沒能找到答案。
大概兩個小時以後,我找到了相對正確的答案,把自己已經弄懂的部分強答一番,並邀請一些大神,希望能看到更為准確的回答。

這個問題的博大精深在於,能從中扯出許多小問題來,雖然這些東西很細枝末節,很trick,在日常編程中不怎麼用的到,更不怎麼需要額外關注,但是理解這些問題,對於我們理解Python的對象機制乃至內存處理機制有很大的幫助。

我從頭開始說,大概會分以下幾個部分來談,每個部分其實都能展開很廣,這次就把與問題相關的知識簡單一提:
(雖然我覺得按照我尋找答案的過程講,可能對認知更有幫助,但是理清頭緒的話可能更好理解,之後會找時間為這個問題寫篇文章好好記錄一下)

Python中的數據類型——可變與不可變
Python中is比較與==比較的區別
Python中對小整數的緩存機制
Python程序的結構——代碼塊
Python的內存管理——新建對象時的操作

聲明:以下所講機制,與Python不同版本的具體實現有關(implement specific)可能不同。

Python中的數據類型
Python中的數據類型,這可能是大家入門Python的第一節課。很簡單嘛,大家最常用的,int(包括long)、float、string、list、tuple、dict,加上bool和NoneType。
但是這里要重點說的,其實是可變類型和不可變類型。
不可變(immutable):Number(包括int、float),String,Tuple
可變(mutable):Dict,List,User-defined class
首先我們要記住一句話,一切皆對象。Python中把任何一種Type都當作對象來處理。其中有一些類型是不可變的,比如:

這個還是好理解的,在初始化賦值一個字元串後,我們沒有辦法直接修改它的值。但是數字呢?數字這種變來變去的又怎麼理解。
可以看出,a的值雖然從10變成了11,但是a這個變數指向內存中的位置發生了變化,也就是說我們並沒有對a指向的內存進行操作,而是對a進行了重新賦值。
再簡單舉一個可變的例子。

體會了可變與不可變的外在表現後,簡單理解一下為什麼不可變。
Python官方文檔這樣解釋字元串不可變:

There are several advantages.
One is performance: knowing that a string is immutable means we can allocate space for it at creation time, and the storage requirements are fixed and unchanging. This is also one of the reasons for the distinction between tuples and lists.
Another advantage is that strings in Python are considered as 「elemental」 as numbers. No amount of activity will change the value 8 to anything else, and in Python, no amount of activity will change the string 「eight」 to anything else.
個人感覺,有性能上的考慮(比如對一些固定不變的元素給予固定的存儲位置,整數這樣操作比較方便,字元串的話涉及一些比較也會減少後續操作的時間),也有一些安全上的考慮(比如列表中的值會改變,元組不會)。這個我也不太精通,就不展開談了。

Python中is比較與==比較的區別
前面已經提過一次,Python中一切皆對象。對象包含三個要素,id、type、value。
而Python中用於比較「相等」這一概念的操作符,is和==。
當兩個變數指向了同一個對象時,is會返回True(即is比較的是兩個變數的id);
當兩個變數的值相同時,==會返回True(即==比較的是兩個變數的value)。
示例(命令行交互模式下):
第一個和第三個示例是好理解的。
但是第二個就不那麼好理解了,尤其是配合下面這個(假定我們已經知道命令行中的語句執行是單獨執行兩次不會相互影響,後面會具體解釋):
為什麼a、b分別賦值1000時is比較返回False,可以分別賦值100就會返回True?

Python中對小整數的緩存機制
Python官方文檔中這么說:
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined. :-)簡單來說就是,Python自動將-5~256的整數進行了緩存,當你將這些整數賦值給變數時,並不會重新創建對象,而是使用已經創建好的緩存對象。

Python程序的結構——代碼塊&Python的內存管理——新建對象時的操作
終於要來到題主問題的部分了。
先來看最讓我們困惑的,也就是題主給出的示例吧(接下來用float演示,int是同樣的情況):
交互命令行下:
同樣的還有:
(說好的小整數才有緩存呢(摔)!這跟你講的不一樣啊教練!)
這就很尷尬了對吧。
其實從結果論出發,我們很容易猜到結論,就像題主自己也猜了個差不多——緩存機制不同。畢竟is比較的就是對象的id,也就是對象在內存中的位置,也就是是不是同一個對象。
既然腳本文件的執行結果是True,那麼,他倆就是同一個對象;既然命令行執行的結果是False,那麼他倆就不是同一個對象。(這他喵的不是廢話嗎!)
所以我開始了漫長的找原理的過程……然而網上這方面提及的實在太少。尤其是大家的大部分討論都是int的小整數緩存機制;就算討論到了float,也不實際解決我們的問題。

其實我都快要放棄了,漫無目的地翻stackoverflow推薦的相關問題時終於找到了一個類似的情況,但是人家並不是比較的腳本文件和命令行執行,而是比較的函數體和賦值語句:
同樣的代碼,拆開就是False,放函數里就是True!是不是很像我們遇到的情況了。
根據提示我們從官方文檔找到了這樣的說法:

A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a mole, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the 『-c『 option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block.
A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block』s execution has completed.
沒錯!跟我們猜的一樣!這就是原理的出處了!
代碼塊作為一個執行單元,一個模塊、一個函數體、一個類定義、一個腳本文件,都是一個代碼塊。
在互動式命令行中,每行代碼單獨視作一個代碼塊。

至此問題解決……了嗎?視作一個代碼塊,就意味著要把相同value的賦值指向相同的對象嗎?
在此重復一下'is' operator behaves unexpectedly with non-cached integers中提到的實驗,並簡單翻譯結論。
通過compile()函數和dis模塊的code_info()函數來檢測我們執行的命令的信息。
示例:
可以看出,分別賦值a,b得到的value相等,id是不一樣的。
把10.0 10.0 10.1分別賦值給a,b,c,可以看出結果中其實只保存了一個10.0,也就是a,b共用了這個數值。

也就是說,當命令行執行時,是以single的模式來compile代碼(2. Built-in Functions)。它會在u_consts字典中記錄對象常量。
The mode argument specifies what kind of code must be compiled; it can be 'exec' if source consists of a sequence of statements, 'eval' if it consists of a single expression, or 'single' if it consists of a single interactive statement (in the latter case, expression statements that evaluate to something other than None will be printed).而在同一代碼塊執行時,當增加新的常量,會先在字典中查詢記錄,所以相同賦值的變數會指向同一個對象而不是新建對象。

至此…問題大概是解決了。

『貳』 python如何運行

Python是一門高級編程語言,廣泛應用於數據科學、機器學習、人工智慧等領域。Python的運行需要安裝Python解釋器,可以在各個操作系統上運行。要運行Python代碼,可以使用命令行界面或者集配備成開發環境(IDE)。
使用命令行界面運行Python代碼需要打開終端,並輸入信森Python解釋器的命令。在Windows系統上,可以在命令提示符下輸入"python",在Mac和Linux系統上,可以在終端下輸入"python3"。這將打開Python解釋器,可以在其中輸入Python代碼並執行。
使用集成開發環境運行Python代碼可以提供更方便的編程環境和更強大的功能。流行培坦毀的Python集成開發環境包括PyCharm、Spyder、Jupyter Notebook等。在這些環境中,可以使用圖形界面來編寫和運行Python代碼,同時還具有代碼自動補全、調試、版本控制等功能。
無論使用哪種方法運行Python代碼,都需要熟悉Python語言的語法和基本概念。Python是一門易於學習的語言,具有簡潔明了的語法和豐富的標准庫。在Python中,可以使用各種數據類型、控制結構和函數等基本構造塊來編寫代碼。同時,Python還提供了大量的第三方庫和工具,可以方便地進行數據分析、機器學習、圖像處理等任務。
總之,Python是一門功能強大的編程語言,可以應用於各種領域。無論是初學者還是專業開發人員,都可以使用Python來實現自己的編程目標。

『叄』 python代碼運行需要編譯

有人在討論 Python 代碼是編譯執行還是解釋執行?這個問題還可以換一種說法: Python 是編譯型語言還是解釋型語言?回答這個問題

前,我們先弄清楚什麼是編譯型語言,什麼是解釋型語言。

所謂編譯執行就是源代碼經過編譯器編譯處理,生成目標機器碼,就是機器能直接運行的二進制代碼,下次運行時無需重新編譯。不過它

是針對特定CPU體系的,這些目標代碼只能在特定平台執行,如果這個程序需要在另外一種 CPU 上面運行,這個代碼就必須重新編譯。

它不具備可移植性,但是執行速度快,C、C++這類語言屬於編譯型語言。

而解釋型語言是在代碼運行期間逐行翻譯成目標機器碼,下次執行時,還是需要逐行解釋,我們可以簡單認為 Java、Python 都是解釋型

語言。

編譯型相當於廚師直接做好一桌子菜,顧客來了直接開吃,而解釋型就像吃火鍋,廚師把菜洗好,顧客需要自己動手邊煮邊吃,效率上來

說解釋型語言自然比不過編譯型語言,當然也不是絕對了,像 JIT 的效率就很高

以上是對編譯型語言和解釋型語言的一個簡單粗暴的區分,但是 Python(這里主要是指CPython)並不是嚴格的解釋型語言,因為

Python 代碼在運行前,會先編譯(翻譯)成中間代碼,每個 .py 文件將被換轉成 .pyc 文件,.pyc 就是一種位元組碼文件,它是與平台無

關的中間代碼,不管你放在 Windows 還是 Linux 平台都可以執行,運行時將由虛擬機逐行把位元組碼翻譯成目標代碼。

我們安裝Python 時候,會有一個 Python.exe 文件,它就是 Python 解釋器,你寫的每一行 Python 代碼都是由它負責執行,解釋器由

一個編譯器和一個虛擬機構成,編譯器負責將源代碼轉換成位元組碼文件,而虛擬機負責執行位元組碼,所以,解釋型語言其實也有編譯過

程,只不過這個編譯過程並不是直接生成目標代碼,而是中間代碼(位元組碼),然後再通過虛擬機來逐行解釋執行位元組碼。

總結

Python代碼首先會編程一個位元組碼文件,再由虛擬機逐行解釋,把每一行位元組碼代碼翻譯成目標指令給CPU執行。

推薦學習《Python教程》。

『肆』 Python敲代碼時怎麼換行,每次一按Enter鍵就直接執行程序了,可是代碼還沒有寫完啊。。。

1、Windows使用win+R鍵進入命令行模式。

『伍』 同樣的python代碼通過執行py文件運行正常,但是直接在編譯器裡面逐行寫的時候報語法錯誤,這是為什麼呢

格式問題,執行語句前面需要空四格

『陸』 怎麼運行python代碼

直接點擊文件圖標運行程序。
在系統互動式命令行中運行【代碼】:進入方式【win+R快捷鍵】-【輸入cmd確認】-【輸入python回車】,運行Python程序。
Python開發者有意讓違反察嘩拍了縮進規則的程序不能通過編譯,以此來強制程序員養成良好的編程習慣。並且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括弧或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出。縮進成為了語法的一部分。
Python採用動態類型系統。在編蘆中譯的時候,Python不會敗羨檢查對象是否擁有被調用的方法或者屬性,而是直至運行時,才做出檢查。所以操作對象時可能會拋出異常。不過,雖然Python採用動態類型系統,它同時也是強類型的。Python禁止沒有明確定義的操作,比如數字加字元串。

『柒』 python如何運行

python程序的運行方式有兩種:1、互動式,在滑慶命令行窗口輸入命令,進入python解釋器互動式客戶端,在窗口輸入任意python代碼,客戶端窗口都會立即返回運行結果,當關閉客戶端窗口後,代碼不會保存。
這種互動式方式一般用來進行測試,不是正式的運行方式。
2、腳本式。
按照慣例學習每一門編程語言的第一個程序都是列印含讓困'helloworld!',python也不例外。
任意文本編輯工具都可以進行python代碼的編寫,在桌面新建一個文本文檔,寫入print('helloworld')代碼,然後保存。
現在這個文檔就是一個python的源代碼文件,通常稱為python腳本文件,通常我們會將python腳本文件的後綴改為.py,python代碼需要通過python解釋器解釋成機器碼後交由談念計算機執行,在命令行輸入命令:python腳本文件路徑,就可以運行對應的腳本代碼。

『捌』 怎麼用python實現兩個文件逐行計算兩個區間的並集

有時候,為來了需求,需要統計兩個 list 之間的交集,並集,差集。查詢了一些資料,現在源總結在下面:
1. 獲取兩個list 的zd交集

#方法一:

a=[2,3,4,5]

b=[2,5,8]

tmp = [val for val in a if val in b]

print tmp

#[2, 5]

#方法二

print list(set(a).intersection(set(b)))

2. 獲取兩個list 的並集

print list(set(a).union(set(b)))

3. 獲取兩個 list 的差集

print list(set(b).difference(set(a))) # b中有而a中沒有的

閱讀全文

與python代碼逐行運行相關的資料

熱點內容
均線衍生指標源碼設置 瀏覽:494
做精一張圖pdf 瀏覽:849
編程培訓小朋友 瀏覽:785
巴克球製作解壓 瀏覽:849
測量參數時接單片機的 瀏覽:114
手機音樂添加文件夾 瀏覽:544
百度智能雲b18怎麼刪除app 瀏覽:966
單片機中為什麼顯示找不到頭文件 瀏覽:149
iisweb伺服器如何重啟 瀏覽:836
微信沒有適配方舟編譯器 瀏覽:79
箍筋加密區梁的凈高 瀏覽:887
samp如何加入外國伺服器 瀏覽:893
保鮮膜解壓教學視頻 瀏覽:981
台達plc編程通訊管理軟體 瀏覽:405
優優pdf 瀏覽:799
程序員職業穿搭 瀏覽:255
程序員軟考大綱 瀏覽:17
命令窗口輸入後不滾動 瀏覽:639
C面向切面編程aop例子 瀏覽:369
windowsrar命令 瀏覽:380