python学习笔记14:常用内置函数exec,eval,map,range,type等

chr()和ord()

ord():将char转为Unicode(0~65535)值(在python2中是ASCII(0~255)值)
chr(): 将Unicode(0~65535)值转为char(在python2中是ASCII(0~255)值)
注意:unichr() 在python3中去掉,由chr代替。

>>> ord(‘a’)
97
>>> ord(‘\n’)
10
>>> chr(97)
‘a’
>>> chr(10)
‘\n’

exec和eval

exec执行字符串形式的代码(python语句,做某事),返回None

>>> exec('a = 6') # 相当于把a=6这条语句放在此处执行
>>> a
6

exec也可以执行多行代码:

>>> a = [0,1,2,3]
>>>

>>> # exec多行代码,代码放到长字符串中,
>>> # 注意字符串中代码的缩进,要顶格写,不要管exec语句外的缩进
>>> s_code='''
... print(a)      # exec语句可以访问正常代码中的变量
... a.append('s') # exec语句可以访问修改代码中的变量
... print(a)
... '''
>>>
>>> exec(s_code)
[0, 1, 2, 3]
[0, 1, 2, 3, 's']
>>>
>>> a             # exec语句对变量的修改,会影响到exec语句外
[0, 1, 2, 3, 's']
>>>

>>> # exec多行代码,代码放到list中
>>> list_code = list()
>>> list_code.append('print(a)')
>>> list_code.append('a.append("L")')
>>> list_code.append('print(a)')
>>>
>>> exec('\n'.join(list_code)) # 通过换行符连接各语句
[0, 1, 2, 3, 's']
[0, 1, 2, 3, 's', 'L']
>>>
>>> exec(';'.join(list_code)) # 通过分号连接各语句
[0, 1, 2, 3, 's', 'L']
[0, 1, 2, 3, 's', 'L', 'L']
>>>
>>> a
[0, 1, 2, 3, 's', 'L', 'L']
>>>

eval执行字符串形式的表达式,返回表达式的值

>>> a = eval('2*3')
>>> a
6
>>> b = eval('a==6')
>>> b
True
>>> eval('a=7') # a=7是一个赋值语句, 不是表达式, 所以对它使用eval会报告语法错误
Traceback ...
  ...
  ...
    a=7
SyntaxError: invalid syntax

id()

返回一个对象的序号,转成16进制后即内存地址。

>>> class Test():
...pass
...
>>> t0 = CTest()
>>> t0
<__main__.CTest object at 0x00328D710>
>>> id(t0)
53008144
>>> '{:x}'.format(id(t0)) # id()返回的为10进制数,转为16进制后为内存地址;
328d710

map(func, *iterables)

参数:map()函数接收两个参数:一个函数、一个Iterable序列。
功能:将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回, map()主要是把运算规则抽象化;
返回值:map object,可以通过list(map object)将之转为list
例1:

>>> def f(x):
...     return x*x
...
>>> r = map(f, [1,2,3])
>>> r
<map object at 0x2b*******>
>>> list(r) # r是一个Iterator,使用list()函数把整个序列计算出来
[1, 4, 9]

例2:

>>> list(map(str, range(3))) # 把列表的int转为str;
['0', '1', '2']

reduce(function, sequence[, initial])

参数:reduce()函数接收三个参数:一个函数、一个Iterable序列,还有一个初始值。
功能:将传入的函数作用在序列上,把函数计算结果一直和序列的下一个元素做累积计算;
reduce(f, [x0, x1, x2, x3]) 等价于 f(f(f(x0, x1), x2), x3)

>>> import functools
>>> def add(x,y):
...     return x+y
...
>>> functools.reduce(add, [1,3,5,7,9]) # 将list元素累加
25
>>> functools.reduce(add, [1,3,5,7,9], 100) #将list累加,初始值为100
125

filter(function or None, iterable)

参数:filter()函数接收两个参数:一个函数,一个序列;与map类似。
功能:把传入的函数依次作用于每个元素,根据函数返回值是True或False决定元素是否保留;
返回值:filter object

>>> def is_odd(n):
...     return n%2==1
...
>>> r = filter(is_odd, range(9))
>>> r
<filter object at 0x2b******>
>>> list(r)
[1,3,5,7]

zip(iterable[, iterable, ...])

语法:zip(iterable[, iterable, ...])
作用:将参数中对应的元素打包成一个个元组;
返回值:返回元组组成的对象(可以节约内存),可以使用list()将之转为列表;
参数:iterable,一个或多个迭代器
例1

>>> lst0 = [1, 2, 3]
>>> lst1 = [4, 5, 6]
>>> lst2 = [7, 8, 9, 10, 11]

zip返回的是zip对象,可以用list(),将之转为列表

>>> zip_0 = zip(lst0, lst1)
>>> zip_0 # 是一个对象
<zip object at 0x2ad*******>
>>> list(zip_0) #通过list()把它转为列表
[(1, 4), (2, 5), (3, 6)]

如果两个iterable不等长,取最短的

>>> list(zip(lst0, lst2)) # 如果两个iterable不等长,取最短的
[(1, 7), (2, 8), (3, 9)]

如果iterable只有一个,则元组元素就只有一个

>>> list(zip(lst0)) # 如果iterable只有一个,则元组元素就只有一个
[(1,), (2,), (3,)]

如果iterable有3个,则元组元素就有3个

>>> list(zip(lst0, lst1, lst2)) #如果iterable有3个,则元组元素就有3个
>>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

zip(*XX),将zip对象XX做解压,返回list

>>> a0, a1 = zip(*[(1, 4), (2, 5), (3, 6)])
>>> a0
(1, 2, 3)
>>> a1
(4, 5, 6)

range()

语法:

  1. range(stop)
  2. range(start, stop[, step])

参数:

  1. start:起始值,可选,默认为0;
  2. stop:结束值,必选;注意:结束值不包含在返回的object中;
  3. step:步长,可选,默认为1;

返回值:class 'range'

range(i, j) 包含:i, i+1, i+2, ..., j-1;

>>> range(3)
range(0, 3)
>>> type(range(3))
<class 'range'>
>>> list(range(3)) # 不包含3
[0, 1, 2]

type(), isinstance(), dir()

type()

type()函数用来获取对象类型

type(123) # <class 'int'>  
type(d)   # <class '__main__.Dog'>  
type(abs) # <class 'builtin_function_or_method'> 内置函数  

type()返回的是class类型,所以相同类型的比较会返回True, 直接与类型比较也返回True:

type(123) == type(456) # True  
type(123) == int       # True  

使用types包
常用的类型有:
types.FunctionType,
types.BuiltinFunctionType,
types.LambdaType,
types.GeneratorType

>>> import types    
  
>>> def fn()    
...     pass    
...    
>>> type(fn) == types.FunctionType          # True  
>>> type(abs) == types.BuiltinFunctionType  # True  
>>> type(lambda x:x) == types.LambdaType    # True  
>>> type((x for x in range(10))) == types.GeneratorType  # True  

isinstance()

语法:isinstance(obj, class_or_tuple, /)
参数:参数2可以是一个class,也可以是class组成的元组,元组中的class是“或”的关系;

对于有继承关系的class,可以使用isinstance()判断class类型;

>>> class A(object):  
...     pass  
...  
>>> class B(A):  
...     pass  
...  
>>> b0 = B()  
>>> isinstance(b0, B) # True, b0是B的实例  
>>> isinstance(b0, A) # True, b0也是A的实例  

参数2可以是一个元组

>>> isinstance((1, 2, 3), list          ) # False, 不是list  
>>> isinstance((1, 2, 3), tuple         ) # True , 是tuple  
>>> isinstance((1, 2, 3), (list, tuple)) # True , 是list或tuple  

还可以判断对象是不是可迭代的:

>>> import collections  
>>> isinstance('abc'     , collections.Iterable) # True, str可迭代  
>>> isinstance([1,2,3]   , collections.Iterable) # True, list可迭代  
>>> isinstance({1:2, 3:4}, collections.Iterable) # True, dict可迭代  
>>> isinstance(123       , collections.Iterable) # False,int不可迭代  

dir()

dir()函数用于获取一个对象的所有属性和方法;比如dir('ABC')返回字符串的属性和方法;
例:先定义一个class

>>> class Dog():    
...     def __init__(self, name):    
...         self.name = name    
...     def getName(self):    
...         return self.name    

使用dir获取属性和方法(这种方式不能区分哪个是属性哪个是方法):

>>> d0 = Dog('XiaoBai')    
>>> attrs = [ele for ele in dir(d0) if not ele.startswith('__')]    
>>> attrs    
['getName', 'name']    

hasattr()

使用hasattr判断某对象是否包含某属性/方法, 然后使用callable判断它是属性还是方法
例:

>>> hasattr(d0, 'name') # d0有'name'属性  
True  
>>> hasattr(d0, 'getName') # d0有'getName'方法  
True  
>>> hasattr(d0, 'age')  
False  
>>>   
>>> callable(d0.name)  
False  
>>> callable(d0.getName)  # getName可调用, 它是个方法
True  

getattr()

使用getattr和callable联合判断:

>>> name = getattr(d0, 'name', None)  
>>> if callable(name):  
...     print('name is callable')  
... else:  
...     print('name is not callable')  
...   
name is not callable  
>>>   
>>> getName = getattr(d0, 'getName', None)  
>>> if callable(getName):  
...     print('getName is callable')  
...     print(getName()) # 调用方法  
... else:  
...     print('getName is not callable')  
...   
getName is callable  
Xiaobai  
>>>   
>>> getName  
<bound method Dog.getName of <__main__.Dog object at 0x2b***>>  
>>> getName()  
'Xiaobai'  

setattr()

使用setattr(), 如果属性存在, 则修改该属性的值, 如果属性不存在, 则添加该属性

>>> setattr(d0, 'name', 'Dabai') # 设置'name'属性  
>>> d0.name  
'Dabai'  
>>> setattr(d0, 'color', 'White') # 设置不存在的属性,则添加该属性;  
>>> d0.color  
'white'  
posted @ 2020-07-03 11:33  编程驴子  阅读(225)  评论(0编辑  收藏  举报