1. 程式人生 > >4-4日 內置函數,匿名函數

4-4日 內置函數,匿名函數

打包成 *args break close run 位置 圖片 com 3.5

內置函數
abs() dict()字典 help()查看內部使用方法 min() setattr()
all() dir() hex() next() slice()
any() divmod() 分頁 id() 查看內存地址 object() sorted()
ascii() enumerate()枚舉 input() 用戶交互 oct() staticmethod()
bin() eval() int() open() 打開文件 str()
bool() exec() isinstance() ord() sum()
bytearray() filter() 過濾 issubclass() pow() super()
bytes()只能編碼不能解碼 float() 浮點數 iter() print() tuple()
callable() format() 格式化輸出 len() property() type()
chr() frozenset() list() 列表 range() vars()
classmethod() getattr() locals() 局部作用域 repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()
delattr() hash() memoryview() set()集合

我們一起來看看python裏的內置函數。什麽是內置函數?就是Python給你提供的,拿來直接用的函數。

1.1作用域相關

locals :函數會以字典的類型返回當前位置的全部局部變量。

globals:函數以字典的類型返回全部全局變量。

a = 1
b = 2
print(locals())
print(globals())
#這兩個是一樣的,因為是在全局執行的。
def func(argv):
    c = 2
    print(locals())
    print(globals())
func(3)#{‘c‘: 2, ‘argv‘: 3}這兩個不一樣

1.2其他相關

1.2.1 字符串類型代碼的執行 eval,exec,complie

eval:執行字符串類型的代碼,並返回最終結果。

print(eval(2+4))
n = 88
print(eval("n + 5"))
eval(print(888))
msg_dic = eval(f1.readline())可以直接把什麽數據類型直接轉化過來。

exec:執行字符串的類型的編碼

s = ‘‘‘
for i in [1,2,3]:
    print(i)
‘‘‘
exec(s)

compile:將字符串類型的代碼編譯。代碼對象能夠通過exec語句來執行或者eval()進行,一般不用compile。

‘‘‘
參數說明:   

1. 參數source:字符串或者AST(Abstract Syntax Trees)對象。即需要動態執行的代碼段。  

2. 參數 filename:代碼文件名稱,如果不是從文件讀取代碼則傳遞一些可辨認的值。當傳入了source參數時,filename參數傳入空字符即可。  

3. 參數model:指定編譯代碼的種類,可以指定為 ‘exec’,’eval’,’single’。當source中包含流程語句時,model應指定為‘exec’;當source中只包含一個簡單的求值表達式,model應指定為‘eval’;當source中包含了交互式命令語句,model應指定為‘single‘。
‘‘‘
>>> #流程語句使用exec
>>> code1 = ‘for i in range(0,10): print (i)‘
>>> compile1 = compile(code1,‘‘,‘exec‘)
>>> exec (compile1)


>>> #簡單求值表達式用eval
>>> code2 = ‘1 + 2 + 3 + 4‘
>>> compile2 = compile(code2,‘‘,‘eval‘)
>>> eval(compile2)


>>> #交互語句用single
>>> code3 = ‘name = input("please input your name:")‘
>>> compile3 = compile(code3,‘‘,‘single‘)
>>> name #執行前name變量不存在
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
name
NameError: name ‘name‘ is not defined
>>> exec(compile3) #執行時顯示交互命令,提示輸入
please input your name:‘pythoner‘
>>> name #執行後name變量有值
"‘pythoner‘"

有返回值的字符串形式的代碼用eval,沒有返回值的字符串形式的代碼用exec,一般不用compile。

1.2.2 輸入輸出相關 input,print

  input:函數接受一個標準輸入數據,返回為 string 類型。

  print:打印輸出

‘‘‘ 源碼分析
def print(self, *args, sep=‘ ‘, end=‘\n‘, file=None): # known special case of print
    """
    print(value, ..., sep=‘ ‘, end=‘\n‘, file=sys.stdout, flush=False)
    file:  默認是輸出到屏幕,如果設置為文件句柄,輸出到文件
    sep:   打印多個值之間的分隔符,默認為空格
    end:   每一次打印的結尾,默認為換行符
    flush: 立即把內容輸出到流文件,不作緩存
    """
‘‘‘

print(111,222,333,sep=*)  # 111*222*333

print(111,end=‘‘)
print(222)  #兩行的結果 111222

f = open(log,w,encoding=utf-8)
print(寫入文件,file=f,flush=True)

1.2.3內存相關 hash id

  hash:獲取一個對象(可哈希對象:int,str,Bool,tuple)的哈希值。

print(hash(12322))
print(hash(123))
print(hash(arg))
print(hash(alex))
print(hash(True))
print(hash(False))
print(hash((1,2,3)))

‘‘‘
12322
-2996001552409009098
-4637515981888139739
2311495795356652852
1
0
2528502973977326415
‘‘‘

id:用於獲取對象的內存地址。

print(id(123))  # 1674055952
print(id(abc))  # 2033192957072

1.2.3文件操作相關

  open:函數用於打開一個文件,創建一個 file 對象,相關的方法才可以調用它進行讀寫。

1.2.4模塊相關__import__ 

  __import__:函數用於動態加載類和函數 。

1.2.5幫助

  help:函數用於查看函數或模塊用途的詳細說明。

通過help 可以查看方法。

1.2.6調用相關

  callable:函數用於檢查一個對象是否是可調用的。如果返回True,object仍然可能調用失敗;但如果返回False,調用對象ojbect絕對不會成功。

>>>callable(0)
False
>>> callable("runoob")
False
 
>>> def add(a, b):
...     return a + b
... 
>>> callable(add)             # 函數返回 True
True
>>> class A:                  #
...     def method(self):
...             return 0
... 
>>> callable(A)               # 類返回 True
True
>>> a = A()
>>> callable(a)               # 沒有實現 __call__, 返回 False
False
>>> class B:
...     def __call__(self):
...             return 0
... 
>>> callable(B)
True
>>> b = B()
>>> callable(b)               # 實現 __call__, 返回 True

def func1():
    print(666)

a = 3
f = func1
print(callable(f))#查看函數是否可以調用  True 
print(callable(a))

1.2.7查看內置屬性

  dir:函數不帶參數時,返回當前範圍內的變量、方法和定義的類型列表;帶參數時,返回參數的屬性、方法列表。如果參數包含方法__dir__(),該方法將被調用。如果參數不包含__dir__(),該方法將最大限度地收集參數信息。

print(dir([]))
print(dir(()))
print(dir({}))

1.3 叠代器和生成器相關

range:函數可創建一個整數對象,一般用在 for 循環中。

  next:內部實際使用了__next__方法,返回叠代器的下一個項目。

# 首先獲得Iterator對象:
it = iter([1, 2, 3, 4, 5])
# 循環:
while True:
    try:
        # 獲得下一個值:
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循環
        break

iter:函數用來生成叠代器(講一個可叠代對象,生成叠代器)

from collections import Iterable
from collections import Iterator
l = [1,2,3]
print(isinstance(l,Iterable))  # True
print(isinstance(l,Iterator))  # False

l1 = iter(l)
print(isinstance(l1,Iterable))  # True
print(isinstance(l1,Iterator))  # True

1.4基礎數據類型相關

1.4.1數字相關

數據類型(4):

    bool :用於將給定參數轉換為布爾類型,如果沒有參數,返回 False。

    int:函數用於將一個字符串或數字轉換為整型。

print(int())
print(int(12))
print(int(1))
print(int(3.5))#返回整數
print(int(‘0100‘,base=2))#將二進制轉化為十進制

float:函數用於將整數和字符串轉換成浮點數。

   complex:函數用於創建一個值為 real + imag * j 的復數或者轉化一個字符串或數為復數。如果第一個參數為字符串,則不需要指定第二個參數。。

>>>complex(1, 2)
(1 + 2j)
 
>>> complex(1)    # 數字
(1 + 0j)
 
>>> complex("1")  # 當做字符串處理
(1 + 0j)
 
# 註意:這個地方在"+"號兩邊不能有空格,也就是不能寫成"1 + 2j",應該是"1+2j",否則會報錯
>>> complex("1+2j")
(1 + 2j)

進制轉換(3):

    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‘>

數學運算(7):

    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次冪
print(pow(2,3,3))  # 三個參數為2**3次冪,對3取余。
#lambda 函數與內置函數的結合。
# sorted,map,fiter,max,min,reversed

sum:對可叠代對象進行求和計算(可設置初始值)。

print(sum([1,2,3,9,4]))
print(sum([1,2,3,9,4],100))#裏面的元素不能超過兩個

min:返回可叠代對象的最小值(可加key,key為函數名,通過函數的規則,返回最小值)。

max:返回可叠代對象的最大值(可加key,key為函數名,通過函數的規則,返回最大值)。

print(max([1,2,3]))

ret = max([1,2,-5,],key=abs)  # 按照絕對值的大小,返回此序列最大值
print(ret)
ret = min([1,2,-5,],key=abs)  # 按照絕對值的大小,返回此序列最小值
print(ret)
dic={k1: 10, k2: 100, k3: 30}
print(max(dic))
print(dic[max(dic,key=lambda x:dic[x])])

1.4.2和數據結構相關(24)

  列表和元祖(2)

    list:將一個可叠代對象轉化成列表(如果是字典,默認將key作為列表的元素)。

    tuple:將一個可叠代對象轉化成元祖(如果是字典,默認將key作為元祖的元素)。

l = list((1,2,3))
print(l)

l = list({1,2,3})
print(l)

l = list({k1:1,k2:2})
print(l)

tu = tuple((1,2,3))
print(tu)

tu = tuple([1,2,3])
print(tu)

tu = tuple({k1:1,k2:2})
print(tu)

相關內置函數(2)

    reversed:將一個序列翻轉,並返回此翻轉序列的叠代器。

ite = reversed([a,g,3,i,p,4])
print(ite)
for i in ite:
    print(i)
slice:構造一個切片對象,用於列表的切片。
li = [a,b,c,d,e,f,g]
l2 = [a,b,c,1,2,3,4,54]
sli_obj = slice(3)
print(li[sli_obj])
print(l2[sli_obj])

sli_obj = slice(7,0,-2)
print(li[sli_obj])

字符串相關(9)

    str:將數據轉化成字符串。

    format:與具體數據相關,用於計算各種小數,精算等。

主要是用於格式化輸出

s1 = format(test, <30)
print(format(test, <30))
print(format(test, >20))
print(format(test, ^20))
print(len(s1))
技術分享圖片
#字符串可以提供的參數,指定對齊方式,<是左對齊, >是右對齊,^是居中對齊
print(format(test, <20))
print(format(test, >20))
print(format(test, ^20))

#整形數值可以提供的參數有 ‘b‘ ‘c‘ ‘d‘ ‘o‘ ‘x‘ ‘X‘ ‘n‘ None
>>> format(3,b) #轉換成二進制
11
>>> format(97,c) #轉換unicode成字符
a
>>> format(11,d) #轉換成10進制
11
>>> format(11,o) #轉換成8進制
13
>>> format(11,x) #轉換成16進制 小寫字母表示
b
>>> format(11,X) #轉換成16進制 大寫字母表示
B
>>> format(11,n) #和d一樣
11
>>> format(11) #默認和d一樣
11

#浮點數可以提供的參數有 ‘e‘ ‘E‘ ‘f‘ ‘F‘ ‘g‘ ‘G‘ ‘n‘ ‘%‘ None
>>> format(314159267,e) #科學計數法,默認保留6位小數
3.141593e+08
>>> format(314159267,0.2e) #科學計數法,指定保留2位小數
3.14e+08
>>> format(314159267,0.2E) #科學計數法,指定保留2位小數,采用大寫E表示
3.14E+08
>>> format(314159267,f) #小數點計數法,默認保留6位小數
314159267.000000
>>> format(3.14159267000,f) #小數點計數法,默認保留6位小數
3.141593
>>> format(3.14159267000,0.8f) #小數點計數法,指定保留8位小數
3.14159267
>>> format(3.14159267000,0.10f) #小數點計數法,指定保留10位小數
3.1415926700
>>> format(3.14e+1000000,F)  #小數點計數法,無窮大轉換成大小字母
INF

#g的格式化比較特殊,假設p為格式中指定的保留小數位數,先嘗試采用科學計數法格式化,得到冪指數exp,如果-4<=exp<p,則采用小數計數法,並保留p-1-exp位小數,否則按小數計數法計數,並按p-1保留小數位數
>>> format(0.00003141566,.1g) #p=1,exp=-5 ==》 -4<=exp<p不成立,按科學計數法計數,保留0位小數點
3e-05
>>> format(0.00003141566,.2g) #p=1,exp=-5 ==》 -4<=exp<p不成立,按科學計數法計數,保留1位小數點
3.1e-05
>>> format(0.00003141566,.3g) #p=1,exp=-5 ==》 -4<=exp<p不成立,按科學計數法計數,保留2位小數點
3.14e-05
>>> format(0.00003141566,.3G) #p=1,exp=-5 ==》 -4<=exp<p不成立,按科學計數法計數,保留0位小數點,E使用大寫
3.14E-05
>>> format(3.1415926777,.1g) #p=1,exp=0 ==》 -4<=exp<p成立,按小數計數法計數,保留0位小數點
3
>>> format(3.1415926777,.2g) #p=1,exp=0 ==》 -4<=exp<p成立,按小數計數法計數,保留1位小數點
3.1
>>> format(3.1415926777,.3g) #p=1,exp=0 ==》 -4<=exp<p成立,按小數計數法計數,保留2位小數點
3.14
>>> format(0.00003141566,.1n) #和g相同
3e-05
>>> format(0.00003141566,.3n) #和g相同
3.14e-05
>>> format(0.00003141566) #和g相同
3.141566e-05
View Code

bytes:用於不同編碼之間的轉化,只能編碼,不能解碼。將unicde 轉化為非unicode

# s = ‘你好‘
# bs = s.encode(‘utf-8‘)
# print(bs)
# s1 = bs.decode(‘utf-8‘)
# print(s1)
# bs = bytes(s,encoding=‘utf-8‘)
# print(bs)
# b = ‘你好‘.encode(‘gbk‘)
# b1 = b.decode(‘gbk‘)
# print(b1.encode(‘utf-8‘))

bytearry:返回一個新字節數組。這個數組裏的元素是可變的,並且每個元素的值範圍: 0 <= x < 256。

ret = bytearray(alex,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))
print(ret)
print(bytes(ret[:3]).decode(utf-8))
print(bytes(ret[3:]).decode(utf-8))

ord:輸入字符找該字符編碼的位置

    chr:輸入位置數字找出其對應的字符

    ascii:是ascii碼中的返回該值,不是就返回/u...

# ord 輸入字符找該字符編碼的位置  unicode
# print(ord(‘a‘))
# print(ord(‘中‘))

# chr 輸入位置數字找出其對應的字符 unicode
# print(chr(97))
# print(chr(20013))

# 是ascii碼中的返回該值,不是就返回\u...
# print(ascii(‘a‘))
# print(ascii(‘中‘))

repr:返回一個對象的string形式(原形畢露)。

name = taibb
print(我叫%r % name)
print(repr({"name":"alex"}))
print({"name":"alex"})

數據集合(3)

    dict:創建一個字典。

    set:創建一個集合。

    frozenset:返回一個凍結的集合,凍結後集合不能再添加或刪除任何元素。

  相關內置函數(8)

    len:返回一個對象中元素的個數。

    sorted:對所有可叠代的對象進行排序操作。可以加 key

li = [1,3,-2,-4,7]
print(sorted(li,reverse=True,key=abs))
students = [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘, ‘B‘, 10)]
print(sorted(students,key=lambda x: x[2]))
L = [(‘a‘, 1), (‘c‘, 3), (‘d‘, 4),(‘b‘, 2), ]
print(sorted(L,key=lambda s: s[1]))
students = [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘, ‘B‘, 10)]
print(sorted(students,key=lambda x: x[2],reverse = True))

enumerate:枚舉,返回一個枚舉對象。enumerate(li,1)可以加起始值

li = [老男孩, alex, wusir, 嫂子, taibai]
for k,v in enumerate(li,1):
    print(k,v)
    print(enumerate(li))
print(__iter__ in dir(enumerate(li)))
print(__next__ in dir(enumerate(li)))

 all:可叠代對象中,全都是True才是True

    any:可叠代對象中,有一個True 就是True

print(all([1,2,True,0]))False
print(any([1,‘‘,0]))True

zip:(俗稱拉鏈方法)函數用於將可叠代的對象作為參數,將對象中對應的元素打包成一個個元組,

然後返回由這些元組組成的列表。如果各個叠代器的元素個數不一致,則返回列表長度與最短的對象相同。

l1 = [1, 2, 3, 4]
l2 = [a, b, c, 5]
l3 = (*, **, (1,2,3), 777)
l4= (0, 99, (1,2,3), 777)
print(__iter__ in dir(zip(l1,l2,l3,l4)))
print(__next__ in dir(zip(l1,l2,l3,l4)))
for i in zip(l1,l2,l3,l4):
    print(i)

filter 過濾

通過你的函數,過濾一個可叠代對象,返回的是True。類似於[i for i in range(10) if i > 3]

def func(x):
    return x % 2 == 0
ret = filter(func,[1,2,3,4,5,6,7])
print(ret)
for i in ret:
    print(i)

map:會根據提供的函數對指定序列做映射。

def square(x):# 計算平方數
    return x**2
print(map(square,[1,2,6,3,4]))
for i in map(square,[1,2,6,3,4]):
    print(i)

匿名函數:為了解決那些功能很簡單的需求而設計的一句話函數。

#lambda 函數與內置函數的結合。
# sorted,map,fiter,max,min,reversed

函數名 = lambda 參數 :返回值

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

我們可以看出,匿名函數並不是真的不能有名字。

匿名函數的調用和正常的調用也沒有什麽分別。 就是 函數名(參數) 就可以了~~~

匿名函數與內置函數舉例

#求函數的平方
def func1(x):
    return x**2
func = lambda x:x**2
print(func(7))
#求兩個函數之和
def func2(x,y):
    return x + y

func3 = lambda x,y:x+y
print(func3(2,3))
l1 = [1,2,3,11,12,40,20,50,79]
def func2(x):
    return x > 10
ret = filter(lambda x: x > 10,l1)
for i in ret:
    print(i)
def func(x):求列表每個元素的平方
    return x**2

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)




 

4-4日 內置函數,匿名函數