今天,学习 Python 与类型创建、管理自定义类相关的内置函数。
在讲解下面 26 个内置函数前,介绍一个非常重要的知识点:函数作用域问题。
在学习 Python 函数时,我们经常会遇到变量作用域的问题,有全局变量,局部变量等,Python 查找变量的顺序遵守 LEGB 规则,即遇到某个变量时:
优先从它所属的函数(local)内查找;
若找不到,并且它位于一个内嵌函数中,就再到它的父函数(enclosing)中查找;
如果还是找不到,再去全局作用域(global)查找;
再找不到,最后去内置作用域(build-in)查找。
若还是找不到,报错。
如下例子,变量 c 在局部作用域(local)被发现;变量 b 在 parent 函数和 son 函数间(enclosing)被发现;变量 a 在全局作用域(global)被发现;min 函数属于 Python 中内置函数,所以在搜寻完 LEG 三个区域后,最终在 build-in 域被找到。
a = 10
def parent():
b = 20
def son():
c = 30 # c: local
print(b + c) # b: enclosing
print(a + b + c ) # a: global
print(min(a,b,c)) # min : built-in
son()
In [72]: parent()
50
60
10
如下变量 d,在 LEGB 四个域都被搜寻一遍后,还是未找到,就会抛出 d 没有被发现的异常。
a = 10
def parent():
b = 20
def son():
c = 30 # c: local
print(b + c) # b: enclosing
print(a + b + c ) # a: global
print(min(a,b,c)) # min : built-in
print(d) # 在 LEGB 四个域都未找到后,报错!
son()
parent()
# NameError: name 'd' is not defined
类型函数
bool([x])
测试一个对象是 True,还是 False。
In [38]: bool([0,0,0])
Out[38]: True
In [39]: bool([])
Out[39]: False
In [40]: bool([1,0,1])
Out[40]: True
bytes([source[, encoding[, errors]]])
将一个字符串转换成字节类型:
In [44]: s = "apple"
In [45]: bytes(s,encoding='utf-8')
Out[45]: b'apple'
str(object='')
将字符类型、数值类型等转换为字符串类型:
In [1]: i = 100
In [2]: str(i)
Out[2]: '100'
chr(i)
查看十进制整数对应的 ASCII 字符:
In [54]: chr(65)
Out[54]: 'A'
ord(c)
查看某个 ASCII 字符对应的十进制数:
In [60]: ord('A')
Out[60]: 65
dict()
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
创建数据字典:
In [92]: dict()
Out[92]: {}
In [93]: dict(a='a',b='b')
Out[93]: {'a': 'a', 'b': 'b'}
In [94]: dict(zip(['a','b'],[1,2]))
Out[94]: {'a': 1, 'b': 2}
In [95]: dict([('a',1),('b',2)])
Out[95]: {'a': 1, 'b': 2}
object()
返回一个根对象,它是所有类的基类。
In [137]: o = object()
In [138]: type(o)
Out[138]: object
使用魔法函数 dir,查看 object 对象上的所有方法:
In [2]: o.__dir__()
Out[2]:
['__repr__',
'__hash__',
'__str__',
'__getattribute__',
'__setattr__',
'__delattr__',
'__lt__',
'__le__',
'__eq__',
'__ne__',
'__gt__',
'__ge__',
'__init__',
'__new__',
'__reduce_ex__',
'__reduce__',
'__subclasshook__',
'__init_subclass__',
'__format__',
'__sizeof__',
'__dir__',
'__class__',
'__doc__']
int(x)
int(x, base =10),x 可能为字符串或数值,将 x 转换为一个整数。
In [16]: int('12')
Out[16]: 12
In [120]: int('12',16)
Out[120]: 18
若 x 不能转化为整数,则抛出 ValueError 异常:
In [3]: int('ws')
ValueError: invalid literal for int() with base 10: 'ws'
float(x)
将一个字符串或整数转换为浮点数:
In [103]: float('30')
Out[103]: 30.0
frozenset([iterable])
创建一个不可修改的冻结集合,一旦创建不允许增删元素。
In [30]: s = frozenset([1,1,3,2,3])
In [31]: s
Out[31]: frozenset({1, 2, 3})