Python函數基礎總結

Python函數
函數就是完成特定功能的一個語句組,這組語句可以作爲一個單位使用,並且給它取一個名字。可以通過函數名在程序的不同地方多次執行(這通常叫函數調用)。函數定義要在函數調用之前,否則函數調用會找不到要調用的函數。函數要寫在python文件的最前面,否則提示NameError: name 'wordCount' is not defined

import os
import sys
import string
a="""hello world python"""
b=wordCount(a)    #提前調用
def wordCount(a):
    chars=len(a)
    words=len(a.split())
    lines=a.count('\n')
    print lines,words,chars
#輸出結果
Traceback (most recent call last):
  File "G:/py/pytest33/test123.py", line 20, in <module>
    wordCount(a)
NameError: name 'wordCount' is not defined

預定義函數可以直接使用

自定義函數用戶自己編寫

函數的定義和調用
定義方法如下:
def 函數名([參數列表]): 
函數名:如果由多個單詞組成,第二個單詞的首字母應該大寫   
調用方法如下:
函數名([參數列表])

實例:
#!/usr/bin/python

def fun():   #定義函數
    sth = raw_input("Please input something: ")
    try:
        if type(int(sth)) == type(1):
            print "%s is a number" %sth
    except ValueError:
        print "%s is not number" %sth
fun()  #調用函數
 

函數名賦值給變量
int2give = int
print int2give('3')


函數參數
形式參數和實際參數定義:
在定義函數時,函數名後面括號中的變量名稱叫做“形式參數”,或者稱爲“形參”
在調用函數時,函數名後面括號中的變量名稱叫做“實際參數”,或者稱爲“實參”
in的用法
if  i  in '0123456789'
if  plus_one in  range(10)

sys.argv跟shell內置變量一樣:

sys.argv[0] 相當於 $0表示腳本本身
sys.argv[1] 相當於 $1 第一個參數
sys.argv[2] 相當於 $2 第二個參數
sys.argv     返回所有參數列表['memory.py', '2', 'uu']
len(sys.argv)   參數的個數

 實例:

#!/usr/bin/python
import sys
import os
def isNum(s):
    for i in s:
        if i in '0123456789':
            pass
        else:
            #print "%s is not a number" %s
            break
    else:
        print s
isNum(sys.argv[1])

os.listdir()
os.listdir:列出目錄下的所有文件和目錄,列表形式,每個列表元素都是字符串

實例:
打印系統的所有PID,要求從/proc讀取。

import os
import sys
import string
def isNum(s):
    for i in s:
        if i in '0123456789':
            pass
        else:                # print "%s is not a number" %s
            break
    else:
        print s
for i in os.listdir('/proc'):
    isNum(i)
或
import os
import sys
import string
def isNum(s):
    if s in '0123456789':
        print s
for i in os.listdir('/proc'):
    isNum(i)


函數默認參數

缺省參數(默認參數)
def fun(x, y=100):
print x,y
默認參數只能寫在最右邊,否則會報錯 def fun(y=100,x): 這個報錯
fun(1,2)
fun(x=1,y=2) 傳參的另一種方式,不過比較囉嗦很少用
fun(1)


函數變量
局部變量和全局變量:
Python中的任何變量都有特定的作用域
在函數中定義的變量一般只能在該函數內部使用,這些只能在程序的特定部分使用的變量我們稱之爲局部變量
在一個文件頂部定義的變量可以供文件中的任何函數調用,這些可以爲整個程序所使用的變量稱爲全局變量

global語句
global 變量名
強制聲明爲全局變量

全局變量在函數外聲明,在函數裏面global引用全局變量
在函數裏面global聲明全局變量,在函數外可以引用這個全局變量

import sys
import os
import string
x = 100

def fun():
    global x
    x += 1
    print x
fun()
print x

globals函數打印當前環境的所有全局變量,返回字典;locals函數打印當前環境的所有局部變量,返回字典

import sys
import os
import string
x = 100
def fun():
    x = 1
    y = 1
    print locals()
fun()
print globals() 


函數返回值

函數被調用後會返回一個指定的值
函數調用後默認返回None
return 返回值

返回值可以是任意類型
return執行後,函數終止


多類型傳值

元組傳參
實參前面加一個* 傳入元組,元組要放在右邊
def fun(x,y,z)
    return x+y+z
t1=(2,3,4)
t=(1,2)
fun(*t1)
fun(*(1,2,3))
fun(1,*t)

 

字典傳參
字典的key的名字要跟形參的名字一樣,x,y,z否則會報錯
def fun(x,y,z)
return x+y+z
dic = {'x':1,'y':3,'z':5}
fun(**dic)

 

冗餘參數
向函數傳元組和字典
處理多餘實參
def fun(x,y,*args,**kwargs)

fun(1,2,'a',[2,4],y=2,z=3)
fun(1,2,'a',[2,4],*t,y=2,**{'u':12})

函數遞歸調用

計算階層
遞歸調用
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)

print factorial(5)

注意事項
必須有最後的默認結果: if n == 0
遞歸參數必須向默認結果收斂的: factorial(n-1)

 打印目錄下所有文件:

import os
import sys
import string
def print_files(path):
    # isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join
    # print isdir,isfile,join
    lsdir = os.listdir(path)
    dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]
    files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))]
    if dirs:
        for d in dirs:
            print_files(os.path.join(path, d))
    if files:
        for f in files:
            print os.path.join(path, f)
print_files(sys.argv[1])
#把函數名賦值給變量

 

匿名函數
lambda函數是一種快速定義單行的最小函數,可以用在任何需要函數的地方。
lambda語句中,冒號前是參數,可以有多個,逗號隔開,冒號右邊是返回值。
lambda語句構建的其實是一個函數對象

def fun(x, y):
return x*y
fun(2, 3)
r = lambda x,y: x*y
r(2, 3)

def add(x, y):
return x + y
sum = reduce(add, [1, 2, 3])

reduce(lambda x,y:x+y, range(1,4))

 匿名函數優點:

使用python寫一些腳本時,使用lambda可以省去定義函數的過程,讓代碼更加精簡。
對於一些抽象的,不會被別的地方再重複使用的函數,有時候函數起個名字也是個難題,使用lambda不需要考慮命名的問題。
使用lambda在某些時候讓代碼更容易理解。

 

內置函數

所有內置函數和內置類都在__builtin__模塊(__builtin__前後雙下劃線)
內置函數和類:

絕對值,最大最小值

abs()
max()
max('12345','789') #字符串'789‘比字符串’12345‘大,字符串是從左到到右開始比較的,'7’比‘1'大,所以輸出’789'
min()

len()  #參數是一個對象(字符串,元組,字典)不能是整數
divmod()  #參數是兩個數字,返回商和餘數
pow() #乘方
round() #給出小數點的精度,沒有第二個參數直接四捨五入

常用函數:
callable() #可被調用的,例如類,函數
type()

isinstance() #isinstance(s,(int,tuple,str)),s是一個對象,第二個參數是元組,判斷s這個對象的數據類型在不在第二個參數元組裏,是返回true ,否返回false

實例:

class A(object):
    pass
a=A()
print isinstance(a,A)

cmp() #如果是字符串,則逐個字符比較,一旦有字符比較出來就不往下比較

range()
xrange()

類型轉換函數
int()  #參數如果是字符串,只能是純數字字符串,不能帶小數
long()  #參數如果是字符串,只能是純數字字符串,不能帶小數
float()   #參數如果是字符串,只能是純數字字符串,不能帶小數
complex()
str()
list()
tuple()
hex()
oct()
chr()  #輸入0<x<256 返回ascii字符
ord()  #輸入ascii的單個字母,返回數字
eval()  #將有效表達式求值,其實就是去掉字符串

字符串處理函數

下面函數實例化一個string對象或聲明一個string變量
str.capitalize()   #將字符串裏的第一個字符大寫並返回
str.replace()   #replace(old,new,count)
str.split()   #字符串切成列表 不指定分隔符,那麼默認以空格,tab鍵,換行符作爲分隔 split('.',1) 點爲分隔,切1次
str.join()     #列表連接爲字符串 ''.join([str(i)  for i in range(10)])  join會在被插入字符中間插入 ','.join([str(i)  for i in range(10)]) 逗號變爲的分隔符
s= 'sdf'
s.join('22')
'2sdf2'
靜態函數,不需要實例化一個string對象
string模塊   

import  string
string.capitalize('hello')
string.replace('wecan','a','t')
string.split('we,w,e',',')
string.join('ww','tt')
序列處理函數
len()
max()
min()
filter()   #filter(none/func, seq) 如果不是none,func這個函數依次對sequence裏的元素做處理,最後返回一個list, tuple, or string。
zip() #合併多個列表、元組

l1=[1,2,3]
l2=['a','b','c']

zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
dict(zip(l1,l2)) #從中創建字典

l1=(1,2,3)
l2=['a','b','c']
print zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]

map()   map(none,l1,l2,l3)跟zip函數一樣,元素最少的那個序列以none補充,map(func,seq)對序列的每個元素都放進去函數裏去處理,並且函數參數要與序列元素個數相同
與filter(func, seq)類似,但是filter(func, seq)只能處理單個序列
reduce() 函數,  reduce(func,seq)

使用lambda代入序列處理函數
filter(lambda x:x %2 ==0, range(10))
     [0, 2, 4, 6, 8]
map(lambda x,y:x*y, range(5),range(5))
     [0, 1, 4, 9, 16]
reduce(lambda x,y:x+y, range(1,101))
     5050
列表表達式/列表重寫
[i*2+10 for i in range(10)]
[i for i in range(10) if i%3 == 0]

函數的參數不能是連字符

def f(x, **kwargs):
print(x)
print(kwargs)

f(1,a=10,b-b=20) #報錯 涉及變量的命名
f(1,a=10,b_b=20) #正確

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章