Python3函數

函數是組織好的,可重復使用的,用來實現單一,或相關功能的代碼段。

函數能提高應用的模塊性,和代碼的重復使用率。

?

定義一個函數

可以定義一個由自己想要功能的函數,以下是簡單規則:

  • l? 函數代碼塊是以def關鍵詞開頭,后接函數標識符名稱和圓括號。
  • l? 任何傳入參數和自變量都必須放在圓括號中,圓括號之間可以用來定義參數。
  • l? 函數的第一行語句可以選擇性的使用文檔字符串—用于存放函數說明。
  • l? 函數內容以冒號起始,并且縮進。
  • l? return[表達式]結束函數,選擇性的返回一個值給調用方。不帶表達式的return相當于None

?

語法:

Python定義函數使用def關鍵字,一般格式如下:

def 函數名(參數列表)函數體

默認情況下,參數值和參數名稱是按函數聲明中的定義順序匹配的。

?

參數傳遞

在python中,類型屬于對象,對象是沒有類型的。

a = [1,2,3]
a = “Runoob”

以上代碼中,[1,2,3]是List類型,“Runoob”是String類型,而變量a是沒有類型的,她僅僅是一個對象的引用(一個指針),可以是指向List類型的對象,也可以是指向String類型對象。

可更改和不可更改對象

在Python中,string,tuples和numbers是不可更改的對象,而list,dict等則是可以修改的對象。

不可變類型:變量賦值后a=5后再賦值a=10,這里實際是生成一個int對象10,再讓a指向它,而5被拋棄,而不是改變了a的值,相當于重新生成了a。

可變類型:變量賦值la = [1,2,3,4]后再賦值la[2] = 5則是將list la的第三個元素更改,本身la沒有動,只是其內部的一部分值被修改了。

?

python函數的參數傳遞:

不可變類型:類似于C++的值傳遞,如整數,字符串,元組。

可變類型:類似于C++引用傳遞,如列表,字典。

?

python中一切都是對象,嚴格意義上我們不能說值傳遞還是引用傳遞,我們應該說,傳不可變對象和傳可變對象。

?

python傳不可變對象實例:

#immutable.py
def ChangeInt(a):a = 10b = 2
ChangeInt(b)
print(b)

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 immutable.py

2

實例中由int對象2,指向它的變量是b,在傳遞給ChangeInt函數時,按傳值的方式復制了變量b,a和b都指向了同一個int對象,在a=10時,則新生成了一個int對象10,并讓a指向了它。

?

傳可變對象實例:

可變對象在函數里修改了參數,那么在調用這個函數的函數里,原始的參數也被改變了。

#mutable.py
def changeme(mylist):mylist.append([1,2,3,4])print("In funciton :",mylist)return mylist = [100,200,300]
changeme(mylist)
print("outside function : ",mylist)

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 mutable.py

In funciton : [100, 200, 300, [1, 2, 3, 4]]

outside function :? [100, 200, 300, [1, 2, 3, 4]]

?

傳入函數的和在末尾添加新內容的對象用的是同一個引用

?

參數

以下是調用函數時可使用的正式參數類型:

  • l? 必需函數
  • l? 關鍵字函數
  • l? 默認函數
  • l? 不定長函數

?

必需參數

必需參數須以正確的順序傳入函數。調用時數量必須和聲明時的一樣。

?

關鍵字參數

關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來確定傳入的參數值。

使用關鍵字允許函數調用時參數順序與聲明時不一致,因為Python解釋器能夠使用參數名稱匹配參數值。

##函數參數使用不需要使用指定順序:def printinfo(name,age):print("name : ",name)print("age  : ",age)return printinfo(age = 20,name = "jack")運行結果:
robot@ubuntu:~/wangqinghe/python/20190828$ python3 seq.py 
name :  jack
age  :  20

默認參數:

調用函數時,如果沒有傳遞參數,則會使用默認參數

#default.py
def printinfo(name,age = 35):print("name :",name)print("age : ",age)return printinfo(age = 20,name = "wangqinghe")
print("-----------------")
printinfo(name = "wangqinge")

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 default.py

name : wangqinghe

age :? 20

-----------------

name : wangqinge

age :? 35

?

不定長參數

你可能需要一個函數能處理比當初聲明時更多的參數,這些參數叫做不定長參數,和上述兩種參數不同,聲明時不會命名。

語法如下:

def functionname([formal_args,],*var_args_tuple):function_suitereturn [expresssion]

加*號的參數會以元組的形式導入,存放所有未命名的變量參數。

#random_length.py
def printinfo(arg1,*vartuple):print("output : ")print(arg1)print(vartuple)printinfo(70,60,50)

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python random_length.py

output :

70

(60, 50)

如果在函數調用時沒有指定參數,它就是一個空元組,我們也可以不想函數傳遞未命名的變量:

#unnaming.py
def printinfo(arg1,*vartuple):print("output : ")print(arg1)for var in vartuple:print(var)return printinfo(10)
printinfo(70,60,50)

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 unnaming.py

output :

10

output :

70

60

50

?

還有一種是參數帶有兩個**,基本語法如下:

def functionname([formal_args,] **var_args_dict):function_suitereturn [expression]

加了兩個星號,參數會以字典的形式導入

#dic_param.py
def printinfo(arg1,**vardict):print("output")print(arg1)print(vardict)printinfo(1,a=2,b=3)

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 dic_param.py

output

1

{'a': 2, 'b': 3}

?

聲明函數時,參數中信號*可以單獨出現,

def f(a,b,*,c)

?????? return a+b+c

?

如果單獨出現星號后的參數,必須以關鍵字傳入

?

?

匿名函數

python使用lambda來創建匿名函數。

所謂匿名,就是不再使用def語句這樣標準的形式定義一個函數。

lambda只是一個表達式,函數體比def簡單的多

lambda的主體是一個表達式,而不是一個代碼塊,僅僅能在lambda表達式中封裝有限的邏輯進去。

lambda函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間里的參數。

雖然lambda函數看起來只能寫一行,卻不等同于C/C++的內聯函數,后者的目的調用小函數時不占用棧空間從而增加運行效率。

?

語法:

lambda函數的語法只包含一個語句。

lambda[arg1[,arg2,…argn]]:expression

#lambda.py
sum = lambda arg1,arg2:arg1+arg2print("a + b : ",sum(10,20))
print("a + b : ",sum(20,20))

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 lambda.py

a + b :? 30

a + b :? 40

?

return語句:

return[表達式]語句用于退出函數,選擇性地向調用方返回一個表達式,不帶參數值地return語句返回None。

#return.py
def sum(arg1,arg2):total = arg1 + arg2print("Inside fun : ",total)return totaltotal = sum(10,20)
print("Outside fun : ",total)

運行結果:

robot@ubuntu:~/wangqinghe/python/20190828$ python3 return.py

Inside fun :? 30

Outside fun :? 30

?

變量作用域

Python中,程序變量并不是在哪個位置都可以訪問地,訪問權限決定于這個變量在哪里賦值地。

變量地作用域決定了在哪一部分可以訪問哪個特定地變量名稱。python地作用域一共4種,分別是:

  • L(local):局部作用域
  • E(E你closing):閉包函數外的函數體中
  • G(Global)全局作用域
  • B(Built-in)內置作用域(內置函數所在模塊地范圍)

以L->E->G->B地規則去找,即:在局部找不到,就去局部外去找,再找不到就去全局找,再去內置找。

g_count = 0 #全局作用域
def outer():o_count = 1  #閉包函數外的函數中def inner(0:i_count = 2 #局部作用域

內置作用域時通過一個叫built地標準模塊實現的,但是這個變量名自身并沒有放入內置作用域中,所有必須導入這個文件才能使用,在python3中,可以是以下的代碼查看到底預定義了哪些變量。

inport builtins
dir(builtins)

Python中只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其他代碼塊(if/elif/else、try/exception、for/while等)是不會引入新的作用域的,也就是說這些語句內定義的變量,外部亦可以訪問

?

全局變量和局部變量

定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。

局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序范圍內訪問,調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11425518.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384841.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

epoll函數

epoll是Linux下多路復用IO接口select/poll的增強版本,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率,因為它會復用文件描述符集合來傳遞結果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的文件描述符集合&#xff0…

epoll事件模型

事件模型 EPOLL事件有兩種模型: Edge Triggered (ET) 邊緣觸發只有數據到來才觸發,不管緩存區中是否還有數據。 Level Triggered (LT) 水平觸發只要有數據都會觸發。 思考如下步驟: 假定我們已經把一個用來從管道中讀取數據的文件描述符(RFD)…

epoll反應堆模型代碼

libevent函數庫核心思想 /*** epoll_loop.c ***/ #include<stdio.h> #include<sys/epoll.h> #include<sys/socket.h> #include<arpa/inet.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #include<string.h> #in…

UDP廣播

廣播是在局域網之間的一對多的通信方式&#xff0c;使用的udp協議 /*** client.c ***/ #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h>#define SERVER_PORT 8000 #define MAXLINE…

UDP組播

多播(組播) 組播組可以是永久的也可以是臨時的。組播組地址中&#xff0c;有一部分由官方分配的&#xff0c;稱為永久組播組。永久組播組保持不變的是它的ip地址&#xff0c;組中的成員構成可以發生變化。永久組播組中成員的數量都可以是任意的&#xff0c;甚至可以為零。那些沒…

Python3數據結構

列表&#xff1a; Python列表是可變的&#xff0c;這是它區別于字符串數組和元組的最重要的特點。列表可以修改&#xff0c;而字符串和元組不能。 以下是Python中列表的描述方法&#xff1a; 方法 描述 list.append(x) 將元素添加到列表結尾 list.extend(L) 通過添加指定列…

sed、awk工具

ed sed意為流編輯器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell腳本和Makefile中作為過濾器使用非常普遍&#xff0c;也就是把前一個程序的輸出引入sed的輸入&#xff0c;經過一系列編輯命令轉換為另一種格式輸出。sed和vi都源于早期UNIX的ed工具&#xff0c;所…

C語言正則表達式

POSIX規定了正則表達式的C語言庫函數&#xff0c;詳見regex(3)。我們已經學習了很多C語言庫函數的用法&#xff0c;讀者應該具備自己看懂man手冊的能力了。本章介紹了正則表達式在grep、sed、awk中的用法&#xff0c;學習要能夠舉一反三&#xff0c;請讀者根據regex(3)自己總結…

makefile通用版本

實際當中程序文件比較大&#xff0c;這時候對文件進行分類&#xff0c;分為頭文件、源文件、目標文件、可執行文件。也就是說通常將文件按照文件類型放在不同的目錄當中&#xff0c;這個時候的Makefile需要統一管理這些文件&#xff0c;將生產的目標文件放在目標目錄下&#xf…

Python3OS文件/方法

Python3OS文件/方法 os模塊提供了非常豐富的方法用來處理文件和目錄。 方法 描述 os.access(path,mode) 檢驗權限模式 os.chdir(path) 改變當前工作目錄 os.chflags(path,flags) 設置路徑的標記為數字標記 os.chmod(path,mode) 更改權限 os.chown(path,uid,gid) 更改…

Python3文件

open()方法 Python open()方法永于打開一個文件&#xff0c;并返回文件對象&#xff0c;并對文件進行處理過程中都需要用到這個方法&#xff0c;如果該文件無法被打開&#xff0c;則拋出OSError 注意&#xff1a;使用open()方法一定要保證關閉文件對象&#xff0c;即調用close(…

Python3輸入輸出

Python兩種輸出值的方式&#xff0c;表達式語句和print()函數。 第三種方式是使用文件對象的write()方法&#xff0c;標準輸出文件可以用sys.stdout的引用。 如果你希望輸出的形式更加多樣&#xff0c;可以使用str.fomat()函數來格式化輸出值。 如果你希望將輸出的值轉化成字符…

動態庫加載順序

1.編譯目標代碼時指定的動態庫搜索路徑&#xff1b; 2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑&#xff1b; 3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑&#xff1b; 4.默認的動態庫搜索路徑/lib&#xff1b; 5.默認的動態庫搜索路徑/usr/lib。 轉載于:https://ww…

Python3正則表達式

正則表達式是一個特殊的字符序列&#xff0c;他能幫助你方便的檢查一個字符串是否與某種模式匹配。re.match函數 re.match嘗試從字符串的起始位置匹配一個模式&#xff0c;如果不是起始位置匹配成功的話&#xff0c;match()就返回一個none。 函數語法&#xff1a; re.match(pat…

C/C++輸入

fgets(str,n,stdin) 從鍵盤輸入一行&#xff0c;替代gets()。讀取到n-1字節時或換行符時終止&#xff0c;如果是文件的話&#xff0c;讀到文件結尾也會停止 getline(cin,str) str的類型必須是string類&#xff0c;它是C特定的字符串類&#xff0c;區別于C的char *數據類型。 ci…

strlen和sizeof的區別

C語言中沒有字符串&#xff0c;用的是字符數組來模擬字符串。 C風格的字符串時字符數組然后在末尾加0表示結尾。 在C語言中有strlen和sizeof兩個函數求字符數組的長度函數&#xff0c;他們倆的區別就是是否把最后的結束標志也加上去。 strlen是不加的&#xff0c;他表示字符串的…

shell編程練習題

求2個數之和計算1-100的和將一目錄下所有的文件的擴展名改為bak編譯當前目錄下的所有.c文件&#xff1a;打印root可以使用可執行文件數&#xff0c;處理結果: roots bins: 2306打印當前sshd的端口和進程id&#xff0c;處理結果: sshd Port&&pid: 22 5412輸出本機創建20…

shell編程題(一)

求2個數之和 #!/bin/bashfunction add {if(( $# < 2 )); thenecho "The arg int correct"elsesum$(($1$2))echo $sumfi }add 1 add 1 2 運行結果&#xff1a; exbotubuntu:~/shareWin/linux/shell$ ./sum.sh 1 2The arg int correct3 $#&#xff1a;相當于C語言…

vimset

vim ~./vimrc set nocompatible "去掉有關vi一致性模式&#xff0c;避免以前版本的bug和局限 set nu! "顯示行號 set guifontLuxi/ Mono/ 9 " 設置字體&#xff0c;字體名稱和字號 filetype on …

shell編程題(二)

計算1-100之和 #!/bin/bashsum0 for i in seq 1 100;do #符號不是單引號 是 1左邊的符號sum$[$i $sum ] done echo $sum #!/bin/bashi0 n1              #定義循環變量 while [ $n -lt 101 ];do  #循環變量小于101 i$(( $i $n))        #累加 n$(( …