Python中的函數與變量

本節內容


函數的定義方法

函數功能

函數的返回值

函數的形參與實參

全局變量與局部變量

遞歸

函數的做用域

匿名函數lambda

函數式編程

經常使用內置函數

其餘內置函數


函數

函數的定義方法

函數就至關於一個文件,這個文件有他特定的功能能夠減小代碼的重寫html

1 def 函數名 (參數):
2     "函數的註釋"
3     函數體
4     return x

若命名了相同的函數名,則調用函數時下面的函數會覆蓋掉上面的函數python

 

函數的功能

1.代碼重用編程

2.保持一致性,易維護數組

3.可擴展性數據結構

 

函數的返回值

1.返回值數值 = 0 >>>>>返回Noneapp

2.返回值數 = 1 >>>>> 返回object 字典的對象函數式編程

3.返回值數 > 1  >>>>> 返回元組函數

 

函數的參數

1.形參:不佔內存,用完釋放優化

2..實參ui

3.位置參數和關鍵字參數

位置參數:按順序一一對應

關鍵字參數:可指定參數對應,可無序

位置參數與關鍵字參數混合使用:位置參數應在關鍵字參數左邊 ,不然報錯

4.默認參數

若函數定義時指定了默認參數,則函數調用時,可不寫參數就用默認參數,寫了參數就修改默認參數

5.參數組:*列表 **字典

使用參數組的好處:函數將來擴展功能需傳多個值或者你不肯定傳幾個值

 

全局變量與局部變量

全局變量爲定義在函數外部的變量

局部變量爲定義在函數內部的變量

因此書寫時全局變量大寫,局部變量小寫清晰方便讓他人讀懂

golobal 指定全局變量

nonlocal 指定上一級變量

總結:

有聲明局部變量:使用局部變量

無聲明局部變量:

無global 優先讀取局部變量,只讀全局變量不對全局變量賦值
有global 變量本質上就是全局變量可讀可賦值

 

 當使用global定義變量時,global應上提,防止報錯

a = ['c','d']
def test():
    a = ''
    global a      #報錯!由於global在下面不知道去哪找a因此global應該上提                
    print(a)    

 

 遞歸特性

遞歸就是函數內部不斷的調用本身

1.必須有一個明確的結束條件,不然死循環

2.每次進入更深一層遞歸,問題規模相應比上次少

3.遞歸的效率不高,層次過大會致使棧溢出

寸到

 

函數的做用域

程序是從上到下一直讀下去的,其實當程序讀到def ...定義函數部分時,只是把函數部分所有轉換成字符串存到內存當中,不讀取,直到調用函數時纔讀取。

 

 

 

 

 匿名函數lambda

匿名函數只使用於定義簡單邏輯的函數

def test(x):
    return x+1



#使用匿名函數:
lambda x:x+1
#若匿名函數接收多個參數,返回多個值則需加括號

lambda x,y,z:(x+1,y+1,z+1)

 

匿名函數不獨立使用,若真要獨立使用就得給他起個名字才能運行

fuc = lambda x:x+1
fuc(10)

 

函數式編程

1.不可變數據

2.第一類對象:函數即爲變量

3.尾調用優化(尾遞歸)

 

例一:不可變,不用變量保存狀態,不修改變量

#非函數式:
a = 1
def test():
    global a
    a += 1
    return a
test()
print(a)
#函數式編程
a = 1
def test(n):
   return n+1 
print(test(a)
print(a)

 

高階函數有一下兩個特性,有任何一即爲高階函數

#1.函數的傳入參數是一個函數名
def foo(n)
    print(n)
    
def bar(name)
    print('my name is %s' %name)

foo(bar('echo'))    #先運行bar()無返回值
#2.返回值中包含函數
def bar ():
    print('from bar')

def foo():
    print('from bar ')
    return bar              #返回bar的內存地址

n = foo()
n()         #調用bar函數

 

 

經常使用函數 ------轉自林海峯

1.map函數的起源及其用法

map函數就是在原有的數據上處理下數據

array=[1,3,4,71,2]

ret=[]
for i in array:
    ret.append(i**2)
print(ret)

#若是咱們有一萬個列表,那麼你只能把上面的邏輯定義成函數
def map_test(array):
    ret=[]
    for i in array:
        ret.append(i**2)
    return ret

print(map_test(array))

#若是咱們的需求變了,不是把列表中每一個元素都平方,還有加1,減一,那麼能夠這樣
def add_num(x):
    return x+1
def map_test(func,array):
    ret=[]
    for i in array:
        ret.append(func(i))
    return ret

print(map_test(add_num,array))
#可使用匿名函數
print(map_test(lambda x:x-1,array))


#上面就是map函數的功能,map獲得的結果是可迭代對象
print(map(lambda x:x-1,range(5)))

 

2.filter函數是過濾,默認保留指定參數

#電影院彙集了一羣看電影bb的傻逼,讓咱們找出他們
movie_people=['alex','wupeiqi','yuanhao','sb_alex','sb_wupeiqi','sb_yuanhao']

def tell_sb(x):
    return x.startswith('sb')


def filter_test(func,array):
    ret=[]
    for i in array:
        if func(i):
            ret.append(i)
    return ret

print(filter_test(tell_sb,movie_people))


#函數filter,返回可迭代對象
print(filter(lambda x:x.startswith('sb'),movie_people))

 

 3.reduce函數:壓縮數據爲一個因此reduce

reduce在py3中要引用模塊

from functools import reduce

from functools import reduce
#合併,得一個合併的結果
array_test=[1,2,3,4,5,6,7]
array=range(100)

#報錯啊,res沒有指定初始值
def reduce_test(func,array):
    l=list(array)
    for i in l:
        res=func(res,i)
    return res

# print(reduce_test(lambda x,y:x+y,array))

#能夠從列表左邊彈出第一個值
def reduce_test(func,array):
    l=list(array)
    res=l.pop(0)
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))

#咱們應該支持用戶本身傳入初始值
def reduce_test(func,array,init=None):
    l=list(array)
    if init is None:
        res=l.pop(0)
    else:
        res=init
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))
print(reduce_test(lambda x,y:x+y,array,50))

map ,filtet,reduce 總結

固然了,map,filter,reduce,能夠處理全部數據類型

name_dic=[
    {'name':'alex','age':1000},
    {'name':'wupeiqi','age':10000},
    {'name':'yuanhao','age':9000},
    {'name':'linhaifeng','age':18},
]
#利用filter過濾掉千年王八,萬年龜,還有一個九千歲
def func(x):
    age_list=[1000,10000,9000]
    return x['age'] not in age_list


res=filter(func,name_dic)
for i in res:
    print(i)

res=filter(lambda x:x['age'] == 18,name_dic)
for i in res:
    print(i)


#reduce用來計算1到100的和
from functools import reduce
print(reduce(lambda x,y:x+y,range(100),100))
print(reduce(lambda x,y:x+y,range(1,101)))

#用map來處理字符串列表啊,把列表中全部人都變成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao']

res=map(lambda x:x+'_sb',name)
for i in res:
    print(i)

 

其餘內置函數

詳細請查看http://www.runoob.com/python/python-built-in-functions.html

1.abs()   取絕對值

2.布爾運算

bool() 將括號內元素轉換爲布爾值

all()

將括號內元素所有進行布爾運算,全真才爲真
any() 將括號內元素所有進行布爾運算,一個真則真

 

3.進制轉換

bin() 轉爲二進制
hex() 轉爲16進制
oct() 轉爲8進制

4.bytes()查看多少字節,可指定編碼解碼,也可不指定

name = '您好‘
print(bytes(name ,encoding = 'utf-8',decode'utf-8))

 

5.ASCII碼處理

chr() 打印ASCII碼
ord() 與chr()相反,解asci碼

 

6.數字處理

divmod() 傳入兩個參數,取商與餘
pow() 可穿三個參數,最少傳2個,若傳pow(3,3,2)則求3的3次方後對2取餘
round() 四捨五入

 

7.查看函數使用

dir() 查看參數的屬性
help 查看函數的使用

8.eval

  第一個功能就是把字符串中的數據結構提取出來

  第二個功能就是把字符串中表達式計算

 

9.hash:可hash的數據類型就是不可變數據類型

 

10.isinstance:輸入兩個參數,一個是變量,一個 是指定數據類型,查看是否變量是否爲指定類型

 

11.globals()和locals()  聯合print()打印本地與局部

 

12.max()與min()

for循環依次去出元素比較,若開頭已比較出結果則後面不比較(比較字符串時或其餘)

注意不可有多種數據類型

其返回的是內存地址

12.1.max函數處理的是可迭代對象,至關於一個for循環取出每一個元素進行比較。不一樣數據類型間不能進行比較

12.2.每一個元素進行比較,若字符串則從第一個字符開始,若第一個位置分出大小,則後面不比較

#終極玩法
people= [
{'name ' ='haha', 'age' = 100}
{'name' = 'echo' , 'age' = 500}
]

print(max(people,key=lambd dic:dic['age']))

key 表明告訴max經過什麼方法去比較出每一個對象的大小

 

 

13.zip()  拉鍊:輸入兩個參數,這兩個參數爲序列而後一一對應轉爲元組,有多不顯示不報錯,返回內存地址要用list查看

 

14.reverse 反轉 ,能夠反轉列表

 

15.slice 切片:指定切片

l = 'hello'
s1 = slice(1,4,2)
print(l(s1))
print(s1.start)
print(s1.end)
print(s1.step)    #查看步長

 

16.sorted 排序:本質比較大小,不一樣類型不能排序

 

17 sum :求和

 

18.type : 查看參數是那種類型

相關文章
相關標籤/搜索