Python学习(八) —— 内置函数和匿名函数
一、递归函数
定义:在一个函数里调用这个函数本身
递归的最大深度:997
def func(n): print(n) n += 1 func(n) func(1)
import sys print(sys.setrecursionlimit(10000))
二、内置函数
python提供了68个内置函数
1.作用域相关的内置函数:globals,locals
def func(): a = 1 b = 2 print(globals()) #查看全局变量 print(locals()) #查看局部变量 func()
2.迭代器/生成器相关的内置函数:range,iter,next
a = range(1,100,2) #range是可迭代对象 b = iter(a) #iter得到迭代器 print(next(b)) #打印迭代器第一个元素 print(next(b)) #打印迭代器下一个元素
3.查看内置属性:dir
print(dir(1)) print(dir('abc')) print(dir(list))
4.判断函数是否可以调用:callable
def a():print(1) print(callable(a))
5.帮助:help
help(list)
help(str)
6.导入模块:import
import os import time import copy
7.打开文件:open
with open('abc','r',encoding='utf-8') as f: print(f.read())
8.内存相关的内置函数:id,hash
print(id('123')) #打印内存地址 print(id([1,2,3])) #打印内存地址 print(hash((1,2,3))) #打印哈希值 print(hash([1,2,3])) #报错
9.输入输出相关的内置函数:input,print
content = input('请输入内容:') #input:与用户交互 print(content) print('abc','def',sep='*',end='') #sep=以...为分隔,end=以...为结尾 print('ghj') #打印进度条 import time for i in range(0,101,2): time.sleep(0.1) n = i // 2 a = '\r%d%% : %s\n'%(i,'*'*n) if i == 100else '\r%d%% : %s'%(i,'*'*n) print(a,end='',flush=True) #flush把光标移动到最前面,以空字符结尾
10.字符串类型代码的执行:exec,eval,compile
eval()将字符串类型的代码执行并返回结果
exec()将字符串类型的代码执行
compile()将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval语句进行求值
参数说明:
1. 参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。
2. 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。
3. 参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。
code1 = '1+2+3' code2 = "print('abc')" print(eval(code1),eval(code2)) print(exec(code1),exec(code2)) # abc # 6 None # abc # None None
#流程语句使用exec code1 = """ for i in range(10): if i % 2 == 1: print(i) """ compile1 = compile(code1,'','exec') exec(compile1) #简单求值表达式用eval code2 = '1+2+3+4' compile2 = compile(code2,'','eval') print(eval(compile2)) #交互语句用single code3 = "name = input('请输入命令:')" compile3 = compile(code3,'','single') eval(compile3) print(name)
11.数字的数据类型相关:bool,int,float,comple(布尔值,整数,浮点数,复数)
print(type(True)) print(type(123)) print(type(123.0)) print(type(12+3j)) #<class 'bool'> #<class 'int'> #<class 'float'> #<class 'complex'>
12.进制转换相关:bin,ort,hex(二进制,八进制,十六进制)
print(bin(20)) #0b10100 print(oct(20)) #0o24 print(hex(20)) #0x14
13.数学运算相关:abs(求绝对值),divmod(求商余),round(精确小数),pow(幂运算)
print(abs(-3)) #3 print(divmod(5,3)) #(1,2) print(round(3.14159,4)) #3.1416 print(pow(2,3)) #8
14.计算总数:sum(iterable,start=0)
print(sum([1,2,3],2)) #2+1+2+3 = 8 print(sum((4,5,6,7),10)) #10+4+5+6+7 print(sum((),5)) #5
15.计算最大值:max(iterable,key=,default=)、max(*args,key=)
print(max((1,-2,3,-4,5),default=0)) #5 print(max([1,2,3,-5,-6],key=abs)) #-6 print(max('A','a',)) #a print(max(1,2,3,-4)) #3
16.计算最小值:min(iterable,key=,default=)、min(*args,key=)
print(min(1,2,3,4,-5,key=abs)) #-5 print(min([1,-2,3,-4,5],default=0)) #-4 print(min([],default=1)) #1
17.列表和元组:list,tuple
a = range(8) b = (i for i in range(5)) #一个生成器只能取一次值 print(list(a)) #[0, 1, 2, 3, 4, 5, 6, 7] print(list(b)) #[0, 1, 2, 3, 4] print(tuple(a)) #(0, 1, 2, 3, 4, 5, 6, 7) print(tuple(b)) #()
18.列表和元组相关内置函数:reversed(接收可迭代对象,返回迭代器),slice(切片)
l = [1,-5,3,4,-2,8] a = '123' print(reversed(l)) #返回迭代器 print(list(reversed(l))) #[8, -2, 4, 3, -5, 1] print(list(reversed(a))) #['3', '2', '1'] print(l[slice(2,5,2)]) #[3,-2]
19.字符串相关:str,bytes:bytes(s,encoding='utf-8'),能在网络上传递的必须是字节
a = '你好' print(bytes(a,encoding='gbk')) #b'\xc4\xe3\xba\xc3' print(bytes(a,encoding='utf-8')) #b'\xe4\xbd\xa0\xe5\xa5\xbd' b = '世界' ret = bytes(b,encoding='utf-8') print(ret.decode('utf-8')) #世界
20.bytearray:bytearray(s,encoding='utf-8'),字节数组,修改字符串,不会改变字节数组的内存地址,适用于修改多处较长的字符串
ret = bytearray('alex',encoding='utf-8') print(id(ret)) print(ret[0]) #97 ret[0] = 65 print(ret) #bytearray(b'Alex') print(id(ret))
21.memoryview:memoryview(bytes('hello,eva',encoding='utf-8')),对bytes类型进行切片,不生成新的值
ret = memoryview(bytes('你好',encoding='utf-8')) print(ret[:3]) #memory的内存地址 print(len(ret)) #6 print(bytes(ret[:3]).decode('utf-8')) #你
22.ord:字符按照unicode转数字
chr:数字按照unicode转字符
ascii:只要是ascii码中的内容,就打印出来,不是就转换成\u
print(ord('a')) #97 print(chr(97)) #a print(ord('你')) #20320 print(chr(12345)) #〹 print(ascii('*')) #'*' print(ascii('爱')) #'\u7231'
23.rapper:用于%r格式化输出,打印字符串会把引号打印出来
print(123) #123 print('123') #123 print(repr('123')) #'123' print({'key:%r'%('value')}) #{"key:'value'"}
24.dict:字典,set:集合,forzenset:不可变集合,len:计算长度
25.enumerate:枚举,会生成序列号
for i in enumerate(range(5),1): print(i) #(1, 0) #(2, 1) #(3, 2) #(4, 3) #(5, 4)
26.all:接收一个可迭代对象,只要有一个为False,则返回False
any:接收一个可迭代对象,只要有一个为True,则返回True
print(all([1,2,3,None])) #False print(any([1,0,{},''])) #True
27.zip:拉链函数,接收多个可迭代对象,以短的为基准,进行匹配,返回一个迭代器
print(zip([0,1,2,3,4],[5,6,'a','b'])) #返回迭代器 print(list(zip([0,1,2,3,4],[5,6,'a','b']))) #[(0, 5), (1, 6), (2, 'a'), (3, 'b')] print(list(zip([0,1,2,3],[5,6,7,8],['a','b']))) #[(0, 5, 'a'), (1, 6, 'b')]
28.filter:筛选函数,前面接收函数名,后面接收可迭代对象,返回一个迭代器,只筛选结果为True的元素
map:前面接收函数名,后面接收可迭代对象,返回一个迭代器,将可迭代对象按照函数的功能进行操作并把结果返回
def func(x): return x and x.strip() ret = filter(func,['test',None,'','str',' ','END']) print(list(ret)) #['test', 'str', 'END'] def func1(n): return n**2 ret1 = map(func1,[1,2,-3,-4,5]) print(list(ret1)) #[1, 4, 9, 16, 25]
29:sorted:从小到大排序,生成一个新列表,sort:从小到大排序,直接改变原列表的顺序
l = [1,2,-3,-4,5] print(sorted(l)) #[-4, -3, 1, 2, 5] print(sorted(l,reverse=True)) #[5, 2, 1, -3, -4] print(l) #[1, 2, -3, -4, 5]