python之路17--之内置函数与匿名函数

一、内置函数

1、内置函数说明

        截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使用的所有函数。这些函数有些我们已经用过了,有些我们还没用到过,还有一些是被封印了,必须等我们学了新知识才能解开封印的。那下面我们就一起来认识一下python的内置函数。

上面就是内置函数的表,68个函数都在这儿了。这个表的顺序是按照首字母的排列顺序来的,

下面我们就总六个方面说一下这些内置函数,

1、作用域相关的内置函数(2个)

基于字典的形式获取局部变量和全局变量

globals()——获取全局变量的字典

print(globals())       #返回全局作用域中所有变量及操作方法的名字

locals()——获取执行本方法所在命名空间内的局部变量的字典

print(locals())        #返回本地作用域中所有变量及操作方法的名字

说明:这两个内置函数和关键字global、nonlocal不一样,global、nonlocal是关键字

2、其他类内置函数(12个)

dir()  ---- 查看内置属性

print(dir(str))       #打印字符串类型的所有内置操作方法

callable() ---- 调用相关

print(callable(print))          #这里返回为True,因为print是一个内置函数,执行方法为:print()a = 1print(callable(a))           #这里就返回了一个False,因为a不是函数,不可以a()这么执行
总结:callable:判断这个方法是不是一个可调用的函数,是则返回True,不是则返回False

help() ---- 帮助

help(str)              #查看字符串类型的帮助

import ---- 模块相关

impoort time         #import是调用__import__(time)方法
说明:import:调用模块,实际是调用__import__()函数

open() ---- 文件相关     #必会

两种打开文件的方法:
1、
f = open('file',mode='r',encoding='utf-8')      #f = open(文件,打开方法,字符集)
2、
with open('file',mode='r',encoding='utf-8') as f:     #with open(文件,打开方法,字符集) as f:

内存相关(id、hash)

id() ---- 查看变量的内存地址

id(变量名)       #返回的结果是该变量的内存地址

hash() ---- 判断数据类型可不可hash       #必会

判断数据类型可不可以hash,对于相同可hash数据的hash值再一次程序的执行过程中总是不变的
print(hash(123))            #可hash
print(hash(('k','v')))      #可hash
print(hash([]))            #列表是不可以hash的,报错TypeError: unhashable type: 'list'

input() ---- 用户输入        #必会

chioce = input("please input >>:")            #用户输入,输入后得到的数据类型都是字符串类型,

print() ---- 输出        #必会

print("www.yisou.co\n",end='')          #print()里默认有end参数,默认end参数的值是回车,这里指定end为空
print(1,2,3,4,sep='*')                      #sep:指定输出的分割符,结果为:1*2*3*4

#print()实现写文件的操作
f = open('file','w')
print("yisou.co",file=f)             #fiel=:指定输出的位置,表示将yisou.co字符串写入到file这个文件中了
f.close()

#使用print实现进度条
#自带的打印进度条的模块:progress Bar
import time
for i in range(0,101,2):    #打印0-100个数,间隔是2
    time.sleep(0.1)          #睡眠1秒
    char_num = i//2        #打印多少个*
    per_str = '\r%s%% : %s\n' %(i, '#' * char_num) if i == 100 else '\r%s%% : %s' %(i,'#' * char_num)      #\r不换行回到行首
    print(per_str,end='',flush=True)              #flush:立即把内容输出不做缓存

字符串类型的代码执行(exec、eval、compile)

print(exec('1+2+3'))          #exec:可以计算结果,没有返回值,结果为:None
print(eval('1+2+3'))          #eval:可以计算结果,有返回值,结果为:6,尽量少用(不安全),明确知道要执行的代码是什么的时候可以用,否则少用
#eval:适合处理有结果的简单计算
#exec:适合处理简单流程控制

code = '''for i in range(10):
          print("**",i)'''
exec(code)

compile

compile说明:
1. 参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。  

2. 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。  

3. 参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。
#1、流程控制语句
code1 = 'for i in range(0,10): print (i)'
compile1 = compile(code1,'','exec')
exec (compile1)

#2、简单求值表达式语句
code2 = '1 + 2 + 3 + 4'
compile2 = compile(code2,'','eval')
print(eval(compile2))

#3、交互语句用single
code3 = 'name = input("please input your name:")'
compile3 = compile(code3,'','single')
exec(compile3) #执行时显示交互命令,提示输入
print(name)   #执行后name变量有值

3、数据相关

3.1、数据类型相关(四个)

bool() ---- 布尔值         #必会

bool(1)      #结果为True,不为零的数转换为布尔值都是True、零为False

int() ---- 整型          #必会

str1 = '1234'
str2 = int(str1)            #将字符串类型转换为整型,前提字符串类型必须都是数字才可以转换,否则会出错

float() ----浮点数          #必会

浮点数 :有限循环小数和无限循环小数属于浮点数,无限不循环小数不属于浮点数

complex() ---- 复数

虚数:虚无缥缈的数,python中的虚数用j表示
5 + 12j(5*1 + 12*j) :复数,复数之间是不能比较大小的           #虚部,实部
3.2、进制转换

bin() ---- 转换为二进制

print(bin(10))          #将10转换成二进制,0b:代表二进制

oct() ---- 转换为八进制

print(oct(10))          #将10转换成八进制,0o:代表八进制

hex() ---- 转换为十六进制

print(hex(10))          #将10转换成十六进制,0x:代表十六进制
3.3、数学运算

abs() ---- 计算绝对值

#求绝对值(绝对值:负的转正的,正的还是正的)
print(abs(-5))           #结果为5

divmod() ---- 除\余运算

#除余方法:divmod : div:除法,mod:取余
print(divmod(7,2))        #(3, 1):7除以2等于3,余1
print(divmod(9,5))        #(1, 4):9除以5等于1,余4

round() ----小数精确

print(round(3.141592657,2))         #将圆周率精确到两位小数,结果为:3.14

pow() ---- 幂运算

print(pow(2,3))      #传两个参数就是求幂运算,pow(2,3):2*2*2结果为:8
print(pow(3,2,2))    #传三个参数就是先求幂,然后再取余,pow(3,2,2):3*3%2结果为:1

sum() ---- 求和运算           #必会

ret = sum([1,2,3,4,5])       #求和运算,sum(必须为可迭代类型,可迭代类型里面必须为数字),结果为:15
ret = sum([1,2,3,4,5],10)      #结果为25,就是前面的值计算完后加后面的值

min() ---- 求最小值           #必会

print(min([-4,1,2,3,4]))         #获取min()括号里面的最小值,结果为:-4
print(min(1,2,3,-4,key = abs))    #以绝对值的形式来判断最小值,结果为:1

max() ---- 求最大值          #必会

print(max([-2,1,5,3,4]))          #获取max()括号里面的最大值,结果为:5
print(max(1,2,3,4,-6,key = abs))   #一绝对值的形式来判断最大值,结果为:-6,

4、数据结构相关

reverse() ---- 列表倒叙
l = [1,2,3,4]
l.reverse()             #列表的反转
l2 = reversed(l)        #保留原列表,返回一个反向的迭代器
print(l,"333",l2)        #结果为:[4, 3, 2, 1] 333 <list_reverseiterator object at 0x00000164C6211EB8>

slice() ---- 切片

l = (1,2,23,213,5612,342,43)
sli = slice(1,5,2)       #切片,从第一个到切到第五个,步长是2
print(l[sli])         #结果为:(2, 213)
print(l[1:5:2])        #列表自带的切片方法,从第一个到切到第五个,步长是2,结果为:(2, 213)

format() ---- 格式换输出          #必会,       参考博客地址:www.cnblogs.com/Eva-J/articles/7266245.html

#字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐
print(format('test', '<20'))
print(format('test', '>20'))
print(format('test', '^20'))

#整形数值可以提供的参数有 'b' 'c' 'd' 'o' 'x' 'X' 'n' None
>>> format(3,'b') #转换成二进制
'11'
>>> format(97,'c') #转换unicode成字符
'a'
>>> format(11,'d') #转换成10进制
'11'
>>> format(11,'o') #转换成8进制
'13'
>>> format(11,'x') #转换成16进制 小写字母表示
'b'
>>> format(11,'X') #转换成16进制 大写字母表示
'B'
>>> format(11,'n') #和d一样
'11'
>>> format(11) #默认和d一样
'11'

#浮点数可以提供的参数有 'e' 'E' 'f' 'F' 'g' 'G' 'n' '%' None
>>> format(314159267,'e') #科学计数法,默认保留6位小数
'3.141593e+08'
>>> format(314159267,'0.2e') #科学计数法,指定保留2位小数
'3.14e+08'
>>> format(314159267,'0.2E') #科学计数法,指定保留2位小数,采用大写E表示
'3.14E+08'
>>> format(314159267,'f') #小数点计数法,默认保留6位小数
'314159267.000000'
>>> format(3.14159267000,'f') #小数点计数法,默认保留6位小数
'3.141593'
>>> format(3.14159267000,'0.8f') #小数点计数法,指定保留8位小数
'3.14159267'
>>> format(3.14159267000,'0.10f') #小数点计数法,指定保留10位小数
'3.1415926700'
>>> format(3.14e+1000000,'F')  #小数点计数法,无穷大转换成大小字母
'INF'

#g的格式化比较特殊,假设p为格式中指定的保留小数位数,先尝试采用科学计数法格式化,得到幂指数exp,如果-4<=exp<p,则采用小数计数法,并保留p-1-exp位小数,否则按小数计数法计数,并按p-1保留小数位数
>>> format(0.00003141566,'.1g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点
'3e-05'
>>> format(0.00003141566,'.2g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留1位小数点
'3.1e-05'
>>> format(0.00003141566,'.3g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留2位小数点
'3.14e-05'
>>> format(0.00003141566,'.3G') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点,E使用大写
'3.14E-05'
>>> format(3.1415926777,'.1g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留0位小数点
'3'
>>> format(3.1415926777,'.2g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留1位小数点
'3.1'
>>> format(3.1415926777,'.3g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留2位小数点
'3.14'
>>> format(0.00003141566,'.1n') #和g相同
'3e-05'
>>> format(0.00003141566,'.3n') #和g相同
'3.14e-05'
>>> format(0.00003141566) #和g相同
'3.141566e-05'

bytes() ---- 转换为bytes类型      #必会

print(bytes('www.yisoutv.com',encoding='utf-8'))          #unicode转换成utf-8的bytes,结果为:b'www.yisoutv.com'
print(bytes('易 搜 tv',encoding='gbk'))                   #unicode转换成gbk的bytes     结果为:b'\xd2\xd7 \xcb\xd1 tv'
#网络编程:只能用二进制
#照片和视频也是以二进制存储
#html网页爬取到的也是编码

bytearray() 

b_array = bytearray('你好',encoding='utf-8')
print(b_array)          #16进制
print(b_array[0])       #将十六进制转换为10进制

memoryview() ---- 切片:以字节的形式展现出来(不占用内存空间),但是如果想看内容就会转换成字符串的形式(又占用内存空间了)

ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret))
print(bytes(ret[:3]).decode('utf-8'))
print(bytes(ret[3:]).decode('utf-8'))

ord() ---- 字符按照unicode转换为数字

print(ord(''))      #结果为:25628
print(ord('b'))       #结果为:98

chr() ---- 数字按照unicode转换为字符

print(chr(98))

ascii() ---- 只要是ascii码中的内容就打印出来,不是就转换为\u

print(ascii(''))          #结果为:'\u641c'
print(ascii('1'))           #结果为:'1'

repo() ---- 打印类型的符号

print(repr([1,2]))       #结果为:[1, 2]
# print(repr('1'))        #结果为:'1'
# print(repr(1))          #结果为:1

dict() ---- 字典

set() ---- 集合

frozenset() ---- 不可变集合

5、重要的内置函数

 len() ---- 计算长度

print(len('str'))      #结果为3

enumerate() ---- 枚举

shopping_list = [
    ("电脑",5000),
    ("鼠标",100),
    ("茶叶",80),
    ("键盘",1000)
]
for k, v in enumerate(shopping_list):
                print(k+1, v)
结果为:
1 ('电脑', 5000)
2 ('鼠标', 100)
3 ('茶叶', 80)
4 ('键盘', 1000)

all() ---- 接收一个可迭代的类型,该可迭代的类型里有一个False则为False,全为True则返回True

print(all(['a','',123]))        #结果为False,‘’空字符串为False
print(all(['a',123]))           #结果为True
print(all([0,123]))             #结果为False,0为False

any() ---- 接受一个可迭代类型,该可迭代类型里有一个True则为True,全是False则为False

print(any(['',True,0,[]]))       #结果True,因为该可迭代类型里有一个True

zip() ---- 组合方法,同时又叫拉链方法,将集合数据类型合并,以最短的为基准合并为元组

l = [1,2,3,4,5]
l2 = ['a','b','c']
l3 = (1,2,['1','2'],"*","**")for i in zip(l,l2,l3):
    print(i)
结果为:
(1, 'a', 1)
(2, 'b', 2)
(3, 'c', ['1', '2'])

filter()         

#filter和map函数的相关博客地址:http://www.cnblogs.com/Eva-J/articles/7266192.html

1、使用filter过滤奇数
def is_oss(x):
    return x % 2 == 1
ret = (filter(is_oss,[1,4,6,7,9,12,17]))          #filter(函数,可迭代类型)
print(ret)         #返回值是一个迭代器
for i in ret:
    print(i)        #结果为:1,7,9,17

#2、使用filter过滤字符串
def is_str(s):
    if type(s) == str:            #简写:return type(s) == str
        return s
ret = (filter(is_str,[1,4,6,'yisou',7,9,12,17]))          #filter(函数,可迭代类型)
print(ret)          #返回值是一个迭代器
for i in ret:
    print(i)        #结果为:yisou

#3、去除空格
def is_str(s):
    return s and str(s).strip()
ret = filter(is_str,[1,'hello','','  ',None,[],6,'world'])
print(ret)          #返回值是一个迭代器
for i in ret:
    print(i)

map()

1、打印绝对值
ret = map(abs,[1,-4,6,-8])      #map(函数名,可迭代类型)
print(ret)
for i in ret:
    print(i)

2、处理字符串,在字符串后面加上_sb
name = ['yisou','qiyi','111','zhangsan']
def func(item):          #定义函数
    return item+'_sb'       #函数做什么
ret = map(func,name)        #map(函数名,可迭代类型)
for i in ret:
    print(i)
结果为:
yisou_sb
qiyi_sb
111_sb
zhangsan_sb

总结:filter:执行了filter之后的结果集合<=执行前的个数, map:执行前后元素个数不变,值可能发生改变

sort() ---- 在原列表的基础上排序

l = [1,-4,6,5,-10]
l.sort(key = abs)
print(l)      #结果为:[1,-4,6,5,-10]

sorted() ---- 在原列表的基础上生成一个新列表

#使用场景:列表不大的情况下,想要保留原列表,同时想对列表进行排序
l = [1,-4,6,5,-10]
print(sorted(l))          #结果为:[-10, -4, 1, 5, 6]
print(sorted(l,key=abs,reverse=True))        #reverse=True:反转     结果为:[-10, 6, 5, -4, 1]

2、按照字符串的长度排序
l = ['***',[1,2],'hello world']
new_l = sorted(l,key=len)
print(new_l)        #结果为:[[1, 2], '***', 'hello world']
5、五个带有key字段的内置函数

max、min、filter、map、sorted

使用方法:

1、max()

print(max(1,2,3,4,-6,key = abs))   #一绝对值的形式来判断最大值,结果为:-6,

2、min()

print(min(1,2,3,-4,key = abs))    #以绝对值的形式来判断最小值,结果为:1

3、filter()

打印偶数
num = [1,3,5,6,7,8]
def func(ou):
    if ou % 2 == 0:
        return ou
ret = filter(func,num)        #filter(函数,可迭代类型),将可迭代类型当参数传给函数,返回值为:迭代器
for i in ret:
    print(i)       #结果为:6,8   

4、map()

在字符串后加_sb
name = ['yisou','qiyi','111','zhangsan']
def func(item):
    return item+'_sb'
ret = map(func,name)                #ret是一个迭代器
for i in ret:
    print(i)
结果为:
yisou_sb
qiyi_sb
111_sb
zhangsan_sb

5、sorted()

l = ['***',[1,2],'hello world']
new_l = sorted(l,key=len)
print(new_l)        #结果为:[[1, 2], '***', 'hello world']

二、匿名函数

匿名函数:为了解决那些功能很简单的需求而设计的一句话函数,参考博客地址:www.cnblogs.com/Eva-J/articles/7206498.html

匿名函数格式说明:函数名 = lambda 参数1,参数2:返回值1+返回值2                   #参数可以是一个或多个,多个用,逗号隔开

画图说明:

1、一个简单的乘法运算的匿名函数

num1 = lambda x:x*x
print(num1(3))         #结果为:9

2、加法运算

test = lambda x,y:x+y
print(test(1,2))

匿名函数总结:

             1、匿名函数写法
函数名 = lambda 参数1,参数2:返回值
参数可以有一个到多个,用逗号隔开
匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
返回值和正常函数一样可以是任意数据类型
带参数key得内置函数有:max min filter map sorted 都可以和lambda合作使用

3、判断字典里values最大的key

dic = {'k1':10,'k2':100,'k3':30}
print(max(dic,key=lambda k:dic[k]))

4、列表中的每个值求平方

ret = map(lambda x:x**2,[1,2,3,6,7])
for i in ret:
    print(i)

5、筛选列表中大于10的数字

ret = filter(lambda x:x>10,[5,8,11,9,26])
for i in ret:
    print(i)

6.1、求最终结果

d = lambda p:p*2
# t = lambda p:p*3
# x = 2
# x = d(x)   #x = 4
# x = t(x)   #x = 12
# x = d(x)   #x = 24
# print(x)         #结果为:24

6.2、现在有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]

print(list(map(lambda d:{d[0]:d[1]},zip((('a'),('b')),(('c'),('d'))))))         #结果为:[{'a': 'c'}, {'b': 'd'}]

7、求结果

def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
结果为:[6,6,6,6]

说明:

平时工作中相对更常用的方法推荐一下,请务必重点掌握:

其他:input,print,type,hash,open,import,dir

str类型代码执行:eval,exec

数字:bool,int,float,abs,divmod,min,max,sum,round,pow

序列——列表和元组相关的:list和tuple

序列——字符串相关的:str,bytes,repr

序列:reversed,slice

数据集合——字典和集合:dict,set,frozenset

数据集合:len,sorted,enumerate,zip,filter,map

参考文档:

  https://docs.python.org/3/library/functions.html#object

                              

 

posted @ 2018-08-18 15:25  欧-阳  阅读(189)  评论(0)    收藏  举报