❶ python 函數的調用方式
好像沒有特別的叫法吧,也沒注意手冊上有什麼特別的叫法,至於區別,舉個例子你就清楚了,如下:
假如有個列表aa=[1,4,3,5],對這個列表用sort()進行排序,如果第一種方式aa.sort()後aa=[1,3,4,5];
而第二種方式sort(aa)排序後雖然得到了新列表[1,3,4,5],但是aa還是=[1,4,3,5]。
也就是說第一種方式會改變原列表,而第二種不會改變,只是得到了一個新的副本。
GOT IT?!^^
補充一下,如果非要說叫法上的區別的話,第一種叫做方法調用,第二種叫做函數調用。至於方法和函數的些微區別,方法是基於對象的,函數是基於本身的。如果再詳細……方法一般不可以單獨使用,因為大部分方法是基於對象的,調用也必須基於對象,像上面第一種;而函數則可以單獨使用,你可以理解成它是數據系統本身的,而不是對象專有的。
PS:至於為什麼我換了用sort()而沒有用LZ給的例子函數,是因為..…^o^……LZ第一種方式和第二種方式寫的都不是一個函數……
❷ python中怎麼調用自己的方法
C/C++對Python的調用層次可以分為三個層次, (1) 高層次的調用, (2)純Python調用, (3) Python方法的擴展(也就使向Python輸出調用函數). 這里我主要討論(1)和(2)兩種方法.
1 高層次的調用
這是最簡單的一種在C/C++中調用Python的方法. 它直接的調用Python提供的C調用介面函數, 這些函數主要有: PyRun_SimpleString(), PyRun_SimpleStringFlags(), PyRun_SimpleFile(), PyRun_SimpleFileEx()和PyRun_SimpleFileExFlags()幾個. 函數的具體用法參考Python的文檔.
這里舉個例子來說明這種層次的用法:
由這個例子可見, 在C/C++中調用Python的內容非常簡單, 只要構造一個簡單的Python調用字元串.這里要注意的就是, Python調用串語句之間要用'/n'來分開, 且語句之間不能有空格, 如上面的Python字元串不能寫成: "import sys/n print sys.path" , 否則要出錯的.
// c/c++ 中 Python 調用必須的頭文件
#include <Python.h>
//
int main(int argc, char* argv[])
{
// 初始化Python解析環境
Py_Initialize();
// 構造Python執行腳本
char szPyScript[128];
sprintf(szPyScript, "import sys/nprint sys.path");
if(PyRun_SimpleString(szPyScript) != 0)
{
sprintf(stderr, "execute /'%s/'failed!", szPyScript);
return -1;
}
// 清除Python解析環境
Py_Finalize();
}
//
//
以上的例子也表明了在C/C++中調用Python的基本結構, 就是
(1) 先初始化Python環境然: Py_Initialize()
(2) 具體對Python的操作
(3) 清除Python環境
更復雜的一個使用高層調用的例子, 這個例子用PyRun_SimpleFile的例子.
這里值得注意是, 在Window中:
(1) 鏈接debug版本的時候會自動鏈接PythonXX(_d).lib庫, PythonXX_d安裝時是沒有安裝的, 所以要顯示的指定鏈接PythonXX.lib庫, 不知道VC6.0為什麼還會去找PythonXX_d.lib, 在vs7.0不會.
(2) 編譯時要以 /MD(多線程DLL) 選項編譯(不論時debug版本還時release版本都一樣).
以上我在VC7.0中可以正確的運行, 在VC6.0這樣還不行, 可能和我使用的版本有關系(我用的版本是:Python24.lib). 有知道的請賜教!!
// c/c++ 中 Python 調用必須的頭文件
#include <Python.h>
//
int main(int argc, char* argv[])
{
// 初始化Python解析環境
Py_Initialize();
//
char szFile[] = "PyFile.py";
//sprintf(szPathFile, "%s//%s", szPath, szFile);
FILE* fp = fopen(szFile, "r");
if(PyRun_SimpleFile(fp, szFile) != 0)
{
fclose(fp);
sprintf(stderr, "PyRun_SimpleFile(%s) failed!", saFile);
return -1;
}
fclose(fp);
// 清除Python解析環境
Py_Finalize();
}
2 純Python調用
❸ python中怎麼調用另一個程序
python中怎麼調用另一個程序?
1、自身函數調用:
自身函數的調用時相當方便的,在定義好了函數以後直接按定義的格式調用即可,出現的錯誤為參數數量不匹配,如:TypeError: func() missing 1 required positional argument: 's',意思為func()函數有一個形式參時但是沒有傳入相對應的實參值。
2、通過包或模塊調用:
通過包或模塊調用相對自身函數調用比較復雜,需要提前導入包或模塊,常用的方法為import 或者from import,導入成功的前提是對應的包或模塊在python路徑之下,可以通過sys.path(sys為系統內置模塊可以直接使用import sys導入)來查看python路徑。以導入第三方包文件requests為例。
3、通過類方法調用:
通過類方法的調用需要在調用之前,實例化一個類對象,通過這個類對象來調用類方法,
注意第三個方法為私有方法,不允許類外部訪問。
❹ 如何調用自己寫的python函數
假如我在notepad++里寫了一個函數如下:
[python] view plain
def enroll(name, gender):
print 'name:', name
print 'gender:', gender
將他保存在你的文件夾中,後綴用.py,如ex.py
如何才能在powershell中調用它呢?
打開powershell,然後輸入python
>>>import ex
>>>ex.enroll('a', 'b')
name: a
gender: b
這樣就會有輸出啦!
❺ Python3:怎麼通過遞歸函數
函數的遞歸調用
遞歸問題是一個說簡單也簡單,說難也有點難理解的問題.我想非常有必要對其做一個總結.
首先理解一下遞歸的定義,遞歸就是直接或間接的調用自身.而至於什麼時候要用到遞歸,遞歸和非遞歸又有那些區別?又是一個不太容易掌握的問題,更難的是對於遞歸調用的理解.下面我們就從程序+圖形的角度對遞歸做一個全面的闡述.
我們從常見到的遞歸問題開始:
1 階層函數
#include <iostream>
using namespace std;
int factorial(int n)
{
if (n == 0)
{
return 1;
}
else
{
int result = factorial(n-1);
return n * result;
}
}
int main()
{
int x = factorial(3);
cout << x << endl;
return 0;
}
這是一個遞歸求階層函數的實現。很多朋友只是知道該這么實現的,也清楚它是通過不斷的遞歸調用求出的結果.但他們有些不清楚中間發生了些什麼.下面我們用圖對此做一個清楚的流程:
根據上面這個圖,大家可以很清楚的看出來這個函數的執行流程。我們的階層函數factorial被調用了4次.並且我們可以看出在調用後面的調用中,前面的調用並不退出。他們同時存在內存中。可見這是一件很浪費資源的事情。我們該次的參數是3.如果我們傳遞10000呢。那結果就可想而知了.肯定是溢出了.就用int型來接收結果別說10000,100就會產生溢出.即使不溢出我想那肯定也是見很浪費資源的事情.我們可以做一個粗略的估計:每次函數調用就單變數所需的內存為:兩個int型變數.n和result.在32位機器上佔8B.那麼10000就需要10001次函數調用.共需10001*8/1024 = 78KB.這只是變數所需的內存空間.其它的函數調用時函數入口地址等仍也需要佔用內存空間。可見遞歸調用產生了一個不小的開銷.
2 斐波那契數列
int Fib(int n)
{
if (n <= 1)
{
return n;
}
else
{
return Fib(n-1) + Fib(n-2);
}
}
這個函數遞歸與上面的那個有些不同.每次調用函數都會引起另外兩次的調用.最後將結果逐級返回.
我們可以看出這個遞歸函數同樣在調用後買的函數時,前面的不退出而是在等待後面的結果,最後求出總結果。這就是遞歸.
3
#include <iostream>
using namespace std;
void recursiveFunction1(int num)
{
if (num < 5)
{
cout << num << endl;
recursiveFunction1(num+1);
}
}
void recursiveFunction2(int num)
{
if (num < 5)
{
recursiveFunction2(num+1);
cout << num << endl;
}
}
int main()
{
recursiveFunction1(0);
recursiveFunction2(0);
return 0;
}
運行結果:
0
1
2
3
4
4
3
2
1
0
該程序中有兩個遞歸函數。傳遞同樣的參數,但他們的輸出結果剛好相反。理解這兩個函數的調用過程可以很好的幫助我們理解遞歸:
我想能夠把上面三個函數的遞歸調用過程理解了,你已經把遞歸調用理解的差不多了.並且從上面的遞歸調用中我們可以總結出遞歸的一個規律:他是逐級的調用,而在函數結束的時候是從最後面往前反序的結束.這種方式是很佔用資源,也很費時的。但是有的時候使用遞歸寫出來的程序很容易理解,很易讀.
為什麼使用遞歸:
1 有時候使用遞歸寫出來的程序很容易理解,很易讀.
2 有些問題只有遞歸能夠解決.非遞歸的方法無法實現.如:漢諾塔.
遞歸的條件:
並不是說所有的問題都可以使用遞歸解決,他必須的滿足一定的條件。即有一個出口點.也就是說當滿足一定條件時,程序可以結束,從而完成遞歸調用,否則就陷入了無限的遞歸調用之中了.並且這個條件還要是可達到的.
遞歸有哪些優點:
易讀,容易理解,代碼一般比較短.
遞歸有哪些缺點:
佔用內存資源多,費時,效率低下.
因此在我們寫程序的時候不要輕易的使用遞歸,雖然他有他的優點,但是我們要在易讀性和空間,效率上多做權衡.一般情況下我們還是使用非遞歸的方法解決問題.若一個演算法非遞歸解法非常難於理解。我們使用遞歸也未嘗不可.如:二叉樹的遍歷演算法.非遞歸的演算法很難與理解.而相比遞歸演算法就容易理解很多.
對於遞歸調用的問題,我們在前一段時間寫圖形學程序時,其中有一個四連同填充演算法就是使用遞歸的方法。結果當要填充的圖形稍微大一些時,程序就自動關閉了.這不是一個人的問題,所有人寫出來的都是這個問題.當時我們給與的解釋就是堆棧溢出。就多次遞歸調用佔用太多的內存資源致使堆棧溢出,程序沒有內存資源執行下去,從而被操作系統強制關閉了.這是一個真真切切的例子。所以我們在使用遞歸的時候需要權衡再三.
❻ python語言中可以調用的函數有哪些
Python語言中有碰鋒很多內置函數和標准庫函數可以直接調用,同時還可以自定義函數和調用其他模塊中的函數。以下是一些常用的Python內置函數和標准庫函數: