天天看點

内置函數内置函數——eval、exec、compile

接下來,我們就一起來看看python裡的内置函數。截止到python版本3.6.2,現在python一共為我們提供了68個内置函數。它們就是python提供給你直接可以拿來使用的所有函數。這些函數有些我們已經用過了,有些我們還沒用到過,還有一些是被封印了,必須等我們學了新知識才能解開封印的。那今天我們就一起來認識一下python的内置函數。這麼多函數,我們該從何學起呢?

Built-in Functions
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()

上面就是内置函數的表,68個函數都在這兒了。這個表的順序是按照首字母的排列順序來的,你會發現都混亂的堆在一起。比如,oct和bin和hex都是做進制換算的,但是卻被寫在了三個地方。。。這樣非常不利于大家歸納和學習。那我把這些函數分成了6大類。你看下面這張圖,你猜咱們今天會學哪幾大類呀? 

内置函數内置函數——eval、exec、compile

我猜你們都猜對了。我們今天就要學習用粉紅色标注出來的這四大塊——56個方法。還有12個方法欠着怎麼辦呢?我們講完面向對象這剩下的12個會在兩周之内陸續還給你們的,我保證(認真臉)。那這樣,我們今天就主要關注我們要學習的這56個方法。

那要學的一共4塊,咱們從哪兒開始學起呢?

作用域相關

内置函數内置函數——eval、exec、compile

基于字典的形式擷取局部變量和全局變量

globals()——擷取全局變量的字典

locals()——擷取執行本方法所在命名空間内的局部變量的字典

print(globals())  傳回全局作用域中的所有名字

print(locals())  傳回本地作用域的所有名字

globao和local是關鍵字

其他

内置函數内置函數——eval、exec、compile

字元串類型代碼的執行

javascript:void(0)

輸入輸出相關:

input() 輸入

s = input("請輸入内容 : ")  #輸入的内容指派給s變量
print(s)  #輸入什麼列印什麼。資料類型是str      

print() 輸出

print('我們是祖國的花朵',end = ' ')     指定結束符

print('我們是祖國的花朵',end = '| ')   指定多個值輸出之間的分隔符

#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: 立即把内容輸出到流檔案,不作緩存
    """      
file關鍵字的說明
f = open('tmp_file','w')
print(123,456,sep=',',file = f,flush=True)      
列印進度條
import time
for i in range(0,101,2):  
     time.sleep(0.1)
     char_num = i//2      #列印多少個'*'
     per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num)
     print(per_str,end='', flush=True)
#小越越  : \r 可以把光标移動到行首但不換行      

eval() 将字元串類型的代碼執行并傳回結果  不能随便用,不安全,用于有結果的簡單計算

print(eval('1+2+3+4'))      

exec()将自字元串類型的代碼執行  沒有傳回值,簡單的流程控制

print(exec("1+2+3+4"))
exec("print('hello,world')")      
#指定global參數
code = '''
import os 
print(os.path.abspath('.'))
'''
code = '''
print(123)
a = 20
print(a)
'''
a = 10
exec(code,{'print':print},)
print(a)      

内置函數——eval、exec、compile

compile  将字元串類型的代碼編譯。代碼對象能夠通過exec語句來執行或者eval()進行求值。

參數說明:   

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)
1
3
5
7
9


>>> #簡單求值表達式用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'"      

 資料類型相關:

type(o) 傳回變量o的資料類型

記憶體相關:

id(o) o是參數,傳回一個變量的記憶體位址

hash(o) o是參數,傳回一個可hash變量的哈希值,不可hash的變量被hash之後會報錯。

#hash執行個體
t = (1,2,3)
l = [1,2,3]
print(hash(t))  #可hash
print(hash(l))  #會報錯

'''
結果:
TypeError: unhashable type: 'list'
'''      

hash函數會根據一個内部的算法對目前可hash變量進行處理,傳回一個int數字,随機的。

*每一次執行程式,内容相同的變量hash值在這一次執行過程中不會發生改變。

檔案操作相關

open()  打開一個檔案,傳回一個檔案操作符(檔案句柄)

f = open()

操作檔案的模式有r,w,a,r+,w+,a+ 共6種,每一種方式都可以用二進制的形式操作(rb,wb,ab,rb+,wb+,ab+)

可以用encoding指定編碼.

f = open('1.複習.py')

print(f.writable())  判斷能不能寫

print(f.readable())  判斷能不能讀

子產品操作相關

__import__導入一個子產品

#導入子產品
import time      
#内部實際流程   知道即可,不需要用
#import time

time = __import_('time')
print(time.time())      
#__import__
os = __import__('os')
print(os.path.abspath('.'))      

幫助方法

help()   檢視名字及其用法

print(help(int))      

在控制台執行help()進入幫助模式。可以随意輸入變量或者變量的類型。輸入q退出

或者直接執行help(o),o是參數,檢視和變量o有關的操作。。。

#如果某個方法屬于某個資料剋星的變量,就用點來調用:list.append()

#如果某個方法不依賴任何資料類型,就直接用——内置函數和自定義函數采用: import time

檢視參數所屬類型的所有内置方法

dir() 預設檢視全局空間内的屬性,也接受一個參數,檢視這個參數内的方法或變量

print(dir(list))  #檢視清單的内置方法
print(dir(int))  #檢視整數的内置方法      

和調用相關

callable(o),o是參數,看這個變量是不是可調用。

如果o是一個函數名,就會傳回True

def func():pass
print(callable(func))  #參數是函數名,可調用,傳回True
print(callable(123))   #參數是數字,不可調用,傳回False      

和數字相關

内置函數内置函數——eval、exec、compile

數字——資料類型相關:bool,int,float,complex

數字——進制轉換相關:bin,oct,hex

數字——數學運算:abs,divmod,min,max,sum,round,pow

bin   轉二進制       用  0b  表示

oct   轉八進制       用  0c  表示

hex  轉十六進制   用  0x  表示

abs  求絕對值

divmod  #div除法   #mod 求餘  #是以divmod就是除餘   

形如:
print(divmod(7,2))

結果  (3, 1)      

 round  取精确值  ,注意四舍五入

print(round(1.8407524805,4))

結果  1.8408      

pow  幂運算

print(pow(2,3))     8  2的三次方
print(pow(3,2))     9  3的二次方
print(pow(2,3,3))   2  8處以3餘2
print(pow(3,2,1))   0  9處以1餘0      

sum  求和  注意必須是可疊代的,并且是數字

print(sum([1,2,3,4]))       10
print(sum([1,2,3,4],10))    20  #如果有10,表示從10開始加,再加1+2+3+4.如果沒有10,則預設從0開始加      

和資料結構相關

内置函數内置函數——eval、exec、compile

python中的資料類型 int  bool  等

                  資料結構  dict  list  tuple  set  str