常用的内置函数

内置函数流程图:https://www.processon.com/view/link/5b4ee15be4b0edb750de96ac

  什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使用的所有函数。

以下我们将列出比较重要的函数:

1、作用域相关的:

  locals   :函数会以字典的类型返回当前位置的全部局部变量。
  globals :函数以字典的类型返回全部全局变量。

def test():
    name = 'wang'
    print(locals())

test()

# 运行结果:
{'name': 'wang'}

 2、字符串执行相关的: eval、exec、compile

  2.1:eval  执行字符串类型的代码,并返回最终结果。

print(eval(‘3+4’))  # 执行字符串里面的代码

运行结果: 7  

ret = eval('{"name":"老司机"}')  # 
print(ret)

执行输出: {'name': '老司机'}

  总结: eval的作用相当于拨开字符串2边的引号,执行里面的代码,在文本输入和字符串转换时常用

  2.2:exec  执行字符串类型的代码,流程语句。

print(exec('3+4'))

执行输出: None


ret1 = '''
li = [1,2,3]
for i in li:
    print(i)
'''
print(exec(ret1))

执行输出:
1
2
3
None


eval和exec 功能是类似的都是拨开引号,执行内部代码:
区别:
1.eval有返回值,exec没有没有值
2.exec适用于有流程控制的,比如for循环。eval只能做一些简单的。
注意在工作中不能使用这个函数。

  2.3:compile:将字符串类型的代码编译。代码对象能够通过exec语句来执行或eval()进行求值。

code1 = 'for i in range(0,3): print (i)'
compile1 = compile(code1,'','exec')     # 固定格式,中间有分隔
exec (compile1)

执行结果:
0
1
2

3、输入输出相关 input、print:

  input;函数接受一个标准输入数据,返回为string类型

  print:打印输出

#print(self, *args, sep=' ', end='
', file=None)
print(333,end='')
print(666,)

执行输出:
333666

# 默认是用空格拼接
print(11, 22, 33)
执行输出:
11 22 33

sep 将每一个字符串拼接起来,这里指定使用|
print(11, 22, 33, sep = '|')

执行输出:
11|22|33

#输出方式,当file = None默认是向屏幕输出
with open('log.txt',encoding='utf-8',mode='w') as f1:
    print('5555',file=f1)

执行程序,查看log.txt文件内容为: 555

4、内存相关 hash  、 id:

  4.1 :id  用于获取对象的内存地址

a = 123
print(id(a))

执行输出:

1500668512

  4.2:hash 获取一个对象(可哈希对象:int、str、Bool、tuple)的哈希值

print(hash(123)) #数字不变
print(hash('123'))  # 字符串会进行hash

执行输出:
123
4876937547014958447

# true和False的哈希值对应1和0

5、模块相关 __import__,它其实使import的原生,import time 类似等于 time =__import__('time')

  __import__ :函数用于动态加载类和函数。适用于代码中

6、调用相关:

  6.1:callable 函数用于检查一个对象是否可调用。如果返回True,object仍然可能调用失败;但是如果返回False,调用对象object绝对不会成功调用

def func1():
    print(555)
a = 3
f = func1
print(callable(f))
print(callable(a))  # 函数或则类的对象的方法,字符串是不行的

执行输出:
True
False

print(callable(print)) # 显然这里是可以调用print的,所以结果是True
# callable其实就是判断一个对象是否是函数,是就返回True,其他类型直接返回False

7、查看内置属性:

  dir:函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。

如果参数包括方法__dir__(),该方法将被调用。如果参数不包括__dir__(),该方法将最大限度地收集参数信息。

print(dir(list))

执行输出:

['__add__', '__class__', '__contains__'...] 

8、迭代器、生成器相关:

  8.1:range 函数可创建于一个整数对象,一般用于在for循环中。

  8.2:next 内部实际使用了__next__方法,返回迭代器的下一个项目。

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it) #next内部封装了__next__方法,都是求下一个值
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

执行输出:

1
2
3
4
5 

   8.3:iter 函数用于生成迭代器(将一个可迭代对象,转化为一个迭代器)。

from collections import Iterable
from collections import Iterator
l = [1,2,3]
print(isinstance(l,Iterable))  # 判断是否可迭代
print(isinstance(l,Iterator))  # 判断是否为迭代器

执行输出:
True
False


from collections import Iterable
from collections import Iterator
l = [1,2,3]
l1 = iter(l) #生成迭代器
print(isinstance(l1,Iterable))
print(isinstance(l1,Iterator))

执行输出:

True
True

9、数字相关:

  9.1:bool 用于将给定参数转化为布尔类型,如果没有参数,返回False。

  9.2:int  用于将一个字符串或数字转换为整型。 

print(int())
print(int('12'))
print(int(3.6))
print(int('0100',base=2))  # 将2进制的 0100 转化成十进制。结果为 4

执行输出:
0
12
3
4

   9.3:float 用于将整数和字符串转化成浮点类型

   9.4:complex 用于创建一个值为 real + imag*j 的复数或者转化一个字符串为复数。如果第一个参数为字符串,则不需要指定第二个参数

print(type(3.14))
print(float(3))

执行输出:

<class 'float'>
3.0

#保留两位小数:
a = 0.005
print(float('%.2f'%a))

执行结果:  0.01

  9.5:进制的转化

    ✴bin:将十进制转换成二进制并返回。
    ✴oct:将十进制转化成八进制字符串并返回。
    ✴hex:将十进制转化成十六进制字符串并返回。

print(bin(5))
print(oct(7))
print(hex(10)) #10用a表示

执行输出:

0b101
0o7
0xa

#数值

print(format(3, 'b')) # 二进制
print(format(97, 'c')) # 转换成unicode字符
print(format(11, 'd')) # 十进制
print(format(11, 'o')) # 八进制
print(format(11, 'x')) # 十六进制(小写字⺟)
print(format(11, 'X')) # 十六进制(大写字⺟)
print(format(11, 'n')) # 和d一样
print(format(11)) # 和d一样

#浮点

print(format(123456789, 'e')) # 科学计数法. 默认保留留6位小数
print(format(123456789, '0.2e')) # 科学计数法. 保留留2位小数(小写)
print(format(123456789, '0.2E')) # 科学计数法. 保留留2位小数(大写)
print(format(1.23456789, 'f')) # 小数点计数法. 保留留6位小数
print(format(1.23456789, '0.2f')) # 小数点计数法. 保留留2位小数
print(format(1.23456789, '0.10f')) # 小数点计数法. 保留留10位小数
print(format(1.23456789e+10000, 'F')) # 小数点计数法.

10、数学运算:

    ✴abs:函数返回数字的绝对值。
    ✴divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。
     round:保留浮点数的小数位数,默认保留整数。
     pow:求x**y次幂。(三个参数为x**y的结果对z取余)

print(abs(-20)) #绝对值     执行输出: 20

print(divmod(10,3)) #计算除数与被除数的结果    执行输出:(3, 1)

print(round(3.1415))   #默认取整  执行输出: 3
print(round(3.1415,2))   # 保留两位   3.14

print(pow(2,3,5)) #求x**y次幂(三个参数为x**y的结果对z取余)
#解释:这里为3个参数,2的3次方,结果为8。用8和5做除法,取余为3,最终输出3

✴✴✴sum:对可迭代对象进行求和计算(可设置初始值)。
✴✴✴min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值)。
✴✴✴max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)。

print(sum([1,2,3,4]))  # 10
#注意,sum最多只有2个参数,且里面必须是可迭代对象。

ret = max([1,2,-5],key=abs) # 按照绝对值的大小,返回此序列最大值
print(ret)     # 结果 -5  key表示定义规则

 ret = max([1,2,-5],key=lambda x:x>1)
 print(ret)   # 2

 11、和数据结构相关:

列表和元祖
    ✴✴✴list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)。
    ✴✴✴tuple:将一个可迭代对象转化成元祖(如果是字典,默认将key作为元祖的元素)。

相关内置函数
     ✴✴✴reversed:将一个序列翻转,并返回此翻转序列的迭代器。
     slice:构造一个切片对象,用于列表的切片。

ite = reversed(['a',2,3,'c',4,2])
for i in ite:
    print(i)

执行输出:
2
4
c
3
2
a

li = ['a','b','c','d','e','f','g']
sli_obj = slice(3)     #从0切到3
print(li[sli_obj])

执行输出: 
['a', 'b', 'c']
如果有10个列表,统一切前3个,sli_obj可能有点用

slice几乎用不到
slice可以定义一个切片规则

12、字符串相关:

  ✴✴✴str:将数据转化成字符串。
  ✴✴✴format:用于格式化输出。

字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐

print(format('test', '<20'))
print(format('test', '>20'))
print(format('test', '^20'))

执行输出
test               
                test
        test  


  ✴✴✴bytes:用于不同编码之间的转化
# 编码转换,将unicode转换为utf-8
#方法一
s1 = '老司机'
s2 = s1.encode('utf-8')
print(s2)
#print(s2.decode('utf-8')) #解码

执行输出:
b'xe8x80x81xe5x8fxb8xe6x9cxba'

#方法二
s1 = '老司机'
print(bytes(s1,encoding='utf-8'))  # 结果于上一致

   总结:bytes:只能编码,将unicode--->非unicode,不能解码

***bytearry:返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。

ret = bytearray('alex',encoding='utf-8') #4个字母对应的ascii顺序[97,108,101,120]
print(id(ret))
print(ret)
print(ret[0]) #97 是ascii码的顺序
ret[0] = 65 #65是大写a的位置
print(ret)
print(id(ret))

执行输出:
2177653717736
bytearray(b'alex')
97
bytearray(b'Alex')
2177653717736


***memoryview:本函数是返回对象obj的内存查看对象。所谓内存查看对象,就是对象符合缓冲区协议的对象,为了给别的
代码使用缓冲区里的数据,而不必拷贝,就可以直接使用。 ret
= memoryview(bytes('你好',encoding='utf-8')) print(len(ret)) # utf-8的bytes类型,放在一个list中 [xe4,xbd,xa0,xe5,xa5,xbd] print(ret) print(bytes(ret[:3]).decode('utf-8')) print(bytes(ret[3:]).decode('utf-8')) print('你好'.encode('utf-8')) 执行输出: 6 <memory at 0x0000016FD6AC0108> 你 好 b'xe4xbdxa0xe5xa5xbd' ✴ord:输入字符找该字符编码的位置 ✴chr:输入位置数字找出其对应的字符 ascii:是ascii码中的返回该值,不是就返回u... print(ord('a')) #ascii码的位置 print(chr(98)) #98对应a print(ord('')) #按照unicode查找 print(ascii('')) #不是ascii码就返回u... 执行输出: 97 b 20013 'u4e2d' ✴✴✴repr:返回一个对象的string形式(原形毕露)。 #%r 原封不动的写出来 name = 'taibai' print('我叫%r' % name) #repr 原形毕露 print(repr('{"name":"alex"}')) print('{"name":"alex"}') 执行输出: 我叫'taibai' '{"name":"alex"}' {"name":"alex"}

 13、数据集合:

  ✴✴✴dict:创建一个字典。
  ✴✴✴set:创建一个集合。
  frozenset:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
  相关内置函数
      ✴✴✴len:返回一个对象中元素的个数。
      ✴✴✴sorted:对所有可迭代的对象进行排序操作。

li = [1,2,7,8,5,4,3]
print(sorted(li)) #默认升序

执行输出:
[1, 2, 3, 4, 5, 7, 8]

#改变默认值排序:
li = [1,-2,-7,8,5,-4,3]
print(sorted(li,reverse=True,key=abs))

执行输出:
[8, -7, 5, -4, 3, -2, 1]

✴✴✴enumerate:枚举,返回一个枚举对象。 (0, seq[0]), (1, seq[1]), (2, seq[2])

li = ['jack', 'rose', 'wusir', '嫂子', '老司机']
print(enumerate(li))
print('__iter__' in dir(enumerate(li)))
print('__next__' in dir(enumerate(li)))

执行输出:
<enumerate object at 0x00000223DD887828>
True
True

#enumerate 是一个迭代器:
li = ['jack', 'rose', 'wusir', '嫂子', '老司机']
for i in enumerate(li):
    print(i)

执行输出:
(0, 'jack')
(1, 'rose')
(2, 'wusir')
(3, '嫂子')
(4, '老司机')

返回结果为:列表元素的索引以及对应的值

#enumerate的第2个参数,表示从多少开始。默认从1开始
li = ['jack', 'rose', 'wusir', '嫂子', '老司机']
for k,v in enumerate(li,10):
    print(k,v)

执行输出:
10 jack
11 rose
12 wusir
13 嫂子
14 老司机

  ✴all:可迭代对象中,全都是True才是True
  ✴any:可迭代对象中,有一个True 就是True

print(all([1,2,True,0]))
print(any([1,'',0]))

执行输出:
False
True

 ✴✴✴zip:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同
print('__iter__' in dir(zip(l1,l2,l3,l4)))
print('__next__' in dir(zip(l1,l2,l3,l4)))

执行输出:
True
True

zip也是一个迭代器
zip 拉链方法 形成元组的个数与最短的可迭代对象的长度一样

l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c', 5]
l3 = ('*', '**', (1,2,3), 777)
z = zip(l1,l2,l3)
for i in z:
    print(i)

执行输出:
(1, 'a', '*')
(2, 'b', '**')
(3, 'c', (1, 2, 3))
(4, 5, 777)

我们把list当做列向量来看就很好理解了,zip就是拉链,把一件挂着的衣服拉起来。这就是zip的功能。所以
当做列向量看,就是拉起来的拉链了。
而转置的z就是把拉链放水平,多形象!

#注意:zip结果取决于最短的一个,返回的数据是元组
面试题,必考zip

 14、补充的最重要的几个内置方法:需要注意的时,以下的函数他们都为我们实现了循环取值的功能。所以搭配着lamada函数会很好使用。

✴✴✴filter:过滤·。
    filter 过滤 通过你的函数,过滤一个可迭代对象,返回的是True
类似于[i for i in range(10) if i > 3]
#取列表中的偶数
def func(x):
    return x % 2 == 0
ret = filter(func,[1,2,3,4,5,6,7])  # 通过一个函数过滤,不需要一个个的取,自带的
print(ret)
for i in ret:
    print(i)
执行输出:
<filter object at 0x0000021325A4B6D8>
2
4
6
2、li = [1,2,3,4]
print(list(filter(lambda x:x>2,li))) #[3,4]

✴✴✴map:会根据提供的函数对指定序列做映射。(map也是一个迭代器)
map相当于列表生成式循环模式
1、
def square(x): #计算平方数
    return x ** 2
ret = map(square,[1,2,3,4,5]) #计算列表各个元素的平方
for i in ret:
    print(i)
执行输出:
1 4 9 16 25

2、li = [1,2,3,4,5]
print(list(map(lambda x:x+10,li))) #[11, 12, 13, 14, 15]

✴✴✴reduce:

从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个单一值。

例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])  计算的就是((((1+2)+3)+4)+5)。

如果提供了 initial 参数,计算时它将被放在序列的所有项前面,如果序列是空的,它也就是计算的默认结果值了

from functools import reduce
li = [1,2,3,4,5]
def func(x,y):   # x=12345
  return x*10+y    # reduce 是做累计算的

print(reduce(func,li)) 

###匿名函数:
匿名函数:为了解决那些功能很简单的需求而设计的一句话函数.

#返回一个数的平方
使用函数方式:
def func1(x):
return x ** 2
使用匿名函数一行搞定:
func = lambda x:x ** 2
print(func(5)) # 结果 25

 

上面是我们对calc这个匿名函数的分析,下面给出了一个关于匿名函数格式的说明

函数名 = lambda 参数 :返回值
 
#参数可以有多个,用逗号隔开
#匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
#返回值和正常的函数一样可以是任意数据类型

fun = lambda x,y:x+y
print(fun(1,3))   # 结果 4

# lambda单独拿出来,没有啥意义
主要是和内置函数结合使用

lambda 函数与内置函数的结合。
sorted,map,fiter,max,min,reversed.
#例1
dic={'k1': 10, 'k2': 100, 'k3': 30}
print(max(dic, key=lambda x: dic[x]))  #执行结果 k2

x表示dic的key,返回值就是dic[x] 也就是dic的value
lambda就是字典的value ,注意这里的dic,就是字典的键

#例2
res = map(lambda x:x**2,[1,5,7,4,8])
#print(res)
for i in res:
    print(i)

执行输出:
1
25
49
16
64

15、递归:在函数中调用本身就是递归

def func():
    print("我是谁")
    func()
func()

在python中递归的深度最大到998
def foo(n):
    print(n)
    n += 1
    foo(n)
foo(1)        # 1、2……996

实例1:查看文件夹中的所有文件名:

import os
def read(filepath, n):
    files = os.listdir(filepath) # 获取到当前文件夹中的所有文件
    for fi in files: # 遍历⽂件夹中的⽂件, 这⾥获取的只是本层文件名
        fi_d = os.path.join(filepath,fi) # 加⼊文件夹 获取到⽂件夹+⽂件
        if os.path.isdir(fi_d): # 如果该路径下的文件是文件夹
            print("	"*n, fi) # 	就是缩进几个
            read(fi_d, n+1) # 继续进⾏相同的操作
        else:
            print("	"*n, fi) # 递归出口. 最终在这里隐含着return
#递归遍历目录下所有⽂文件
read('..', 0)
1.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
name=['oldboy','alex','wusir']
print(list(map(lambda x:x+'_sb',name)))

2、用map来处理下述l,然后用list得到一个新的列表,
列表中每个人的名字都是sb结尾
l=[{'name':'alex'},{'name':'y'}]
print(list(map(lambda x:x['name']+'_sb',l)))

3、用filter来处理,得到股票价格大于20的股票名字
shares={
    'IBM':36.6,
    'Lenovo':23.2,
   'oldboy':21.2,
    'ocean':10.2,
 }
print(list(filter(lambda x:shares[x]>20,shares)))

4、有下面字典,得到购买每只股票的总价格,并放在一个迭代器中。
结果:list一下[9110.0, 27161.0,......]
portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}]

print(list(map(lambda x:x['shares']*x['price'],portfolio)))

5、有下列三种数据类型,
写代码,最终得到的是(每个元祖第一个元素>2,第三个*至少是4个。)
 [(3, 'wusir', '****'), (4, '太白', '*******')]这样的数据。

l1 = [1,2,3,4,5,6]
l2 = ['oldboy','alex','wusir','太白','日天']
tu = ('**','***','****','*******')
z=list(zip(l1,l2,tu))
print(z)

6、
v =lambda :3
print(v())  #3

7、有两个字符串列表,a和b,每个字符是由逗号分隔的一些字符,(升级题)尽量做得支持扩展
a = [
'a,1',
'b,3,22',
'c,3,4',
'f,5',
]
b=[
'a,2,1',
'b,4',
'd,2',
'e,12',
'g,12,43',
'a,4354,6'
]
# 按每个字符串的第一个值,合并a和b到c
# c = [
# 'a,1,2',
# 'b,3,22,4',
# 'c,3,4',
# 'd,2',
# 'e,12',
# 'f,5'
# ]

if len(b)>len(a):
    a,b = b,a
c=[]
for i in a:
    flag = False
    removes = None
    i = i.strip()
    li=[i[0],i[2:],]
    for v in b:
        v=v.strip()
        if i[0]==v[0]:
            li.append(v[2:])
            flag,removes=True,v
            break
    print(li)
    c.append(','.join(li))
    if flag:
        b.remove(removes)
else:
    c.extend(b)

print(c)
内置函数例题
1.max的用法
import re
reg = re.compile('a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*')
#返回一个字符串里按字母表排序的最长子字符串
def longest(s):
    print(reg.findall(s))
#['abcde', 'ap', 'bcdef', '']
    return max(reg.findall(s), key=len)  # 此函数名必是返回一个整数的,可自定义函数
#加或不加效果相同
print(longest('abcdeapbcdefgh'))

#结果
['abcde', 'ap', 'bcdefgh', '']
bcdefgh

2.compile的用法
str = "for i in range(0,10): print(i)"
c = compile(str,'','exec')
print(c)  #<code object <module> at 0x10141e0b0, file "", line 1>

exec(c)  #打印0,1,3.....

3.eval的用法
a=1
g={'a':20}
print(eval("a+1",g))  #对全局变量g进行操作  返回21
误区

 实例2:二分法查找

# 另类二分法, 很难计算位置.
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]

def binary_search(ls, target):
    left = 0
    right = len(ls) - 1
    if left > right:
        print("不不在这里")
    middle = (left + right) // 2
    if target < ls[middle]:
        return binary_search(ls[:middle], target)
    elif target > ls[middle]:
        return binary_search(ls[middle+1:], target)
    else:
        print("在这里")

binary_search(lst, 567)        
1.下面程序的输出结果是:
d = lambda p:p*2
t = lambda p:p*3
x = 2
x = d(x)
x = t(x)
x = d(x)
print (x)  #24

2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
#答案一
test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
print(test(t1,t2))
#答案二
print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
#还可以这样写
print([{i:j} for i,j in zip(t1,t2)])

3.以下代码的输出是什么?请给出答案并解释。
def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
请修改multipliers的定义来产生期望的结果。

#3.以下代码的输出是什么?请给出答案并解释。
def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
#请修改multipliers的定义来产生期望的结果
#第一问 :[6,6,6,6]
#第二问 :
def multipliers():
     return (lambda x:i*x for i in range(4)) # 不需要yield因为,for必须在推导式内也就是说必须有括号
         # for i in range(4):
         #     yield lambda x:i*x
print([m(2) for m in multipliers()])  #[2,4,6]
面试题

 

原文地址:https://www.cnblogs.com/double-W/p/9765234.html