python之内置函数(一)
一、內置函數一
1、內置函數總覽
| 內置函數 | ||||
| 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() |
2、作用域相關 ******
globals() :返回一個字典(包含全部的全局變量)locals() : 返回一個字典(包含的是當前作用域的所有變量)
b = 2
a = 3
print(globals())
print(locals())
# 結果:這兩個結果一樣,因為都是在全局執行的。
def fun():
a = 3
b = 2
print(globals())
print(locals())
fun()
# 結果:
globals():
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000228CB787748>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'E:/OldBoy/Knight/PythonProject/day13/t2.py', '__cached__': None, 'b': 2, 'a': 3,
'fun': <function fun at 0x00000228CB351E18>}
locals():{'b': 2, 'a': 3}
3、字符串類型代碼的執行:eval,exec,compile (不建議使用 ***)
eval: 執行字符串類型的代碼,并返回最終結果
s1 = '1+2+3+4+5'
print(eval(s1),type(eval(s1))) #15 <class 'int'>
s2 = "{'name':'xiaoming'}"
print(eval(s2),type(eval(s2))) #{'name': 'xiaoming'} <class 'dict'>
s3 = 'print(666)'
eval(s3) # 666
print(eval(s3)) # 666 None(執行s3里面的代碼沒有返回值,就返回None)
exec:執行字符串類型的代碼,不返回結果(代碼流)
s3 = 'print(666)'
exec(s3) #666(沒有返回值的代碼流可用exec())
s4 = '''for i in range(10):
print(i)
'''
exec(s4) # 0 1 2 3 4 5 6 7 8 9
eval(s4) # 報錯
s1 = '1+2+3+4+5'
print(eval(s1),type(eval(s1))) #15 <class 'int'>
print(exec(s1)) #None(有返回值不能用exec)
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
s5 = 'for i in range(5):print(i)'
compile1 = compile(s5,'','exec')
exec(compile1)
結果:0 1 2 3 4
#簡單求值表達式用eval
s5 = '1*2*3*4'
compile2 = compile(s5,'','eval')
print(eval(compile2))
結果:24
#交互語句用single
s5 = 'name = input("please input your name:")'
compile3 = compile(s5,'','single')
exec(compile3) #運行后會讓用戶進行輸入,please input your name:
print(name) #在exec(compile3)運行前沒有值,運行后,值為用戶輸入的值。
注意:有返回值的字符串形式的代碼用eval,沒有返回值的字符串形式的代碼用exec,一般不用compile。
但是!一般不推薦使用這幾個方法,為什么呢?
舉個栗子:
在工作中,別人發給你一個文本文件,你讀文件的時候,讀出來的都是字符串吧,那么就可以使用這三個方法,
但是,一旦你使用了這幾個方法,它立馬就執行了,你想過沒有,如果別人在傳送文件給你的時候,你的文件被
黑客截取了,植入了病毒,再發回給你,那你使用eval,exec不就把病毒也讀取了嗎?
4、輸入輸出相關 input(),print() *****
input:函數接受一個標準輸入數據,返回為string類型。
print:打印輸出。
print的參數分析:print(self, *args, sep=' ', end='
', file=None)
1,*args:可接收多個位置參數
2,sep:打印多個值之間的分隔符,默認為空格
3,end:每一次打印的結尾,默認為換行符
4,file: 默認是輸出到屏幕,如果設置為文件句柄,輸出到文件
1,*args:可接收多個位置參數
print('666') # 666
print(1,2,3,4) # 1 2 3 4
print(*[1,2,3]) # 1 2 3
拓展:
def func1(*args,**kwargs): #在函數的定義 *參數 代表聚合。
print(*args) #args=(1,2,3,4)這里的*args不是在函數的定義中,
#所以代表的是(*(1,2,3,4)) 打散 結果輸出:1,2,3,4
print(args) #args是一個元組,輸出(1, 2, 3, 4)
print(**kwargs) #print(name='xiaoming',age=1000) print方法中沒有**kwargs
#不能接收多個關鍵字參數,所以這里會報錯。
print(kwargs) #這里的kwargs是一個字典,print輸出一個字典:{'name': 'xiaoming', 'age': 1000}
func1(1,2,3,4,name='xiaoming',age=1000)
2,sep:打印多個值之間的分隔符,默認為空格
print(1,2,3,sep='|') # 1|2|3|4
3,end:每一次打印的結尾,默認為換行符
print(11,end=' ')
print(22)
結果:11 22
4,file: 默認是輸出到屏幕,如果設置為文件句柄,輸出到文件
f = open('t1',encoding='utf-8',mode='w')
print(666,'777','888',file=f)
5、內存相關 hash id ***
hash:獲取一個對象(可哈希對象(不可變類型):int,str,Bool,tuple)的哈希值。
id:獲取該對象的內存地址。
print(hash('name')) # -163295680327498572
print(hash('name1')) # 9065259785983334233
print(hash(123)) # 123
print(hash(100000)) # 100000
print(hash(True)) # 1
print(hash(False)) # 0
print(hash([1,2,3])) #報錯列表是可變數據類型,是不可哈希的
注意:數字的哈希值就是數字本身!
小知識點:
之前學字典的時候說過字典的優點之一是查詢速度快,
字典的查詢甚至比二分查找還要快,為什么呢?
字典的鍵是不可變的數據類型,所以是可哈希的,
字典在存入內存的時候會將你的所有的key先進行哈希,再將哈希值存入內存中,
這樣在查詢的時候可以根據哈希值直接就可以找到,所以查詢速度很快!
6、文件操作相關 *****
open:函數用于打開一個文件,創建一個file對象,相關的方法才可以調用它進行讀寫。
7、模塊相關 ***
__import__:函數用于動態加載類和函數 。
8、幫助 **
help:函數用于查看函數或模塊用途的詳細說明。
print(help(str))
9、調用相關
callable:函數用于檢查一個對象是否是可調用的。如果返回True,object仍然可能調用失敗;
但如果返回False,調用對象ojbect絕對不會成功。 ***
name = 'abc'
def fun():
a = 2
return a
print(callable(name)) #False 不可調用
print(callable(fun())) #False 不可調用:fun()不是一個對象,它是函數的執行者
print(callable(fun)) #True 可調用:fun是一個對象
10、查看內置屬性 ***
dir:函數不帶參數時,返回當前范圍內的變量、方法和定義的類型列表;
帶參數時,返回參數的屬性、方法列表。
如果參數包含方法__dir__(),該方法將被調用。如果參數不包含__dir__(),該方法將最大限度地收集參數信息。
s = 'a'
print(dir(s))
11、range
range:函數可創建一個整數對象,一般用在 for 循環中。
python2x: range(3) ---> [0,1,2] 列表
xrange(3) ---> 迭代器
python3x: range(3) ---> range(0,3) 可迭代對象
next:內部實際使用了__next__方法,返回迭代器的下一個項目
iter:函數用來生成迭代器(將一個可迭代對象,生成迭代器)
12、數字相關(14)
數據類型(4):
bool :用于將給定參數轉換為布爾類型,如果沒有參數,返回False。 ***
print(bool(1 < 2 and 3 > 4 or 5 < 6 and 9 > 2 or 3 > 1)) # True
print(bool('fdsjkfl')) #True
int:函數用于將一個字符串或數字轉換為整型。***
print(int('123')) # 123
print(int(3.74)) # 取整并不是四舍五入:3
print(int('0101',base=2)) # 將2進制的0101轉化成十進制,結果為5
float:函數用于將整數和字符串轉換成浮點數。 ***
print(float(5)) # 5.0
print(float(3.16)) # 3.16
print(float('2')) # 2.0
print(float('2.1')) # 2.1
complex:函數用于創建一個值為real + imag * j的復數或者轉化一個字符串或數為復數。
如果第一個參數為字符串,則不需要指定第二個參數。。
13、進制轉換(3):
bin:將十進制轉換成二進制并返回。
print(bin(100)) # 0b1100100
oct:將十進制轉化成八進制字符串并返回。
print(oct(7)) # 0o7
print(oct(8)) # 0o10
print(oct(9)) # 0o11
hex:將十進制轉化成十六進制字符串并返回。
print(hex(10)) # 0xa
print(hex(15)) # 0xf
print(hex(17)) # 0x11
14、數學運算(7):
abs:函數返回數字的絕對值。 ****
print(abs(-100)) # 100
divmod:計算除數與被除數的結果,返回一個包含商和余數的元組(a // b, a % b)。 ****
print(divmod(12,7)) # (1, 5) (商,余數)
divmod的應用:分頁。
假設有103條數據,你每頁顯示12條數據,你最終顯示多少頁。
print(divmod(103,12)) # (8,7) 即要9頁,前8頁,每頁12條數據,最后一頁,7條數據
round:保留浮點數的小數位數,默認保留整數,四舍五入。 ***
print(round(3.141592653)) #默認保留整數(會四舍五入):3
print(round(3.641592653)) #默認保留整數(會四舍五入):4
print(round(3.141592653,4)) #保留四位小數(會四舍五入):3.1416
print(round(3.141592653,2)) #保留兩位小數(會四舍五入):3.14
pow:求x**y次冪。(三個參數為x**y的結果對z取余) **
print(pow(2,5)) # 2的5次冪:32
print(pow(2,5,12)) # 2的5次冪的結果對12取余(32對12取余):8
sum:對可迭代對象進行求和計算(可設置初始值)。 *****
sum(iterable,start_num)
print(sum([1,2,3,4,100,101])) # 211
print(sum([1,2,3,4,100,101],100)) # 311(第二個參數為初始值)
print(sum([int(i) for i in [1,'2',3,'4','100',101]]))
min:返回可迭代對象的最小值(可加key,key為函數名,通過函數的規則,返回最小值)。 *****
print(min([1,-2,3,4,100,101])) # -2
print(min([1,-2,3,4,100,101],key=abs)) # 1
應用:
求出年齡最小的那個元組
ls = [('daming',1000),('xiaoming',18),('zhongming',500)]
這里的數據還不算復雜,可用之前學過的知識求出
min_age = min([i[1] for i in ls])
for j in ls:
if j[1] == min_age:
print(j)
但是有時候數據復雜的情況下,用之前的知識寫,可能會很復雜。
這時可用min()方法,配合自定制的函數進行求值
def func(x):
return x[1] # 1000 18 500
print(min(ls,key=func))
# 結果:('xiaoming', 18)
min(可迭代對象,key=函數名):
1,它會將iterable的每一個元素當做函數的參數傳進去。
2,它會按照返回值去比較大小。
3,最后返回的是遍歷的元素 x
dic = {'a':3,'b':2,'c':1}
def func1(x):
return dic[x]
print(min(dic,key=func1))
結果:c
# 這里傳進去的元素是字典的鍵,比較的返回值是字典的值,最后返回的是遍歷的鍵
def func2(x):
return x[1]
print(min(dic.items(),key=func2))
結果:('c', 1)
# 這里傳進去的元素是字典的鍵和值組成的元組,比較的返回值是字典的值,最后返回的是遍歷的元組
max:返回可迭代對象的最大值(可加key,key為函數名,通過函數的規則,返回最大值)。 *****
print(max([1,2,3,100])) # 100
總結
以上是生活随笔為你收集整理的python之内置函数(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++之标准库vector
- 下一篇: 组网神器Zerotier One使用