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