关于函数在C语言和Python语言中的表示
在學(xué)習(xí)如何在Python中編寫包和在用C語言編寫包并用Python調(diào)用的任務(wù)時,我發(fā)現(xiàn)自己對于函數(shù)的一些概念和參數(shù)之間的轉(zhuǎn)換和調(diào)用不是十分清晰,因此本文主要記錄的是我對于函數(shù)的知識在Python和C語言中的表現(xiàn)形式的學(xué)習(xí)。
1.1 Python中的函數(shù)
函數(shù)是帶著名字的代碼塊,用于完成具體的工作。執(zhí)行函數(shù)定義的任務(wù)時,只需重復(fù)調(diào)用該函數(shù),就可以完成指定工作。
1.1.1定義一個簡單函數(shù)
Python中用關(guān)鍵字“def”來表示函數(shù)的定義。
def test():print("hello world!")1.1.2調(diào)用該函數(shù)
如同C語言中使用函數(shù)名即可調(diào)用,運行結(jié)果如下所示。
test()1.1.3向函數(shù)傳遞參數(shù)
在上述例子中,假設(shè)我們需要輸出的不是“hello world!”,而是“hello Jones!”或者“hello Andy!”呢?這就需要傳遞參數(shù),在函數(shù)定義的括號內(nèi)加入一個變量,在我們調(diào)用函數(shù)時給這個變量指定一個值(Jones或者Andy),就可以輸出不一樣的結(jié)果。
def test(name):print("hello " + name.title() + "!")test("Jones")1.1.4實參和形參
在上述的函數(shù)定義中,變量“name”是一個形參,它是函數(shù)完成其工作所需的一項信息。而在調(diào)用函數(shù)的“Jones”是一個實參。實參是調(diào)用函數(shù)時傳遞給函數(shù)的信息。簡單來說: 形參是在定義函數(shù)的時候給出的 , 實參是在調(diào)用函數(shù)的時候給出的 。
1.1.5位置實參
在調(diào)用函數(shù)時,Python必須將函數(shù)調(diào)用中的每個實參都關(guān)聯(lián)到函數(shù)定義中的一個形參,我將上一個列子稍作改動,在函數(shù)定義中加入兩個形參分別為“name”和“home”,在調(diào)用函數(shù)時,讓他指出該人屬于哪個國家。
def test(name,home):print("hello " + name.title() + ", welcome "+ home.title() + "!")test("Jones", "China") test("Andy", "Japan")位置實參的順序很重要,務(wù)必在編程時不能將位置弄反
1.1.6關(guān)鍵字實參
關(guān)鍵字實參是傳遞給函數(shù)的形式為名稱和值。在實參中將名稱和值關(guān)聯(lián)起來了,因此傳遞參數(shù)時順序不會混淆,得到的結(jié)果是一樣的。
def test(name,home):print("hello " + name.title() + ", welcome "+ home.title() + "!")test(name = "Jones", home = "China") test(name ="Andy", home = "Japan")1.1.7返回值
在函數(shù)中,可以使用return語句將值返回到調(diào)用函數(shù)的代碼行,我們修改test函數(shù),使其可以返回該人的姓名和家鄉(xiāng)
def test(name,home):inf = name + " form " + homereturn inf.title()inf = test(name = "Jones", home = "China") print(inf)1.1.8返回字典
函數(shù)可返回任何類型的值,包括列表和字典等較為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。修改上述的函數(shù),讓其可以返回一個人的名字和家鄉(xiāng)。
def test(name,home):person = {'name':name, 'home':home}return personinf = test("Jones", "China") print(inf)1.2 Python語言關(guān)于包的編寫和編譯
在了解包的編寫和編譯之前,要能區(qū)分模塊和包的概念。
模塊:
- 模塊就是一組功能的組合;實質(zhì)上一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的后綴
- 想要使用模塊,必須先要將模塊加載進來,可以通過關(guān)鍵字 import 或 from進行加載;需要注意的是模塊和當(dāng)前文件在不同的命名空間中
- 帶入的模塊會重新開辟一塊獨立的名稱空間,定義在這個模塊中的函數(shù)把這個模塊的命名空間當(dāng)做全局命名空間,這樣的話當(dāng)前的空間就和模塊運行的空間分隔了,誰也不影響誰
包:
- 集合了一些文件
- 目錄下的第一個文件是_init__.py
- 導(dǎo)入包,本質(zhì)上是導(dǎo)入了包中的___init__.py文件
包的結(jié)構(gòu)如下:
|--- Project|--- main.py|--- mypackage|--- __init__.py|--- module.py在module.py中輸入如下代碼,這里我用的例子和3.1中的例子是一樣的
def test(name,home):print("hello " + name.title() + ", welcome "+ home.title() + "!")在main.py中輸入代碼
import mypackage.module as fun1 fun1.test("Jones", "China")運行結(jié)果如下:從mypackage文件夾中調(diào)用了module將其命名為fun1,在里面調(diào)用了test函數(shù)
1.3 C語言中的函數(shù)
1.3.1定義一個簡單函數(shù)
在C語言中,我們除了要定義主要的main()函數(shù)外,還有與之相連的子函數(shù),每個函數(shù)只能被定義一次,但一個函數(shù)可以根據(jù)需要被多次聲明和調(diào)用。
函數(shù)的定義包含一個函數(shù)頭和一個函數(shù)塊。函數(shù)頭指定了函數(shù)的名稱、返回值的類型以及參數(shù)的類型和名稱(如果有參數(shù)的話)。函數(shù)塊中的語句明確了該函數(shù)要做的事。函數(shù)定義的一般格式如下所示:
類型用來定義函數(shù)的范圍值類型,可以是void或者任何對象類型,但不能是數(shù)組類型。
名稱就是函數(shù)在調(diào)用時所需輸入的標識。
void test() {printf(hello world!); }1.3.2形參和實參
形參:在函數(shù)定義中出現(xiàn)的參數(shù)可以看做是一個占位符,它沒有數(shù)據(jù),只能等到函數(shù)被調(diào)用時接收傳遞進來的數(shù)據(jù)
實參: 函數(shù)被調(diào)用時給出的參數(shù)包含了實實在在的數(shù)據(jù),會被函數(shù)內(nèi)部的代碼使用
形參和實參的區(qū)別和聯(lián)系:
- 形參變量只有在函數(shù)被調(diào)用時才會分配內(nèi)存,調(diào)用結(jié)束后,立刻釋放內(nèi)存,所以形參變量只有在函數(shù)內(nèi)部有效,不能在函數(shù)外部使用
- 實參可以是常量、變量、表達式、函數(shù)等 ,必須有確定的值
- 實參和形參在數(shù)量上、類型上、順序上必須嚴格一致
- 只能把實參的值傳遞給形參,而不能把形參的值反向地傳遞給實參
在上面這段例子中,m和n是定義的形參,函數(shù)調(diào)用出的a和b是實參
1.3.3返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的代碼所得到的結(jié)果,這個結(jié)果通過 return語句返回
他有如下特點:
- 沒有返回值的函數(shù)為空類型,用“void”表示
- 一旦函數(shù)的返回值類型被定義為 void,就不能再接收它的值了
- return 語句可以有多個,但是每次調(diào)用函數(shù)只能有一個 return 語句被執(zhí)行,之后的語句都不再執(zhí)行
1.3.4函數(shù)聲明和和函數(shù)原型
在編寫程序時,原則上函數(shù)定義要出現(xiàn)在函數(shù)調(diào)用之前,但如果在函數(shù)定義之前就使用函數(shù)的話就需要提前聲明,聲明如下:
dataType functionName( dataType1 param1, dataType2 param2 ... );函數(shù)聲明給出了函數(shù)名、返回值類型、參數(shù)列表(重點是參數(shù)類型)等與該函數(shù)有關(guān)的信息,稱為函數(shù)原型。函數(shù)原型的作用是告訴編譯器與該函數(shù)有關(guān)的信息,讓編譯器知道函數(shù)的存在,以及存在的形式,即使函數(shù)暫時沒有定義,編譯器也知道如何使用它。
int sum(int m, int n)//聲明 int main() {int a = 1; int b = 2;int total;total = sum(a,b);printf("total=%d\n", total); } int sum(int m, int n) {int c;c = m + n;return c; }除了函數(shù),變量也有定義和聲明之分。實際開發(fā)過程中,變量定義需要放在源文件(.c文件)中,變量聲明需要放在頭文件(.h文件)中,在鏈接程序時會將它們對應(yīng)起來
1.3.5 局部變量和全局變量
-
定義在函數(shù)內(nèi)部的變量稱為局部變量,它的作用域僅限于函數(shù)內(nèi)部, 離開該函數(shù)后就是無效的,再使用就會報錯 。
-
在所有函數(shù)外部定義的變量稱為全局變量,它的作用域默認是整個程序,也就是所有的源文件,包括.c 和 .h 文件
-
main函數(shù)中定義的變量是局部變量,可以在不同的函數(shù)中使用相同的變量名
1.4 用C語言編寫Python包并調(diào)用
編寫C語言文件hello.c
#include <stdio.h> int test(int b) {int a;a = b +3;printf("hello world!%d\n",b);return a; }用gcc編譯成dll文件
編輯Python文件test.py
from ctypes import *; h=CDLL('helloc.dll') c = h.test(1) print(c)運行后出現(xiàn)錯誤
總結(jié)
以上是生活随笔為你收集整理的关于函数在C语言和Python语言中的表示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言随机漫步,基于最短路径的随机游走算
- 下一篇: Python比对指定目录下的Excel数