1. 程式人生 > >Python中的函數與變量

Python中的函數與變量

給他 %s pytho help 常用 body 什麽 保存 div

本節內容


函數的定義方法

函數功能

函數的返回值

函數的形參與實參

全局變量與局部變量

遞歸

函數的作用域

匿名函數lambda

函數式編程

常用內置函數

其他內置函數


函數

函數的定義方法

函數就相當於一個文件,這個文件有他特定的功能可以減少代碼的重寫

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

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

函數的功能

1.代碼重用

2.保持一致性,易維護

3.可擴展性

函數的返回值

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

2.返回值數 = 1 >>>>> 返回object 字典的對象

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

函數的參數

1.形參:不占內存,用完釋放

2..實參

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,decodeutf-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 : 查看參數是那種類型

Python中的函數與變量