Python基礎之(內置函數、匿名函數、遞歸)

1、內置函數python

1.一、做用域相關數組

locals()  #以字典的類型返回當前位置的所有局部變量。
globals() #以字典的類型返回所有全局變量。

1.二、迭代器生成器相關函數

range()  #可建立一個整數對象,通常用在 for 循環中
next() #內部實際使用了__next__方法,返回迭代器的下一個項目。
iter()  #用來生成迭代器(將一個可迭代對象,生成迭代器)同於:__iter__()

1.三、基礎數據類型相關編碼

bool()   #用於將給定參數轉換爲布爾類型,若是沒有參數,返回 False
int()   #用於將一個字符串或數字轉換爲整型。
float()  #用於將整數和字符串轉換成浮點數。
list()   #將一個可迭代對象轉化成列表
tuple()  #將一個可迭代對象轉化成元祖
dict()  #建立一個字典
set()  #建立一個集合
str()  #轉化成字符串

1.四、轉換及運算相關code

bin() #將十進制轉換成二進制並返回。
oct()#將十進制轉化成八進制字符串並返回
hex()#將十進制轉化成十六進制字符串並返回。
print(bin(10),type(bin(10)))  # 0b1010 <class 'str'>
print(oct(10),type(oct(10)))  # 0o12 <class 'str'>
print(hex(10),type(hex(10)))  # 0xa <class 'str'>

abs()#返回數字的絕對值。
divmod()#計算除數與被除數的結果,返回一個包含商和餘數的元組(a // b, a % b)。
round()#保留浮點數的小數位數,默認保留整數。
pow()#求x**y次冪。(三個參數爲x**y的結果對z取餘)
print(abs(-5))  # 5
print(divmod(7,2))  # (3, 1)
print(round(7/3,2))  # 2.33
print(round(7/3))  # 2
print(round(3.32567,3))  # 3.326
print(pow(2,3))  # 兩個參數爲2**3次冪  結果8
print(pow(2,3,3))  # 三個參數爲2**3次冪,對3取餘。 餘數2


sum()#對可迭代對象進行求和計算(可設置初始值)。
min()#返回可迭代對象的最小值(可加key,key爲函數名,經過函數的規則,返回最小值)
max()#返回可迭代對象的最大值(可加key,key爲函數名,經過函數的規則,返回最大值)
print(sum([1,2,3]))  #6
print(sum((1,2,3),100))  #106
print(min([1,2,3]))  # 返回此序列最小值1
ret = min([1,2,-5,],key=abs)  # 按照絕對值的大小,返回此序列最小值
print(ret) #1
dic = {'a':3,'b':2,'c':1}
print(min(dic,key=lambda x:dic[x]))# x爲dic的key,lambda的返回值(即dic的值進行比較)返回最小的值對應的鍵
print(max([1,2,3]))  # 返回此序列最大值3
ret = max([1,2,-5,],key=abs)  # 按照絕對值的大小,返回此序列最大值-5
print(ret)
dic = {'a':3,'b':2,'c':1}
print(max(dic,key=lambda x:dic[x]))# x爲dic的key,lambda的返回值(即dic的值進行比較)返回最大的值對應的鍵


reversed() #將一個序列翻轉,並返回此翻轉序列的迭代器。
slice() #構造一個切片對象,用於列表的切片
ite = reversed(['a',2,3,'c',4,2])
for i in ite:
    print(i)  #2 4 c 3 2 a

li = ['a','b','c','d','e','f','g']
sli_obj = slice(3)
print(li[sli_obj]) #['a', 'b', 'c']
sli_obj = slice(0,7,2)
print(li[sli_obj])  #['a', 'c', 'e', 'g'],開始、結束、步長

format() #與具體數據相關,用於計算各類小數,精算等
bytes()#用於不一樣編碼之間的轉化。
s = '你好'
bs = s.encode('utf-8')
print(bs)  #b'\xe4\xbd\xa0\xe5\xa5\xbd'
bs = bytes(s,encoding='utf-8')
print(bs)  #b'\xe4\xbd\xa0\xe5\xa5\xbd'
s1 = bs.decode('utf-8')
print(s1) #你好

bytearry()#返回一個新字節數組。這個數組裏的元素是可變的,而且每一個元素的值範圍: 0 <= x < 256
ret = bytearray('jump',encoding='utf-8')
print(id(ret))
print(ret)
print(ret[0])
ret[0] = 65
print(ret)
print(id(ret))

memoryview()
ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret))  #6
print(ret)   #<memory at 0x008A0BF8>
print(bytes(ret[:3]).decode('utf-8'))  #你
print(bytes(ret[3:]).decode('utf-8'))   #好

ord()#輸入字符找該字符編碼的位置
chr()#輸入位置數字找出其對應的字符
ascii()#是ascii碼中的返回該值,不是就返回/u...
print(ord('a'))  #97
print(ord('中'))  #20013
#chr 輸入位置數字找出其對應的字符
print(chr(97))  #a  
print(chr(20013))  #中
#是ascii碼中的返回該值,不是就返回/u...
print(ascii('a')) #"a"
print(ascii('中')) #'\u4e2d'

repr()#返回一個對象的string形式

1.五、經常使用相關orm

id() #用於獲取對象的內存地址
hash#獲取一個對象(可哈希對象:int,str,Bool,tuple)的哈希值
print() #輸出
input() #輸入
open() #打開文件
type()  #對象類型
len#返回一個對象中元素的個數(長度)
dir() #查看一個對象的方法
help()  #幫助方法

isinstance() #來判斷一個對象是不是一個已知的類型,相似 type()
a=123
isinstance (a,int) #True

__import__ #用於動態加載類和函數
__import__('a')        # 導入 a.py 模塊

1.六、其餘相關對象

eval()#執行字符串類型的代碼,並返回最終結果
exec()#執行字符串類型的代碼。
compile()#將字符串類型的代碼編譯。代碼對象可以經過exec語句來執行或者eval()進行求值。
eval('2 + 2')  # 4
s = '''
for i in [1,2,3]:
    print(i)
'''
exec(s)  #1 2 3

complex()#函數用於建立一個值爲 real + imag * j 的複數或者轉化一個字符串或數爲複數。若是第一個參數爲字符串,則不須要指定第二個參數。
filter()#過濾
def func(x):return x%2 == 0
ret = filter(func,[1,2,3,4,5,6,7])
print(ret)  #<filter object at 0x006327B0>
for i in ret:
    print(i)  #2,4,6

zip() #拉鍊方法
#用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,而後返回由這些元組組成的列表。若是各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同
l1 = [1,2,3,]
l2 = ['a','b','c',5]
l3 = ('*','**',(1,2,3))
for i in zip(l1,l2,l3):
    print(i)   #(1, 'a', '*')  (2, 'b', '**')  (3, 'c', (1, 2, 3))
map()#會根據提供的函數對指定序列作映射。
def square(x) :            # 計算平方數     
    return x ** 2
map(square, [1,2,3,4,5])   # 計算列表各個元素的平方 [1, 4, 9, 16, 25]

sorted()#對全部可迭代的對象進行排序操做
L = [('a', 1), ('c', 3), ('d', 4),('b', 2), ]
sorted(L, key=lambda x:x[1])               # 利用key[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda s: s[2])            # 按年齡排序[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
 sorted(students, key=lambda s: s[2], reverse=True)    # 按降序[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

frozenset()#返回一個凍結的集合,凍結後集合不能再添加或刪除任何元素。
enumerate()#枚舉,返回一個枚舉對象 (可迭代對象加序號)
li = ['a','b','c','d','e']
for i in enumerate(li):
    print(i)
for index,name in enumerate(li,1): #索引默認從0開始,可改爲1開始
    print(index,name)

all()#可迭代對象中,全都是True纔是True
any()#可迭代對象中,有一個True 就是True
callable() 檢查是不是函數  返回True、False
def add(x,y):return x+y
callable(add)             # 返回 True
a=123
callable(a)  #返回False

1.七、類相關blog

object() #是Python中全部類的基類,若是定義一個類時沒有指定繼承哪一個類,則默認繼承object類。

staticmethod()#靜態方法
classmethod()#是一個裝飾器函數,用來標示一個方法爲類方法
property()#靜態屬性
super() #用於調用父類(超類)的一個方法
issubclass() #方法用於判斷參數 class 是不是類型參數 classinfo 的子類。若是 class 是 classinfo 的子類返回 True,不然返回 False。
vars() #返回對象object的屬性和屬性值的字典對象,若是沒有參數,就打印當前調用位置的屬性和屬性值 相似 locals()

hasattr(object,name) #判斷name是否在object,判斷object中是否有一個叫name的方法或者屬性
getattr(object,name,"xxx")#取object中name 的值,xxx爲找不到報錯信息,不然找不到報錯
setattr(x,y,v) #給x對象中的y屬性設置值v
delattr(x,y)#刪除對象x中y

 1.八、幾個重要的內置函數排序

zip()
filter()
map()
max()
min()
sorted()
enumerate()

2、匿名函數繼承

lambda a,b:a**b
#關鍵字 參數:返回值

#參數能夠有多個,用逗號隔開
#匿名函數無論邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值
#返回值和正常的函數同樣能夠是任意數據類型

 

3、遞歸函數

遞歸函數:在一個函數裏在調用這個函數自己。

遞歸的最大深度:998

def fun(count):
    print(count)
    count += 1
    fun(count)
fun(1)
能夠修改遞歸最大深度
import sys
sys.setrecursionlimit(2000)

 遞歸調用應該分爲兩個明確的階段:遞推,回溯 

  • 回溯就是從外向裏一層一層遞歸調用下去,回溯階段必需要有一個明確地結束條件,每進入下一次遞歸時,問題的規模都應該有所減小
  • 遞推就是從裏向外一層一層結束遞歸
#a(5) = a(4) -10
#a(4) = a(3) -10
#a(3) = a(2) -10
#a(2) = a(1) -10
#a(1) = 50

def a(n):
    if n == 1:
        return 50
    return a(n-1)-10

print(a(5))   #10

 遞歸方式實現斐波那契(生成前20項)

def fun(n):
    if n==0:
        return 0
    elif n==1 or n==2:
        return 1
    else:
        return fun(n-1)+fun(n-2)
for i in range(20):
    print(fun(i))
#循環方式
a,b=0,1
while b<1000:
    print(b)
    a,b=b,a+b

4、二分法  (遞歸)

想從一個按照從小到大排列的數字列表中找到指定的數字,遍歷的效率過低,用二分法能夠極大的縮小查找規模

l=[2,23,34,45,56,78,89,90]
def find(num,l,start=0,end=len(l)):
    print(end,start)
    if start <= end:
        index=start+(end-start)//2
        print('start:[%s] end:[%s] index:[%s] index_val:[%s]' %(start,end,index,l[index]))
        if num > l[index]:
            start=index+1
        elif num < l[index]:
            end=index-1
        elif num == l[index]:
            print('find it',index)
            return
        find(num,l,start,end)
    else:
        print("找不到了")
find(89, l)  #find it 6
相關文章
相關標籤/搜索