Python常用内置函数

Python 作为一门高级编程语言,为我们提供了许多方便易用的内置函数,节省了不少开发应用的时间。目前,Python 3.7 共有 69 个内置函数,一些是我们耳熟能详的函数,另一些却不是很常见,这里主要介绍一些新手必备函数及其用法。

我把这些内置函数中常用的大致的地分为八大类:

输入输出 print() open()  input()
迭代相关 enumerate()  zip()
序列属性 sum()  max()  min()  len()
操作序列 sorted()  reversed()  range()
对象属性 dir()  id()  isinstance()  type()
映射类型

eval()  map()  slice()

数值计算

abs(), all(). any(), pow(), divmod()

其他

exec(), __import__()

一、输入输出

1.print 函数将对象输出至控制台

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

value为可变参数,可以接受任意多个对象。sep 参数表示输出对象之间的分隔符,默认为空格。

print('人生苦短', '我用Python')
人生苦短 我用Python

分隔符为'+'

print('人生苦短', '我用Python', sep='+')
人生苦短+我用Python

格式化输出字符串的三种方式:

name = '飞凡空间'
print('公众号:%s'%name)
公众号:飞凡空间
print('公众号:{}'.format(name))
公众号:飞凡空间
print(f'公众号:{name}')
公众号:飞凡空间

2. open 函数打开文件并返回文件对象

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file 为文件地址,mode 为打开文件的模式,默认为 'r',表示读取文件,常用的还有:'w' 表示写入文件、'b' 表示以二进制形式打开。常用上下文管理器 with 打开文件,f.read( ) 读取全部内容,f.readline() 读取一行内容。

with open('test.txt', 'r') as f:
   text1 = f.read()

with open('test.txt', 'r') as f:
   text2 = ''
   line = f.readline()
   while line:
       text2 += line
       line = f.readline()

assert text1 == text2
print(text1)

###############
输出内容:
人生苦短 我用Python
人生苦短 我用Python
人生苦短 我用Python
人生苦短 我用Python
###############

有时候,我们读取文件还会遇到乱码问题,可以指定编码格式:

当文件中有中文的时候,使用 'utf-8' 编码会导致异常:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 7: invalid start byte

with open('test.txt', 'r', encoding='utf-8') as f:
   text1 = f.read()

 这时候,我们可以尝试 'gb2312' 或者 'gbk' 编码来打开含有中文字符的文件。这时,便可以成功打开文件。 

with open('test.txt', 'r', encoding='gb2312') as f:
   text1 = f.read()

with open('test.txt', 'w', encoding='gbk') as f:
   f.write('人生苦短 我用Python')

3. input 函数获取控制台输入 

input([prompt])

input 可接受字符串为参数,提示用户输入。   

name = input('请输入你的名字:')
请输入你的名字:>? 张亚飞
name
Out[11]: '张亚飞'

二、迭代相关

1. enumerate 函数返回元素的序号与对应值

enumerate(iterable, start=0)

iterable 参数表示可迭代对象,start 参数是元素序号的起点,默认为 0。enumerate 函数的等价形式如下:

def enumerate(sequence, start=0):
	n = start
	for elem in sequence:
	 yield n, elem
	 n += 1

seq = ['P', 'y', 't', 'h', 'o', 'n']
for i, elem in enumerate(seq):
	print(i, elem)

2. zip 函数用于同时迭代多个对象

zip(*iterables)

*iterable 可以接受任意多个可迭代对象

a = ["**", '**', '**']
b = ['微信公众号', '关注', '飞凡空间']
c = a
print('#'*20)
for i, j, k in zip(a, b, c):
   print(i, j, k)
print('#'*20)


####################
** 微信公众号 **
** 关注 **
** Python飞凡空间 **
####################

三、序列属性

  • 序列最大值:max
  • 序列最小值:min
  • 序列的和:   sum
  • 序列长度:   len

基本用法:向这四个函数中传入序列,可以得到对应属性。

import random
random.seed(21)
seq = [random.randint(0, 100) for i in range(10)]
print(seq)
# [21, 53, 88, 53, 81, 36, 61, 27, 60, 65]
print(max(seq))
# 88
print(min(seq))
# 21
print(sum(seq))
# 545
print(len(seq))
# 10

作为内置函数,可以直接传入生成器(不需要括号)作为参数:

import random
random.seed(21)
num = max(random.randint(0, 100) for i in range(10))
print(num)
# 88

可传入 key 参数,作为比较大小的依据,相当于把序列中每一个元素 item 先传入函数 key 中,将函数返回的数值作为判断对象大小的依据。

def foo(x):
   return 1. / x
max(seq, key = foo)
# 21

对于我们自定义的类型,必须实现特殊方法,才能进行 len 等操作。

__len__ 代表:len 操作,__eq__ 代表:= 操作,__lt__ 代表 < 操作。

class foo:
   def __init__(self, num, seq):
       self.num = num
       self.seq = seq
       
   def __len__(self):
       return len(self.seq)
       
   def __eq__(self, other):
       return self.num == other.num
       
   def __lt__(self, other):
       return self.num < other.num
f1 = foo(18, [1, 4, 6])
f2 = foo(21, [1, 7, 9, 10])
f1 < f2
True
f1 > f2
False
f1 == f2
False
f3 = foo(18, [9, 9, 0, 7])
f1 == f3
True
en(f1)
3
len(f2)
4

四、操作序列

    1. range 函数生成序列

range(start, stop[, step])
  • start 可选参数,默认为 0 ,表示序列起点

  • stop 必选参数,表示序列终点,不包括终点

  • step 可选参数,序列的步长,默认为 1

range(5)
Out[12]: range(0, 5)
list(range(5))
Out[13]: [0, 1, 2, 3, 4]
list(range(1, 5))
Out[14]: [1, 2, 3, 4]
list(range(1, 10, 2))
Out[15]: [1, 3, 5, 7, 9]

range 函数生成的对象可以迭代,和列表很类似,_ 表示废弃变量(为了避免污染变量环境):

In[16]: for _ in range(3):
   ...:     print('我们就别再分离')
   ...:     
我们就别再分离
我们就别再分离
我们就别再分离
 

2. reversed 函数可以将序列逆置

reversed 可以将序列逆置,包括元组、字符串、列表。对于列表和字符串的逆置,使用 list[::-1] 或者slice()更加方便。

import random
random.seed(21)
seq = [random.randint(0, 100) for i in range(10)]
print(seq)
# [21, 53, 88, 53, 81, 36, 61, 27, 60, 65]
reversed(seq)
print(list(reversed(seq)))
# [65, 60, 27, 61, 36, 81, 53, 88, 53, 21]

 字符串逆置:

a = '我爱你'
a[::-1]
Out[18]: '你爱我'
reversed(a)
Out[19]: <reversed at 0xd3f24aa390>
''.join(reversed(a))
Out[20]: '你爱我'

3. sorted 函数可以对序列进行排序

sorted(iterable, *, key=None, reverse=False)

sorted 不同于 list.sort 操作(原地排序),返回一个新的有序序列,原序列保持不变。* 表示仅限关键字参数(keyword-only),也就是说,key、reverse 参数只能通过关键字传参,而不能通过位置传参。reverve 参数表示逆置操作,key 与之前 len 中的 key 参数类似,是函数排序的依据。 

sorted([9, 6, 2, 3, 6])
[2, 3, 6, 6, 9]

五、对象属性

  • dir 函数返回属性列表
  • id  函数返回对象地址
  • isinstance  判断对象的类型
  • type 返回对象的类型
class foo:
   pass

>>> dir(foo)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
......
'__str__',
'__subclasshook__',
'__weakref__']
# 创建实例
>>> f = foo()
>>> type(foo)
__main__.foo
>>> isinstance(f, foo)
True
>>> id(f)
2135099584864

六、映射类型

  • eval 解除引号的束缚
  • map 应用函数于单个对象
  • slice 生成切片

eval 可以去除字符串的单引号,从而获取引号内部内容。下面的演示展示了,如何使用 eval 函数获取字符串中的字典:

>>> info = '{"name": "LiHua", "age": 12}'
>>> eval(info)
{'name': 'LiHua', 'age': 12}
>>> info_dict = eval(info)
>>> type(info_dict)
dict
 

map 将传进来的函数应用于序列中的每一个元素,并返回迭代器。

map(function, iterable, ...)

举例来说,map 就是对 seq 列表中的每一个元素 item 进行 int 操作(int(item))。匿名函数同理,就是对序列中的每一个元素进行加 2 的操作。

seq = [1.5, 4.5, 9.1]
list(map(int, seq))
[1, 4, 9]
list(map(lambda x: x + 2, seq))
[3.5, 6.5, 11.1]

slice 函数为切片操作命名,使得切片操作更加清晰明了。

slice(start, stop[, step])

start 为起点,stop 为终点,step 为步长。使用该操作,使得截取有规律的文本内容变得很轻松。特别是长文本,使用 slice 函数更加清晰易懂。

>>> text = '微信公众号 飞凡空间'
>>> name = slice(0, 6)
>>> text[name]
微信公众号 
>>> content = slice(6, 16)
>>> text[content]
飞凡空间 

七、数值计算

1. abs(x)

返回一个数的绝对值。实参可以是整数或浮点数。如果实参是一个复数,返回它的模。

2. all(iterable)

如果 iterable 的所有元素为真(或迭代器为空),返回 True 。等价于:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True 

3. any(iterable)

如果*iterable*的任一元素为真则返回``True``。如果迭代器为空,返回``False``。等价于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False  

4. divmod(ab)

它将两个(非复数)数字作为实参,并在执行整数除法时返回一对商和余数。对于混合操作数类型,适用双目算术运算符的规则。对于整数,结果和 (a // b, b) 一致。对于浮点数,结果是 (q, b) ,q 通常是 math.floor(a b) 但可能会比 1 小。在任何情况下, b 和 a 基本相等;如果 b 非零,它的符号和 b 一样,并且 <= abs(a b) abs(b) 。

divmod(10, 3)
Out[21]: (3, 1)

5. pow(xy[, z])

返回 x 的 y 次幂;如果 z 存在,则对 z 取余(比直接 pow(x, y) z 计算更高效)。两个参数形式的 pow(x,y) 等价于幂运算符: x**y

参数必须为数值类型。 对于混用的操作数类型,则适用二元算术运算符的类型强制转换规则。 对于 int 操作数,结果具有与操作数相同的类型(转换后),除非第二个参数为负值;在这种情况下,所有参数将被转换为浮点数并输出浮点数结果。 例如,10**2 返回 100,但 10**-2 返回 0.01。 如果第二个参数为负值,则第三个参数必须省略。 如果存在 z,则 x 和 y 必须为整数类型,且 y 必须为非负数。

pow(2,3,7)
Out[26]: 1
pow(2,3)
Out[27]: 8

八、其他

1. exec(object[, globals[, locals]])

这个函数支持动态执行 Python 代码。object 必须是字符串或者代码对象。如果是字符串,那么该字符串将被解析为一系列 Python 语句并执行(除非发生语法错误)。[1] 如果是代码对象,它将被直接执行。在任何情况下,被执行的代码都需要和文件输入一样是有效的(见参考手册中关于文件输入的章节)。请注意即使在传递给 exec() 函数的代码的上下文中,return 和 yield 语句也不能在函数定义之外使用。该函数返回值是 None

无论哪种情况,如果省略了可选参数,代码将在当前范围内执行。如果提供了 globals 参数,就必须是字典类型,而且会被用作全局和本地变量。如果同时提供了 globals 和 locals 参数,它们分别被用作全局和本地变量。如果提供了 locals 参数,则它可以是任何映射型的对象。请记住在模块层级,全局和本地变量是相同的字典。如果 exec 有两个不同的 globals 和 locals 对象,代码就像嵌入在类定义中一样执行。

如果 globals 字典不包含 __builtins__ 键值,则将为该键插入对内建 builtins 模块字典的引用。因此,在将执行的代码传递给 exec() 之前,可以通过将自己的 __builtins__ 字典插入到 globals 中来控制可以使用哪些内置代码。

exec('import os')
os.getcwd()
Out[25]: 'E:\\爬虫\\spider_project'

2. __import__: 动态导入模块

__import__(name, globals=None, locals=None, fromlist=(), level=0)

注解

与 importlib.import_module() 不同,这是一个日常 Python 编程中不需要用到的高级函数。

此函数会由 import 语句发起调用。 它可以被替换 (通过导入 builtins 模块并赋值给 builtins.__import__) 以便修改 import 语句的语义,但是 强烈 不建议这样做,因为使用导入钩子 (参见 PEP 302) 通常更容易实现同样的目标,并且不会导致代码问题,因为许多代码都会假定所用的是默认实现。 同样也不建议直接使用 __import__() 而应该用 importlib.import_module()

该函数会导入 name 模块,有可能使用给定的 globals 和 locals 来确定如何在包的上下文中解读名称。 fromlist 给出了应该从由 name 指定的模块导入对象或子模块的名称。 标准实现完全不使用其 locals 参数,而仅使用 globals 参数来确定 import 语句的包上下文。

level 指定是使用绝对还是相对导入。 0 (默认值) 意味着仅执行绝对导入。 level 为正数值表示相对于模块调用 __import__() 的目录,将要搜索的父目录层数 (详情参见 PEP 328)。

当 name 变量的形式为 package.module 时,通常将会返回最高层级的包(第一个点号之前的名称),而 不是以 name 命名的模块。 但是,当给出了非空的 fromlist 参数时,则将返回以 name 命名的模块。

例如,语句 import spam 的结果将为与以下代码作用相同的字节码:

spam = __import__('spam', globals(), locals(), [], 0)

语句 import spam.ham 的结果将为以下调用:

spam = __import__('spam.ham', globals(), locals(), [], 0)

请注意在这里 __import__() 是如何返回顶层模块的,因为这是通过 import 语句被绑定到特定名称的对象。

另一方面,语句 from spam.ham import eggs, sausage as saus 的结果将为

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage

在这里, spam.ham 模块会由 __import__() 返回。 要导入的对象将从此对象中提取并赋值给它们对应的名称。

如果您只想按名称导入模块(可能在包中),请使用 importlib.import_module()

  

 

 

posted @ 2019-04-12 19:01  DreamBoy_张亚飞  阅读(553)  评论(0编辑  收藏  举报