Ⅰ 初學python,pycharm和Spyder哪個好
1 如果你是web開發工程師
那就選擇pycharm。針對大型的web框架修改調試,還是需要個大型IDE。
2 如果你是數據處理工程師
那就選擇spyder或者anaconda。安裝後就處理好集成環境。不用再處理環境依賴關系,也包含了numpy,matplotlib和pandas,可以做些數據處理。
3 如果你是初學者
那就用python+vscode。可以智能提示,語法檢查,逐行調試等
Ⅱ python在eclipse下可以單步調試嗎
在eclipse下可以單步調試python的方法:
1、右鍵單擊標尺欄添加斷點
程序調試過程中,常用的幾個快捷鍵如下:
單步跳入 Step Into: F5
單步跳過 Step Over: F6
單步返回 Step Return: F7
重新開始 Resume: F8
在控制台 Console 中,顯示出斷點之前代碼的執行結果。如果要查看某個變數的值,以變數 a 為例,可以手動在控制台中鍵入一行代碼 」print 『a is:』, a」,再連續按兩次 Enter 鍵,即顯示出變數的值。
Ⅲ python能逐句運行嗎
可以使用命令提示符,運行python命令,一句一句執行。當然代碼塊肯定不能如此做了。
您還可以使用python集成開發環境,比如Pycharm這種。使用斷點調試,逐行執行代碼。
Ⅳ python腳本可以單步調試嗎
可以,選擇帶調試功能的編輯器就行了,比如 PyCharm, PyScripter
Ⅳ 同樣的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代碼通過執行py文件運行正常,但是直接在編譯器裡面逐行寫的時候報語法錯誤,這是為什麼呢
格式問題,執行語句前面需要空四格
Ⅶ python怎麼在py文件中逐行運行
有,種,東,西,叫,調,試
Ⅷ python如何一步步調試
裝個Pycharm
1 添加斷點
2 Debug下運行代碼:
3 F8:進行下一步操作
F7 :跳入下一個方法中
Ⅸ Python如何實現單步調試
方法如下:
view plain
/***gcc -o libpycall.so -shared -fPIC pycall.c*/
#include <stdio.h>
#include <stdlib.h>
int foo(int a, int b)
{
printf("you input %d and %d\n", a, b);
return a+b;
}
Ⅹ python 為什麼不能一步步手動調試
python的IDLE有調試功能
IDLE的調試功能比較初級,可以用下其它IDE的調試功能如pycharm
IDLE的調試模式:
圖一是打開調試模式的按鈕
圖二是打開的調試界面
圖三是當你運行任何一個運行腳本時,就會進行調試
單步調試什麼的都在那個面板上,斷點要在腳本文件里右鍵打