1. 程式人生 > >python全棧開發-Day12 三元表達式、函數遞歸、匿名函數、內置函數

python全棧開發-Day12 三元表達式、函數遞歸、匿名函數、內置函數

lai imp padding imu eof inpu 對比 bject func

一、 三元表達式

一 、三元表達式

  僅應用於:

    1、條件成立返回,一個值

    2、條件不成立返回 ,一個值

def max2(x,y):    #普通函數定義
    if x > y:
        return x
    else:
        return y
res=max2(10,11)
print(res)
# res=x if x > y else y     #三元表達式
# print(res)

#def max2(x,y):       
    #return x if x > y else y          #代碼簡潔,方便
#print(max2(10,11))

二、 遞歸

一 、遞歸調用的定義

  遞歸調用是函數嵌套調用的一種特殊形式,函數在調用時,直接或間接調用了自身,就是遞歸調用

#直接調用
def foo():
    print(from foo)
    foo()
#foo()
#間接調用
def bar():
    print(from bar)
    foo()

def foo():
    print(from foo)
    bar()
#foo()

二、 遞歸分為兩個階段:遞推,回溯

  1、回溯

  (註意:一定要在滿足某種條件結束回溯,否則就會無限遞歸)

#圖解。。。
# salary(5)=salary(4)+300

# salary(4)=salary(3)+300

# salary(3)=salary(2)+300

# salary(2)=salary(1)+300

# salary(1)=100
#
# salary(n)=salary(n-1)+300     n>1
# salary(1) =100                n=1

def salary(n):
    if n == 1:
        return 100
    return salary(n-1)+300

print(salary(5))

技術分享圖片

三 、python中的遞歸效率低且沒有尾遞歸優化

  總結遞歸的使用:

  1、 必須有一個明確的結束條件

  2、 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少

  3、 遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,

棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出

四 、可以修改遞歸最大深度

import sys
sys.getrecursionlimit()         #系統默認的可遞歸次數1000
sys.setrecursionlimit(2000)  #   調整可遞歸為2000

三、 匿名函數

一 、什麽是匿名函數?

#匿名就是沒有名字
def func(x,y,z=1):
    return x+y+z

#匿名
lambda x,y,z=1:x+y+z
 #與函數有相同的作用域,但是匿名意味著引用計數為0,使用一次就釋放,除非讓其有名字
func=lambda x,y,z=1:x+y+z 
func(1,2,3)
#讓其有名字就沒有意義

二、匿名的特點:

  1、匿名的目的就是沒有名字,給匿名函數賦給一個名字是沒有意義的

  2、匿名函數的參數規則、作用域關系與有名函數是一樣

  3、匿名函數的函數體通常應該是一個表達式,該表達式必須要有一個返回值

三 、有名字的函數與匿名函數的對比

有名函數:循環使用,保存了名字,通過名字就可以重復引用函數功能

匿名函數:一次性使用,隨時隨時定義 應用:max,min,sorted,map,filter

salaries={
    egon:3000,
    alex:100000000,
    wupeiqi:10000,
    yuanhao:2000
}
# 求工資最高的那個人是誰
#print(max(salaries,key=lambda x:salaries[x])) #‘egon‘ 3000

# 求工資最低的那個人是誰
# print(min(salaries,key=lambda x:salaries[x]))

四、內置模塊

註意:內置函數id()可以返回一個對象的身份,返回值為整數。

這個整數通常對應與該對象在內存中的位置,但這與python的具體實現有關,不應該作為對身份的定義,即不夠精準,最精準的還是以內存地址為準。

is運算符用於比較兩個對象的身份,等號比較兩個對象的值,內置函數type()則返回一個對象的類型

#更多內置函數:https://docs.python.org/3/library/functions.html?highlight=built#ascii

技術分享圖片

二、內置函數詳情

1、abs(x)

功能:取數的絕對值

1 2 >>> abs(-1) #取-1的絕對值 1

2、all(iterable)

功能:如果這個可叠代的元素都為真,則返回真(非0的就為真,負數也是為真)

1 2 3 4 >>> all([0,9,-3]) #有0,說明為假 False >>> all([-1,5,6]) #負數也是為真 True

3、any(iterable)

功能:可叠代的元素中,有一個為真,則返回真,沒有真或空列表返回假。

1 2 3 4 >>> any([0,0,2]) #有一個為真,則為真 True >>> any([]) #空列表為假 False

4、ascii(object)

功能:把內存對象變成一個可打印的字符串格式

1 2 >>> a = ascii([1,2,3,4]) >>> print(type(a),[a])

5、bin(x)

功能:把一個整數轉換成二進制

1 2 3 4 >>> bin(300) #把300轉換成二進制 ‘0b100101100‘ >>> bin(1) ‘0b1‘

6、bool([x])

功能:返回一個布爾值,空列表為假,不為空為真

1 2 3 4 5 6 >>> bool([]) #空列表 False >>> bool([1,2]) #不為空列表 True >>> bool([0]) True

7、bytes([source[, encoding[, errors]]])

功能:把字符串轉換成字節

1 2 3 4 5 6 7 8 9 >>> b = bytes("abcd",encoding="utf-8") #聲明字節 >>> b b‘abcd‘ >>> b[0] #訪問到‘a‘字符對應的ASCII值 97 >>> b[0]=100 #不可以修改裏面的值,不然會報錯 Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: ‘bytes‘ object does not support item assignment

9、callable(object)

功能:判斷一個對象是否可以被調用,只有在後面有括號的,表示可以調用,比如:函數,類。

1 2 3 4 5 >>> callable([]) #列表後面不加括號 False >>> def sayhi():pass #定義一個函數 >>> callable(sayhi) #函數調用,後面需要加括號 True

10、chr(i)

功能:通過ascii的值(必須是數字),找到對應的字符

1 2 >>> chr(97) ‘a‘

11、ord(c)

功能:根據字符(必須ascii的字符),找到對應的ascii值

1 2 >>> ord(‘a‘) 97

13、dict(**kwarg)、dict(mapping, **kwarg)、dict(iterable, **kwarg)

功能:返回一個字典

1 2 3 4 5 6 7 8 >>> dict() #定義一個字典 {} >>> dict(name=‘qianduoduo‘,age=18) #傳入非固定關鍵字參數 {‘name‘: ‘qianduoduo‘, ‘age‘: 18} >>> dict([(‘name‘,‘qianduoduo‘),(‘age‘,18)]) #傳入一個列表 {‘name‘: ‘zhangqigao‘, ‘age‘: 18} >>> dict([[‘name‘,‘qianduoduo‘],[‘age‘,18]]) #傳入一個列表 {‘name‘: ‘qianduoduo‘, ‘age‘: 18}

17、dir([object])

功能:看一個對象有哪些方法

1 2 3 4 5 6 7 8 >>> name = [] >>> dir(name) #顯示name下的所有的方法 [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__gt__‘, ‘__hash__‘, ‘__iadd__‘, ‘__imul__‘, ‘__init__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__reversed__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__setitem__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘append‘, ‘clear‘, ‘copy‘, ‘count‘, ‘extend‘, ‘index‘, ‘insert‘, ‘pop‘, ‘remove‘, ‘reverse‘, ‘sort‘]

18、divmod(a,b)

功能:地板除,獲得一個元組,元組第一個元素是商,第二個元素是余數。

1 2 >>> divmod(5,2) (2, 1) #2是商,1是余數

19、enumerate(iterable,start=0) 購物車的列表用到了,

功能:遍歷一個可叠代對象,獲取索引和對應的元素的

1 2 3 4 5 >>> seasons = [‘Spring‘, ‘Summer‘, ‘Fall‘, ‘Winter‘] >>> list(enumerate(seasons)) [(0, ‘Spring‘), (1, ‘Summer‘), (2, ‘Fall‘), (3, ‘Winter‘)] >>> list(enumerate(seasons, start=1)) [(1, ‘Spring‘), (2, ‘Summer‘), (3, ‘Fall‘), (4, ‘Winter‘)]

20、eval(expression, globals=None, locals=None)

功能:把字典類型的字符串變成字典,把一個整數類型的字符變成int類型,或者加減乘除這種簡單轉換成表達式。

1 2 3 4 >>> eval(‘1‘) #字符類型轉換成int類型 1 >>> eval("1+3/2*6") #字符串轉換為表達式 10.0

22、filter(function, iterable)

功能:通過function過濾條件,去獲取iterable中你想要的數據。

1 2 3 4 5 6 7 8 9 >>> res = filter(lambda n:n>5,range(10)) >>> res #得到一個叠代器 <filter object at 0x0000000003093BE0> >>> for i in res: print(i) 6 7 8 9

23、map(function, iterable)

功能:對傳入的每一個值進行處理,處理完了再返回,再把原來的結果覆蓋掉。

1 2 3 4 5 6 7 8 9 10 >>> res = map(lambda n:n*2,range(5)) #n*2是處理方式 >>> res <map object at 0x00000000031B4BE0> >>> for i in res: print(i) 0 2 4 6 8

未完待續!

python全棧開發-Day12 三元表達式、函數遞歸、匿名函數、內置函數